每天5道Java面试题(第11天)
  P32LocODgHJ4 2023年11月15日 49 0

1. ArrayList 和 Vector 的区别是什么?

线程安全:Vector使用了 Synchronized 来实现线程同步,是线程安全的,而

性能:ArrayList 在性能方面要优于 Vector。

扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。

2. Arraylist的初始化默认长度?

在jdk1.2到jdk1.6中的ArrayList的源码中,在构造方法上的确是创建了一个长度为10的数组。

从jdk_1.7之后,当你进行new ArrayList()的时候创建的是一个空数组初始容量就不是10了,而是一个空数组。

3. Arraylist的扩容原理?

当你第一次调用add进行添加元素的时候,会触发扩容。源码中我记得有个DEFAULT_CAPACITY常量=10。在第一次扩容的时候,会把数组长度变成10.如需要再次扩容,则扩容当前长度的1.5倍。是否再次扩容,取决于ArrayList在add之前的有效长度+1是否大于最大长度,如果大于就调用grow方法完成扩容。扩容的时候是用的位运算>>1,相当于之前容量的1.5倍。

4. 为什么要ArrayList扩容要是自身长度的1.5倍

1.5能充分利用前面已经释放的空间。如果是2的话,新容量刚刚好永远大于过去所有废弃的数组容量。

扩容容量不能太小,防止频繁扩容,频繁申请内存空间,数组频繁复制

扩容容量不能太大,需要充分利用空间,避免浪费过多空间。

所以一般情况下会选择(1, 2)之间。

5. 为什么要ArrayList扩容必须是1.5,而不是1.2,1.25,1.8或者1.75??

因为1.5 可以充分利用移位操作,减少浮点数或者运算时间和运算次数。

// 新容量计算

int newCapacity = oldCapacity + (oldCapacity >> 1);

Capacity是容量的意思。

>> 1,的数学意义就是 当前值*1.5,只不过是>>运算在计算机中更快。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   28   0   0 i++iosi++ioscici
  anLrwkgbyYZS   2023年12月30日   33   0   0 ideciciMaxideMax
P32LocODgHJ4