Arrlist、HashMap 重要知识
研究代码(不想看可以忽略推荐自己查看源码)
1、看是否线程安全。
在代码中搜索synchronized这个关键字,程序中一般来说会有相应说明,另外检查是否有函数被这个关键字修饰
2、英文好的情况下 读取前边的说明
3、检查存储结构。
4、检查构造器,
5、检查重要的api
面试必问
linkedList 与ArrayList的区别 :
基于链表
一个基于数组
ArrayList
我上大学的时候研究过这个源码,(证明读过大学,也可以给自己留余地)
以添加过程为例说明存储的结构。
1 检查容量,如果还没有任何数据,则给一个初始容量,如果我没有记错的情况下,应该是10.
2、如果有数据,则判断容量是不是够大(需要的空间大于容量的时候,负载因子/加载因子=100%),如果不够大则扩容。
扩容后的大小是原来的1.5倍,源代码是原来的容量加上原容量右位移1位,这些写的好处是提高速度,我看了这个代码以后,
我在项目当中也经常使用位运算。扩容后并不是在原来的数组之上添加,而是生成一个新的数组,把原来的数组内容复制到新的数组当中。
这里边使用的是Arrays的copy 方法,这个方法其实是调用了System.arraycopy方法。
LinkedList
线程不安全。
扩容机制,没有。
存储的机制基于链表。
应用场景:
LinkedList :频繁的插入删除操作的时候;
ArrayList:数据相对稳定的情况下。
为什么ArrayList插入删除慢? 涉及到频繁的数组的拷贝或者重新申请内存等。
HashMap
线程不安全。
存储结构:
存放的是键值对Entry类型数组。这个里面包含的元素有key 的hash值,key 、value 和指向下个元素的指针。
默认的初始容量是16,代码里边写的是1右位移4位。
存放的数据并不是无限的,最大数量是:1 << 30;
默认的加载因子是0.75;
红黑树与链表相互转换的阈值是6 和 8.