浅谈某些容器底层

刚开始学,稀里糊涂的写一点。。。

ArrayList

参考博客:https://www.cnblogs.com/leesf456/p/5308358.html

1、ArrayList底层的数据结构其实就是一个可变数组,数组的元素类型是Object类型,可以存放各种类型的数据,允许null的存在。

2、ArrayList继承了AbstractList抽象父类,实现了List接口(规定了List的操作规范)、RandomAccess(可随机访问)、          Cloneable(可拷贝)、Serializable(可序列化)。

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable

3、数组默认大小为10,实际元素个数默认为0。

4、当实际元素个数达到容量大小时,会进行扩容,扩容后的数组大小大约为旧数组大小的1.5倍。特殊情况:扩展的新数组大小达到最大值,则只能取最大值。

5、remove函数,会把下标到末尾的元素都向前移动一位,并把最后一个位置置为null,这样做是为了方便GC。

6、采用了Fail-Fast(快速失败)机制,面对并发的修改时,迭代器很快就会完全失败。

LinkedList

参考博客:https://www.cnblogs.com/leesf456/p/5308843.html

1、LinkedList底层的数据结构是双向链表,并且有一个头节点和一个尾节点,这样既可以从头正向遍历,也可以从尾逆向遍历。允许null的存在。

2、双向链表节点是类Node的实例,包含的成员变量:prev,next,item。prev是该节点的上一个节点,next是该节点的下一个节点,item是该节点的值。

3、get函数和addall函数都会用到node函数,node函数的作用是根据索引下标找到该结点并返回。在node函数里面有一个小的优化,首先会判断下标在前半部分还是在后半部分,在前半部分时就正向遍历,否则逆向遍历,这样就保证了最多遍历n/2个元素,节省了时间。

HashMap

参考博客:东拼西凑的看的。。。

1、HashMap底层是数组+链表+红黑树(红黑树还有待学习)实现的,数组中的每一项都是一个单向链表,允许使用null键和null值,但不保证映射的顺序。

2、数组默认大小是16,加载因子默认大小是0.75,也可以自行设定容量以及加载因子,当放入的键值对数量超过容量乘以加载因子(即阈值)的时候,就会进行扩容。

3、当对key进行hash时,如果有hash值相等的,那么就会形成一个链表,如果链表的长度超过了8,那么就会转化成红黑树,不转化会降低查询效率。

4、采用了Fail-Fast机制,通过一个modCount值记录修改次数,对HashMap内容的修改都将增加这个值。迭代器初始化过程中会将这个值赋给迭代器的expectedModCount,在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map,马上抛出异常。

HashTable

参考博客:https://blog.csdn.net/varyall/article/details/80992123

1、采用Fail-Fast机制。

2、HashTable的底层是数组+链表实现的,不允许使用null键和null值。

3、默认数组容量为11,加载因子为0.75,也可以自行设定。

4、与HashMap实现差不多,且没有红黑树的引入。

5、扩容时,新数组的长度为旧数组长度 * 2 + 1。

Hash Map与Hash Table的区别

1、HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。

2、Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap。

3、两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

4、计算hash值的不同。HashTable通过hashCode方法计算得到的hash值,就为最终的hash值;而HashMap是先通过hashCode方法计算得到一个hash值,然后再将这个hash值与右移16位之后异或,得到最终的hash值。

发布了150 篇原创文章 · 获赞 4 · 访问量 6882

猜你喜欢

转载自blog.csdn.net/Napom/article/details/104827654
今日推荐