java的集合类主要有两个接口派生而出,分别为:Collection和Map
Collection接口、子接口及实现类的继承数为:
1、Set集合 (不允许包含相同元素)
有三个实现类,分别为HashSet、TreeSet、EnumSet
1.1、HashSet
按照Hash算法来存储集合中的元素,因此具有很好的存取和查找性能
特点:
- 顺序与添加顺序不同,可能发生变化
- 不是同步的,多个线程如果访问同一个HashSet,同时修改时,必须用代码保持同步
- 集合元素值可以为null
当在HashSet中加入一个元素时,会调用Hashcode()方法计算hashcode的值,然后决定存储的位置
如果两个元素调用equals()返回true,hashcode不同时,会存储在不同的位置
HashSet集合判断两个元素相等的标准是:通过equals()返回true,且hashcode方法的返回值相等,所以重写equals()和hashcode()时要保证equals()返回true时,hashcode值相同
当程序把可变对象添加到HashSet后,金莲不要修改参与计算hashcode()equals()的实例变量,否则将导致hashset无法正确操作这些集合元素
1.2、LinkedHashSet类是HashSet的子类
使用链表维护了元素的插入顺序,但是存储位置还是根据hashcode值确定
1.3、TreeSet是SortesSet接口的实现类,确保元素处于排序状态
- 自然排序
- 定制排序
当一个元素加入到TreeSet中时,调用CompareTo(Object object)方法与容器中的其他对象进行比较,如果相等,则不能插入
判断两个元素是否相等的标准是:两个对象通过CompareTo(Object object)是否返回0,如果返回0则相等
重写CompareTo(Object object)规则:当equals()方法返回true时,CompareTo(Object object)必须返回0
1.4、EnumSet为枚举类设计的集合类
有序
不能加入null
Set实现类性能比较
HashSet比TreeSet性能好(特别是常用添加和查询操作时)因为TreeSet需要额外的红黑树算法维护集合元素的次序
LinkedHashSet在执行插入删除操作时比HashSet性能差,遍历时更快一些
EunmSet是性能最好的,但是只能保存同一个枚举类的枚举值作为集合元素
HashSet、TreeSet、EunmSet三个Set实现类都是线程不安全的
2、List集合(元素有序,可重复)ArrayList和vector两个实现类
- ArrayList线程不安全
- vector提供了Stack子类
3、Queue集合
3.1、PriorityQueue实现类
保存队列元素的顺序并不是安加入队列的元素,可是根据元素大小重新排序,也有两种排序方式,自然排序和定制排序
3.2、Deaue接口和ArrayDeque实现类
Deque是Queue的子接口,代表一个双端队列
不仅可以当做队列使用,还可以当做栈一样使用,提供了push()和pop()方法
3.3、LinkedList实现类
LinkedList不仅实现了List接口还实现了Deque接口,也可当做双端队列使用
内部以链表的形式存储数据,随机访问性能不好,但是插入和删除时比ArrayList和ArrayDeque性能好
Map集合(HashMap和HashTable)
两者不能保证元素的顺序一样,判断两个key相等的标准是:equals()返回true,且hashcode值也要相等
判断两个value相等的标准仅需要equals()返回true即可
HashMap和HashTable区别:
- HashMap在存在key冲突时依然有较好的性能
- HashTable是线程安全的,HashTable是线程不安全的
- HashTable不允许使用null,HashSet可以使用Null
1.1、LinkedHashMap是HashMap的子类,需要维护元素的插入顺序
1.2、TreeMap实现类,红黑树结构,根据key值进行排序
1.3、WeakHashMap实现类
与HashMap用法基本相似,区别是HashMapde的key值保留了对实际对象的强引用,意味着只要HashMap对象不被销毁,所有key所引用的对象不会被垃圾回收
WeakHashMap对key保留弱引用,只要对象中的key所引用的对象没有被其他强引用变量引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对