类型 默认容量 加载因子[1] 扩容增量 底层实现 是否安全及同步方式
Vector 10 1 2倍 Object数组 安全,synchronized
ArrayList 10 1 1.5倍(>>1) Object数组 线程不安全
LinkedList 无 1 无(1个1个加) 链表 线程不安全
HashSet 16 0.75 2倍 HashMap<E,Object> 线程不安全
HashMap 16 0.75 1倍 存放链表的数组[2]
Map.Entry 线程不安全
HashTable 11 0.75 2倍+1 存放链表的数组[2]
HashTable.Entry 线程安全,synchronized
【1】:加载因子:扩容因子=已存容量/现有容量。0.75表示当使用容量达到3/4时扩容。
【2】HashMap中,都是是以链表实现的。在HashMap中,先对key值求hash,然后根据hash确定存放位置(内存中占用的地址),一般情况下hash值不会相同。但当数据量大是,hash值(内存存放地址)就会相同,这时会以链表的形式存放新的数据。
List(列表)
List的特征是其元素以线性方式存储,集合中可以存放重复对象。
List接口主要实现类包括:
ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。
LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。
对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。
两种列表的区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
总结:ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
HashSet和HashMap的区别
这里涉及到HashSet的本质:(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品
(2)HashSet以对象作为元素,而HashMap以(key-value)的一组对象作为元素,且HashSet拒绝接受重复的对象.HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图。
HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。
往hashset中插入对象其实只不过是内部做了
HashMap和HashTable的区别
二者的区别类似与ArrayList和Vector的区别,在实现,扩容等方面,HashMap和HashTable都是相同的,不同的是线程是否安全(是否加锁),线程安全的性能会下降。
注意!
在jdk1.8之后,HashMap的储存机制发生改变:数组table中的链表长度大于8时,自动转换为红黑树!