Java集合

Java的集合类是一种特别强大的工具类,它可以用于存储数量不等的多个对象,并可以实现常用的数据结构,栈、队列等。Java集合还可以用于保存具有映射关系的关联数组。Java集合大致可分为:Set,List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。从JDK1.5以后,Java又增加了Queue体系集合,代表一种队列集合。Java集合就像一种容器,可以把多个对象放在容器里。集合类和数组不一样,数组元素既可以是基本类型,也可以是对象,而集合里只能保存对象。Java的集合类主要由两个接口派生:Collection和Map. 

Iterator也是Java集合框架的成员,主要用于遍历(迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。遍历Collection中的元素还可以用foreach循环。

一、Set接口不允许包含相同的元素,Set判断两个对象相同使用equals方法。除了这一点,几乎和Collection本身是一样的。

  1,HashSet类

  HashSet是Set接口的典型实现,大多数时候使用Set集合时是使用这个实现类。HashSet按Hash算法储存集合中的元素,因此具有很好的存取和查找性能。当向HashSet存入一个元素,HashSet会调用该对象的hashCode()方法来得到该对象的存放位置(hashCode值)。因此HashSet判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。因此,要把一个元素放入HashSet中,如果重写equals()方法,也应重写hashCode()方法。

  重写hashCode()的规则:当两个对象通过equals方法比较返回true时,这两个对象的hashCode应该相等;对象中用作equals比较标准的属性,都应该用来计算hashCode值。

boolean hashCode=(?0:1)
整形(byte,short,char,int)   hashCode=(int)f
long hashCode=(int)(f^(f>>>32))
float hashCode=Float.floatToIntBit(f)
double

hashCode=Double.doubleToLongBits(f)

hashCode=(int(f^(f>>>32))

普通引用类型 hashCode=f.hashCode()

 

  HashSet具有以下的特点:

    不能保证元素的排列顺序

    HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或2条以上的线程同时修改了HashSet集合时,必须通过代码来保证其同步。

    元素集合值可以是null

  当向HashSet中添加可变对象时,如果修改HashSet集合的对象,有可能导致该对象与集合中其他对象相等,导致HashSet无法准确访问该对象。  

  2,LinkedHashSet是HashSet的一个子类,也是根据hashCode值来决定元素的储存位置,但它同时使用链表维护元素的次序。

  3,TreeSet类

    TreeSet是SortedSet接口的唯一实现,可以保证集合元素处于排序状态。TreeSet支持两种排序,自然排序和定制排序,默认情况采用自然排序。

    自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较,然后将集合元素升序排列。

    如果试图把一个对象添加进TreeSet,则该对象必须实现Comparable接口,否则会抛出ClassCastException。而且向TreeSet中添加的应该是同一个类的对象,否则也会引发ClassCastException。

    定制排序,实现Comparator接口

  推荐HashSet和TreeSet放不可变对象。

二、List与ListIterator接口

  List是有序的集合。ArrayList和Vector作为List类的两个经典实现。

  ArrayList是线程不安全的,Vector是线程安全的,因此Vector的性能比ArraList要低。

  

 

posted @ 2016-04-11 16:15  XChaos  阅读(206)  评论(0编辑  收藏  举报