集合面试总结

概念

        单例集合,list有序、可重复(arrayList、linkedList);set无序、不可重复(hashSet、treeSet)

        双列集合,map键值对(hashMap、concurrentHashMap)

问题

为什么数组索引从0开始?从1开始不行吗?

数组需要一片连续的空间,可以根据寻址公式快速找到对应的内容,寻址公式为:数组首地址+索引*储存数据类型大小。

如果从1开始,寻址公式会一个减法操作,引响cpu性能。

ArrayList与LinkedList的区别是什么?

ArrayList需要一片连续的存储空间,底层为动态数组,可以根据索引进行查询,比linkedList查询快。新增元素,如果大于数组长度,数组会以1.5倍进行扩容,每次扩容都需要新开辟新数组,把就数组赋值到新数组,在执行新增。删除元素,如果为中间元素,数组某部分需要整体移动,比linkedList增删慢。

LinkedList不需要一片连续的空间,底层为双向链表,每次查询都需要从头逐个进行遍历,比arrayList查询慢。新增元素,只需要断开两边,然后两边指向新元素即可。删除元素,只需要断开两边,重新指向即可,比arrayList增删快。

HashMap实现原理?

底层为hash表数据结构。jdk1.7为数组+链表,jdk1.8为数组+链表+红黑树。插入元素时:会先计算key的hashCodel值,根据hashCode值计算数组下标,若数组下无值,直接插入;若数组下方有值,则会进行key比较,若相同,直接覆盖值;不同,则会在链表后插入值;若链表长度大于8,且数组长度大于64,链表会转为红黑树。如果红黑树小于6,则会转为链表。当put后大于阈值,阈值为负债因子0.75 * 数组的长度,则会进行扩容,数组长度会扩容为原来的2倍,然后对元素进行迁移。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值