【top1】List集合和HashMap集合面试文稿

集合分为两大类:一类是单列集合,一类是双列集合

单列集合

单列集合是实现Iterable接口产成的对象,支持迭代器和增强for。

1. ArrayList

特点:有序(存取有序)且可重复, 这个数组的初始长度是0,第一次添加元素的时候会初始化容量为10;在1.7之前是构造ArrayList时

就默认开辟10个空间;arrayList底层是一个Object数组结构,因为是数组结构,所以它是有索引的,因此它的查询速度很快,但是在增

删的时候,需要调整数组元素的移动,所以增删比较慢;查阅源码可以得知它存储数据到11的时候,数组会进行扩容。扩容大小是原来的

1.5倍,在整个add的过程中,数组没有对数据进行元素的判断,所以arrayList是可重复的;

2. LinkList

特点:有序(存取有序)且可重复;

LinkList是一个双向链表的结构,它存储的结构是通过节点之间的一个指向进行链接的,因此每次查询时都要从两头进行查询(离头近就

从头查离尾近就从尾查),所以查询较慢,但是增删的时候,只需要将链表头节点和尾节点指向新插入的节点即可,所以增删速度较快;

这个集合也是一个有序且可重复的集合,因为它也没有对一个对元素的判断;

LinkList的增删快,为什么不使用LinkList进行存储,因为LinkList占内存

ArrayList和LinkList有什么区别?

ArrayList在进行查询的时候,效率明显比LinkList快,LinkList在进行无规则的插入的时候效率会比ArrayList快;因为ArrayListr底层

数组的扩容是1.5倍,数据量越大,扩容的速度就越快,而链表仍需一个个断开链接和重续新链接。

3. HashSet

特点:无序且不可重复

hashSet底层是HashMap中的key进行存储的

所以就需要讲到Map集合,HashMap集合 ---------->> 转到HashMap

4. copyonwriteArrayList

注:arrayList在进行遍历时不允许增删改:会出现ConcurrentModificationException(并发修改异常)

换一个可以并发的类(copyonwriteArrayList)

双列集合

1. HashMap

1.7 之前

HashMap中1.7之前它的底层是数组+链表的结构,它的存储特点是key是无序的且不可重复的,可以存null,存储value没有特点,想存什

么就存什么;1.7的初始长度是0,初始容量是16,因为2个幂次方在位运行的情况下效率最高;扩容大小是原来的2倍,扩容时机是当存

储个数>=扩容阈值&&hash冲突(存储位置有元素),需要注意的一点是:hashMap扩容是非常损耗性能的,需要把老数组的所有元素和

新元素全部计算一次新的hash,所以如果已知需要存储的元素个数,那么最好初始化直接构建。

1.7的执行原理:

  1. 存储元素时,首先判断key是不是null,如果是则变为头节点

  2. 不是null时再根据key计算hash,根据hash和数组长度计算下标

  3. 根据计算出来的下标获取下标元素,如果获取到的元素不为null,判断hash是否相等,eq是否相等,==是否相等,如果都相等则替换value

  4. 如果不相等,根据头插法插入到链表中(hash冲突的现象)

HashMap出现的问题

  1. 线程安全问题,会丢值
  2. 会出现环链问题——原因:头插法 (这里有问题)
  3. 链表过长,导致性能变低

面试问题:

为什么一个节点存储存储12个元素

hashMap在极端情况下可以存储多少个元素不扩容?

一个节点最大存储的元素是 >=12个,存储元素的当前位置有值(hash冲突)

1.7HashMap的初始容量是16,所以15+12=27

1.8 之后

  1. 引入红黑树解决了链表过长的问题
  2. 尾插法和红黑树,解决了环链的问题

1.8 HashMap的结构是数组+红黑树,

为什么引入红黑树

解决了链表过长的问题,提升了查询效率

为什么不直接使用红黑树

  1. 节点少的时候,链表和红黑树的差距不大;
  2. 红黑树是以空间换时间
  3. 数组大于8时会变成红黑树
  4. 数组小于6时会变成链表
  5. 从8删除到7时,7是红黑树;从6增加到7时,7是链表

为什么树化值是8

因为有个算法是泊松算法分布计算得到的,hash冲突8次的概率是千万分之一

1.8 链表添加元素用的是尾插法,1.8 hashMap存储第13个值必扩容

如果数组长度<64出现红黑转换的情况,那么不会出现红黑树,而是进行数组扩容

尾插法和红黑树解决了环链的问题

2. concurrentHashMap

1.7 Segment分段锁机制

1.8 CAS + SYN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江桥诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值