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要低。