结构:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
区别:
类 | 是否有序 | 是否线程安全 | 是否允许重复 | 是否允许空值 | 常用情景 | 描述 | 总结 |
LinkedList | 有序 | 否 | 是 | 是 | 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 | LinkedList基于双向链表的数据结构 | 若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数 据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。 |
ArrayList | 有序 | 否 | 是 | 是 | 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针 | ArrayList是实现了基于动态数组的数据结构 | |
Vector | 有序 | 是 | 是 | 是 | 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势
| ||
Stack | 有序 |
|
|
| Stack继承自Vector,实现一个后进先出的堆栈 | ||
Set |
|
| 否 |
| Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素 | ||
HashTable | 无序 | 线程安全 | 是 | 否 | 任何作为key的对象都必须实现hashCode和equals方 法,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相 同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如 果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希 表的操作 | ||
HashMap | 无序 | 线程安全 | 是 | 是 | HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低 | ||
WeakHashMap |
|
|
|
| WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收 | ||
TreeMap |
|
|
|
| HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的) |
这里在解释下ArrayList 和 linkedList区别
ArrayList 从名字中可以看出是基于Array实现的,Array效率很高可是大小固定,并且可以通过下标index直接获取元素,不用一个个遍历,所有ArrayList做随机访问效率高些,若果是频繁插入、删除操作,ArrayList就需要频繁的创建临时Array,删除选中的元素,再把删除后的元素放到新的Array中去,插入同样如此,所以效率较LinkedList低。
LinkedList从名字中可以看出是基于Link实现(链表),大家知道链表中有一个指针,取元素是通过指针当前位置然后向左或者向后一个一个查找的,所以随机访问慢,但是如果是频繁插入元素,或者删除某个元素的效率会高些,因为这时我只用移动下指针就可以了。