java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈,队列等。除此之外,java集合还可用于保存具有映射关系的关联数组。java集合大致可分为Set,List,Queue和Map四种体系,其中Set代表无序,不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。java5又增加了Queue体系集合,代表一种队列集合实现。

java集合就像一种容器,可以把多个对象,丢进该容器中,在java5之前,java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理。从java5增加了泛型以后,java集合可以记住容器中对象的数据类型,从而可以编写出更简洁,健壮的代码。

 

集合类和数组不一样,数组元素即可以是基本类型的值,也可以是对象,而集合里只能保存对象。

java的集合类主要由两个接口派生而出:Collection和Map  Collection和Map是java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

 

Collection

Collection接口是List,Set, Queue接口的父接口,该接口里定义的方法即可用于操作Set集合,也可用于操作List和Queue集合。Collection接口里定义了如下操作集合元素的方法。

boolean add(Object o):该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true.

boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true

void clear():清除集合里的所有元素,将集合长度变为0.

boolean contains(Object o):返回集合里是否包含指定元素。

boolean containsAll(Collection c):返回集合里是否包含集合。

boolean isEmpty():返回集合是否为空,当集合长度为0时返回true,否则返回false

Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。

boolean remove(Object o):删除集合中的指定元素o  当集合中包含了一个或多个元素o时,该方法只删除第一个符合条件的元素,该方法将返回true 

boolean removeAll(Collection c):从集合中删除集合c里包含的所有元素(相当于调用该方法的集合减集合c),如果删除了一个或一个以上的元素,则返回true

boolean retainAll(Collection c):从集合中删除集合c里不包含的元素

int size():该方法返回集合里元素的个数

Object[] toArray():该方法把集合转换成一个数组,多有的集合元素变成对应的数组元素

 

 

Set集合

Set集合类似于一个罐子,Set集合通常不能记住元素的添加顺序。Set集合与Collection基本相同,灭有提供额外的方法。实际上Set就是Collection,只是行为略有不同,Set不允许包含重复元素。

这些只是同样适用于HashSet  TreeSet 和 EnumSet三个实现类,只是三个实现类还各有特色。

 

HashSet类

HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找功能,

HashSet具有一下特点

1:不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发送变化。

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

3:集合元素值可以是null

当想HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals()方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同的位置,依然可以添加成功。

也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。

当把一个对象放入HashSet时,如果需要重写该对象对应类的equals()方法,则也应该重写其hashCode()方法。规则是:如果两个对象通过equals()方法比较返回true,这两个对象的hashCode值也应该相同。

如果两个对象通过equals()方法比较返回true,但这两个对象的hashCode()方法返回不同的hashCode值时,这将导致HashSet会把这两个对象保存早Hash表的不同位置,从而使两个对象都可以添加成功,这就与Set集合的规则冲突了。

如果两个对象的hashCode()方法返回的hashCode值相同,但它们通过equals()方法比较返回false时将更加麻烦,因为两个对象的hashCode值相同,HashSet试图把它们保存在同一个位置,但又不行,所以实际上会在这个位置用链式结构来保存多个对象;而HashSet访问集合元素时也是根据元素的hashCode值来快速定位的,如果HashSet中两个以上的元素具有相同的hashCode值,将会导致性能下降。

 

如果要把某个类的对象保存到HashSet集合中,重写这个类的equals()方法和hashCode()方法时,应该尽量保证两个对象通过equals()方法比较返回true时,它们的hashCode()方法返回值也相等。

 

 

linkedHashSet类

HashSet还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。

LinkedSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但LinkedHashSet依然是HashSet,因此它依然不允许集合元素重复。

 

TreeSet类

TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。与HashSet集合相比,TreeSet还提供了如下几个额外的方法。

Comparator comparator():如果TreeSet采用了定制顺序,则该方法返回定制排序所使用的Comparator;如果TreeSet采用了自然排序,则返回null

Object first():返回集合中的第一个元素。

Object last():返回集合中的最后一个元素

Object lower(Object e):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参开元素不需要是TreeSet集合里的元素)

Object higher(Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素)

 

treeSet并不是根据元素的插入顺序进行排序的,而是根据元素实际值的大小来进行排序的。

与HashSet集合采用hash算法来决定元素的存储位置不同,TreeSet采用红黑树的数据结构来存储集合元素。那么TreeSet进行排序的规则是怎样的呢?TreeSet支持两种排序方法:自然排序和定制排序,在默认情况下,TreeSet采用自然排序。

如果希望TreeSet能正常运作,TerrSet只能添加同一种类型的对象。

当把一个对象加入TreeSet集合中时,TreeSet调用该对象的compareTO(Object obj)方法与容器中的其他对象比较大小,然后根据红黑树结构找到它的存储位置。如果两个对象通过compareTo(Object obj)方法比较相等,新对象将无法添加到TreeSet集合中。

对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较是否返回0 如果通过比较返回0,则认为它们相等;否则就认为它们不相等。

 

 

List集合

List集合代表一个元素游戏,可重复的集合,集合中的每个元素都有其对应的顺序索引。List集合运行使用重复元素,可以通过索引来访问指定位置的集合元素。

 

 

Queue集合

Queue用于模拟队列这种数据结构,队列通常是指“先进先出”的容器,队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素.

 

posted on 2016-02-29 17:14  所谓荣耀  阅读(197)  评论(0编辑  收藏  举报