`
senton
  • 浏览: 200497 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

深入探讨java集合类

    博客分类:
  • J2SE
阅读更多
不同的集合在添加对象时的处理是不同的:
Set:不允许重复,且没有指定顺序,HashSet在添加新对象时,首先比较对象的hashcode值,如果相等再比较两个对象是否相等,如果是则不添加,否则添加,并且按hashCode值排序.
List:允许重复且有指定顺序,ArrayList和Vector都是这样的类,如果你不指定顺序它就默认按先后顺序排序.
下面是两个简单的例子:
(1):
import java.util.*;
public class TestTree  {
    public static void main(String[] args)   {
        TreeSet ts = new TreeSet(new MyComparator());
        ts.add(new Person(33,160));
     ts.add(new Person(23,170));
     ts.add(new Person(45,180));
     Iterator it = ts.iterator();
     while(it.hasNext()){
        System.out.println (it.next());
     }
    }
}
//定义一个比较器类,实现Comparator接口.
class MyComparator implements Comparator  {
    public int compare(Object obj1,Object obj2){
        Person p1 = (Person)obj1;
        Person p2 = (Person)obj2;
        return (p1.age > p2.age ? 1 : (p1.age == p2.age ? 0 : -1));
    }
}

class Person {//implements Comparable
    public int age;
    public int height;
    public Person(int age,int height){
       this.age = age;
       this.height = height;
    }
    public String toString(){
       return (this.age + " : " + this.height);
    }
    
    //重写Comparable接口的compareTo方法
    /*
    public int compareTo(Object obj){
       if(obj instanceof Person){
          Person p = (Person)obj;
          return (this.height > p.height ? 1 : (this.height == p.height ? 0 : -1));
       }
       return 1;
    }*/
}

(2).
import java.util.*;

public class TestHashSet{
    public static void main(String[] args){
        HashMap<String,String> hm = new HashMap<String,String>();
        hm.put("a","aaa");
        hm.put("b","bbb");
        hm.put("c","ccc");
        
        //第一种取值的方法
        Set s = hm.keySet();
        Iterator e = s.iterator();
        while(e.hasNext()){
            Object o = e.next();
            System.out.println (o + ":" + hm.get(o));
        }
        
        //第二种方法
        Set<Map.Entry<String,String>> ss = hm.entrySet();
        for(Map.Entry<String,String> me : ss){
            System.out.println (me.getKey() + ":" + me.getValue());
        }
        
        //jdk1.5 里面新增的泛型使用示例,指明hs集合里面只能存Student对象。
        HashSet<Student> hs = new HashSet<Student>();
        hs.add(new Student("zhangsan",30));
        hs.add(new Student("zhangsan",30));
        
        //hs.add(new String("这样添加一个对象会出错误"));
        
        //尽管调用了两次add方法,但是因为Student类里面重写了equals方法。
        //所以最终hs的大小是1,
        System.out.println (hs.size());
        
        //想取出hs集合里面的对象时可以象下面这样,如此一来在循环里面去数
        //据时就可以指定用Student类型的对象来接收Iterator里面的对象了。
        /*
        Iterator<Student> itr = hs.iterator();
    while(itr.hasNext()){
        Student obj = itr.next();
        System.out.println (obj);
    }
    */
       
    //jdk1.5 里面for循环的增强,此方法和C#里面的foreach语法相似,只不过
    //在java里面是用 ":" ,而在C#里面是用 "in"。":"后面的只能是数组或者集合。如果
    //循环体类的数据对象名或者其他数据类型在外面定义就会报编译错误。
    for(Student stu : hs){
        System.out.println (stu);
    }
       
    //下面打印出两个Student对象的hashCode值,结果是相等的。
    //因为Student类里面重写了hashCode方法。
    System.out.println (new Student("zhangsan",19).hashCode());
    System.out.println (new Student("zhangsan",19).hashCode());
    }
}
 
class Student{
    private String name;
    private int age;
    
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    
    //jdk1.5里面新增的标注:@Override指明要覆盖父类的方法。注意:@Override的O是大写。
    @Override
    public boolean equals(Object obj)
        //判断传进来的Object对象是不是Student类型的对象
        if(obj instanceof Student) {
            Student stu = (Student)obj;
            return ((this.name.equals(stu.name)) && (this.age == stu.age));
        }
        return false;
    }
    
    public int hashCode(){
        return (this.age + this.name.hashCode());
        //注意基本数据类型没有哈希码值。
    }
    
    public String toString(){
        return (this.name + ":" + this.age);  
    }

}
分享到:
评论

相关推荐

    Java:深入探讨Iterator模式

    java.util包中包含了一系列重要的集合类。本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕。

    Java 集合框架高难度进阶版面试题集锦解析

    提供了20道高难度的Java集合框架面试题及详细答案解析,涵盖了List、Set、Map、Iterator、Collections类等关键概念和操作方法。从数据结构、线程安全性、性能等多个角度深入探讨了集合框架的不同实现和应用场景。...

    java高级编程必须知道的集合详细讲解

    集合框架的性能和选择: 探讨集合框架中各种实现类的性能比较,讲解如何根据需求选择合适的集合类型。介绍优化集合性能的方法。 集合类型: 详细介绍集合框架中的各种集合类型,包括 List、Set、Map 以及 Queue 等。...

    Java源码分析:深入探讨Iterator模式

    本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕。 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代...

    JAVA基础课程讲义

    字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分类 96 Error 97 Error和Exception的区别 97 Exception 97 ...

    Java数据编程指南

    在相互的基础上,前四部分深入广泛地探讨了各种Java技术,它们可以组合或单独用于为各种数据访问与处理情况开发实际方案。第五部分中的案例研究包括了一些实际的围绕数据的应用程序范例。 本书只需要读者具有Java...

    超爽的自学课件(java)

    最后,我们还会深入讨论新型和改进过的Java 1.2集合库。 &lt;br&gt;(9) 第9章:违例差错控制 Java最基本的设计宗旨之一便是组织错误的代码不会真的运行起来。编译器会尽可能捕获问题。但某些情况下,除非进入运行期...

    Java核心技术.第9版.卷1.卷2.英文版

    Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt...本书对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例代码,能够帮助读者充分理解Java语言并灵活应用。

    Java虚拟机

    第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁...

    完成Java面向对象程序设计实验课的心得体会.doc

    面向对象编程思想就象数学上的一些概念,如:空间、群、环、域等原始的编程思 想就象古典数学,人们只在一个集合上探讨问题,没有系统的方法〔即运算〕定义,于 是仁者见仁、智者见智,这样在一定程度上造成了理论...

    基于java的搜索引擎系统设计与实现毕业设计(项目报告+开题报告+答辩PPT+源代码+数据库+讲解视频)

    基于Java的搜索引擎的设计与实现 我们处在一个大数据的时代,伴随着网络信息资源的庞大,人们越来越多地注重怎样才能快速有效地从海量的网络信息中,检索出自己需要的、潜在的、有价值的信息,从而可以有效地在日常...

    基于java下的搜索引擎的设计与实现.doc

    因为搜索引擎这一技术很好的解决了用户搜索网上大量信息的难题,所以在当今的社会,无论是发展迅猛的计算机行业,还是作为后起之秀的信息产业界,都把Web搜索引擎的技术作为了争相探讨与专研的方向。 搜索引擎的...

    spring.net中文手册在线版

    26.3.深入探讨 26.3.1.其它类型的通知 26.3.1.1.前置通知 26.3.1.2.后置通知 26.3.1.3.异常通知 26.3.1.4.引入(mixins) 26.3.1.5.通知链 26.3.1.6.配置通知 26.3.2.使用特性定义切入点 26.4.The Spring.NET AOP ...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

Global site tag (gtag.js) - Google Analytics