集合

来源:互联网 发布:神硕微营销软件怎么样 编辑:程序博客网 时间:2024/05/01 18:48

Java集合类主要是由两个接口派生而出:Collection和Map.
Collection : Set、Queue、List。
Set集合:无序,不可重复。
HashSet类
1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
2、HashSet不是同步的,如果多个线程同时访问一个HashSet,则必须通过代码来保证其同步。
3、集合元素可以是null
当向HashSet集合中存入一个元素时,HashSet会调用该对象的HashCode()方法来得到该对象的HashCode值,然后根据值决定该对象在HashSet的存储位置。
HashSet集合判断两个元素相等的标准:
两个对象通过eaquals()方法比较相等;
两个独享的HashCode()方法返回值也相等。
若有多个元素的hashCode值相同,但它们通过equals()方法返回false,则需要在一个”桶”里放多个元素,导致性能下降。
规则:通过equals()方法返回true时,对象的hashCode值相同。

LinkedHashSet类
HashSet的子类。
也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。
LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet,但在迭代访问Set里的全部元素时将有很好的性能。

TreeSet类
是SortedSet接口的实现类,可以保证集合元素处于排序状态。
是根据元素实际值的大小来进行排序
采用红黑树的数据结构来存储集合元素。
两种排序方法:自然排序和定制排序,默认是自然排序。
自然排序:
提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法。例如:obj1.compareTo(obj2),该方法返回0,则表明两个对象相等;返回正数,obj1>obj2;返回负数,相反。相等就取法添加到TreeSet集合中去。
向TreeSet添加元素时,只有第一个元素无须实现Comparable接口,后面添加的元素都必须实现。
如果希望TreeSet能正常运作,只能添加同一种类型的对象。
规则:如果两个对象通过equals()方法返回true时,通过compareTo(Object obj)方法比较返回0。
定制排序:
提供了一个Comparable接口,包含一个int compare(T o1,T o2)方法。

EnumSet类
是一个专门为枚举类设计的集合类,其中所有元素都必须制定枚举类型的枚举值,还枚举值在创建EnumSet时显式或隐式地指定。
也是有序的,以枚举值在Enum类内定义顺序来决定集合元素的顺序。
内部以向量形式存储,因此占用内存很小,而且运行效率很好。
EnumSet集合不允许加入null元素
HashSet、TreeSet、EnumSet都是线程不安全的。

List集合:有序,可重复。
ArrayList和Vector类都是基于数组实现的List类,封装了一个动态的、允许再分配的Object[]数组。
它们用法上几乎相同,但Vector是一个古老的集合,JDK1.0就有了,所以提供了一些方法名很长的方法。通常尽量少使用Vector实现类。
区别:
ArrayList是线程不安全的,性能较线程安全的Vector好。

Queue集合
Queue:先进先出。队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。
PriorityQueue实现类
保存队列元素的顺序是按队列元素的大小进行重新排序。违反队列的基本规则:先进先出。
不允许插入null值
自然排序和定制排序。

Deque接口和ArrayDeque实现类
Deque接口是Queue接口的子接口,代表了一个双端队列。
ArrayDeque和ArrayList两个实现类实现机制基本相似,封装了一个动态的、允许再分配的Object[]数组。
ArrayDeque可被当成“栈”来使用,push,peer,pop,也可当作队列使用,offer,peek,poll。

LinkedList实现类:既是线性表,又是队列,还是”栈”
是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之源,也实现了Deque接口,可以被当成双端队列来使用,因此既可以被当成”栈“使用,又可以当成队列使用。
内部以链表的形式来保存集合中元素,因此随机访问集合元素性能较差,但在插入,删除时性能较为出色。ArrayDeque和ArrayList内部以数组的形式。(数组以一块连续内存去来保护所有的数组元素,因此随机访问集合元素性能较好。)

Map
用于保存具有映射关系的数据。因此保存这两组值,key和value,key不允许重复,equals方法返回false。
Map包括一个内部类Entry,该类封装了一个key-value对。

HashMap和Hashtable实现类
关系类似于ArrayList和Vector,HashTable是一个古老的实现类。
区别:
Hashtable是一个线程安全的Map实现,HashMap相反,因此性能较好。但如果有多个线程访问同一个Map对象时,使用Hashtable实现类会更好。
Hashtable不允许null作为key和value,会引发空指针异常;但HashMap可以使用null作为key或value.
由于HashMap的key不能重复,所以HashMap最多只有一个key为null,可以多个value为null。
为了成功地在HashMap、Hashtable中存储、获取对象,用作key的对象必须实现hashCode()方法和equals()方法。
判断key相等:
两个key通过equals()方法返回true,hashCode值也相等。
判断value:只需要两个对象通过equals()方法返回true即可。
与HashSet类似,尽量不要使用可变对象作为key,如果使用了,则尽量不要在程序中修改作为key的可变对象。

LinkedHashMap实现类
也是使用双向链表来维护key-value对的顺序,该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一致。

TreeMap实现类
是SortedMap接口的实现类。
TreeMap就是一个红黑树数据结构(只对key排序)。
自然排序(实现Comparable接口)和定制排序(传入一个Comparator对象)。
判断key相等:两个key通过compareTo()方法返回0。
Set和Map关系十分密切,java源码就是先实现了HashMap、TreeMap等集合,然后通过包装一个所有的value都为null的Map集合实现了Set集合类。

WeakHashMap实现类
与HashMap用法基本类似。不同的是HashMap的key保留了对实际对象的强引用,只要HashMap不销毁,所有key所引用的对象就不会被垃圾回收,HashMap也不会自动删除这些key所对应的key-value对。而WeakHashMap的key只保留了对实际对象的弱引用。

IdentityHashMap实现类
与HashMap基本类似,允许使用null作为key和value。区别:
IdentityHashMap当且仅当两个key严格相等(key1 == key2)时,才认为两个key相等。

EnumMap实现类
不允许使用null作为key,但允许使用null作为value。

操作集合的工具类:Collections
提供了大量方法对集合元素进行排序、查询、和修改等操作,还提供了将集合对象设置为不可变类、对集合对象实现同步控制等方法。
同步控制:提供了多个synchronizedXxx()方法,该方法可以指定集合包装车工线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。
HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是线程不安全的。
例:Map m = Collectons.synchronizedMap(new HashMap());

原创粉丝点击