网站首页> 文章专栏> ArrayList与Vector与 HashMap在JDK1.7,JDK1.8的扩容机制有什么不同?
ArrayList与Vector与 HashMap在JDK1.7,JDK1.8的扩容机制有什么不同?
路人王 天津 126 1 1

一、ArrayList与Vector相同点

1.ArrayList和Vector都是继承了相同的父类和实现了相同的接口AbstractList
extends AbstractList implements List, Cloneable, Serializable, RandomAccess
2、底层都是数组(Object[])实现的
3、初始默认长度都为10。

二、ArrayList与Vector不相同点

1、同步性(Synchronization):Vector中的public方法多数添加了synchronized关键字、以确保方法同步、也即是Vector线程安全、ArrayList线程不安全。
2、扩容(Resize):ArrayList以1.5倍的方式在扩容、Vector 当扩容容量增量大于0时、新数组长度为原数组长度+扩容容量增量、否则新数组长度为原数组长度的2倍。
3、性能(Performance):由于第一点的原因、在性能方便通常情况下ArrayList的性能更好、而Vector存在synchronized 的锁等待情况、需要等待释放锁这个过程、所以性能相对较差。
4、快速失败(fail-fast):Vector 的 elements 方法返回的 Enumeration 不是 快速失败(fail-fast)的。而ArrayList是快速失败(fail-fast)

3.1 考题

下列关于Vector,ArrayList,LinkedList的说法正确的是(C)
A.Vector是以数组的形式存在于内存中的,ArrayList和LinkedList是以链表的形式存在于内存中的。
B.Vector,ArrayList,LinkedList三者都是线程同步的。
C.ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
D.Vector中存储元素是无序的,而ArrayList和LinkedList中的元素都是按顺序存储的。

三、HashMap在JDK1.7的时候

1.HashMap继承了AbstractMap类,实现了Map,Cloneable,Serializable接口
2.HashMap的容量,默认是16
3.HashMap的加载因子,默认是0.75
4.当HashMap中元素数超过 容量*负载因子 时,HashMap会进行扩容。
5.transient Node<K,V>[] table;
6.数组+链表的数据结构,使得HashMap可以较为高效的管理每一个节点
7.关于Node数组 table,table在第一次往HashMap中put元素的时候初始化
8.如果HashMap初始化的时候没有指定容量,那么初始化table的时候会使用默认的DEFAULT_INITIAL_CAPACITY参数,也就是16,作为table初始化时的长度。
9.table在HashMap扩容的时候,长度会翻倍。

四、HashMap在JDK1.8的时候

1.JDK1.8开始,在HashMap里面定义了一个常量默认为8链表大于8,链表将会考虑改为红黑树。
2.数组大于64进行扩容,table翻倍的扩容。

java  

评论

评论  分享  打赏