集合

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

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集合运行使用重复元素,可以通过索引来访问指定位置的集合元素。


----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值