集合(ArrayList,HashMap,HashSet)扩容

CVTE一面

  • 集合扩容问题
  • hasMap \ hasTable
  • 数据库引擎InnoDB MyASM
  • MongoDB 和 MySql 的区别 为什么选用MongoDB
  • 两个有序链表合并成一个有序列表
  • 根据项目提问

感受:面试官很耐心,一直在引导我回答问题,无奈之前学过的东西实在是忘记的太多了。从现在开始要崛起了。加油!!


集合扩容:

ArrayList :


  • 线性表存储
  • 默认开辟大小为10的空间
  • 当默认开辟空间不够的时候(比如此时需要add第11个元素),则以原数组的长度长度的1.5倍+1 : (原长度*3)/2+1
  • 重新确定数组容量,然后将第11个元素添加进去,申请空间并赋值
  • 线程不同步(非线程安全):如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步,所以为了保证同步,最好的办法是在创建的时候完成加锁,保证线程同步。

List list = Collections.synchronizedList(new ArrayList(…));

HashMap:


  • 存储结构hash表类似于桶:线性表+链表+红黑树
  • 默认初始化容量16,装载因子默认为0.75

衡量hashMap主要性能的两个指标 :初始化容量,装载因子

初始化容量:是创建hash表的容量;
装载因子:是hash表在其容量自动增长之前,所能到达的多满的一种尺度,衡量的是hash表的空间使用程度。
    衡量描述:装载因子越大,散列表装填程度越高;反之越小
    实际情况:对于链表法的散列表来说
装载因子越大,则空间利用率越高,但是查找效率减少,原因是在桶内链表中进行查找需要便利整个链表。
装载因子越小,则散列程度越高,空间利用率越低,对空间造成严重浪费。
  • 极限容量计算(桶存储数据达到该容量的时候进行扩容)
初始容量最小的2的n次方的值 * 装载因子  
eg: 默认初始容量16(桶的个数),装载因子0.75,则极限容量计算:
            2^4 = 16 
            16 * 0.75 = 12 (极限容量)
eg:默认初始容量为20,装载因子不变0.75 ,极限容量计算:
            2^5 = 32 < 32 --->32
            32 * 0.75 = 24 (极限容量)
为什么扩容?
答 : 保证hashMap的效率。
原因:随着hashMap中存储的元素越来越多,则发生碰撞的概率就会越来越大,链表的长度也会越来越长,那么就会hashMap的效率就会减低,为了保证hashMap的效率,则,就需要在存储容量达到一定值的时候进行扩容处理。

什么时候扩容?
答 : 当达到临界值的时候进行扩容处理。
      临界值:容量*装载因子   
      eg : 容量:16  装载因子:0.75  ===>  临界值为:16 * 0.75 = 12
            即:当初始容量为16,装载因子为0.75hashMap                                      存储容量
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值