【面试:基础篇06:ArrayList扩容机制】

简介: 【面试:基础篇06:ArrayList扩容机制】

【面试:基础篇06:ArrayList扩容机制】

01.几种初始化容量情况:

01.无参构造

无参构造默认容量大小为0

02.有参构造

指定大小

根据传入集合的大小

02.使用add方法时容量的变化:

// add方法扩容
List<Integer> L=new ArrayList<Integer>();
Class<? extends List> strClass = L.getClass();
Field field = strClass.getDeclaredField("elementData");// 私有属性elementData存放的是容量的大小
field.setAccessible(true);// 这句的作用是忽略访问控制符
int len = 0;
System.out.println("当有0个元素时"+"这个ArrayList的容量为:"+len);
for (int i=0;i<100;i++) {
    L.add(i);
    Object[] elementData = (Object[]) field.get(L);
    if (elementData.length!=len){
        System.out.println("当有"+(i+1)+"到"+elementData.length+"个元素时"+"这个ArrayList的容量为:"+elementData.length);
        len=elementData.length;
    }
}

结果

当有0个元素时这个ArrayList的容量为:0
当有1到10个元素时这个ArrayList的容量为:10
当有11到15个元素时这个ArrayList的容量为:15
当有16到22个元素时这个ArrayList的容量为:22
当有23到33个元素时这个ArrayList的容量为:33
当有34到49个元素时这个ArrayList的容量为:49
当有50到73个元素时这个ArrayList的容量为:73
当有74到109个元素时这个ArrayList的容量为:109

可以看出初始化容量为0,第一次扩容是10,之后每次扩容都是其容量的1.5倍(准确是 当前容量>>>1 + 当前容量)

03.使用addAll方法时容量的变化:

情况一:

// addAll扩容 情况一:
List<Integer> L=new ArrayList<>();
L.addAll(Arrays.asList(1,2,3,4,5));

Class<? extends List> strClass = L.getClass();
Field field = strClass.getDeclaredField("elementData");// 私有属性elementData存放的是容量的大小
field.setAccessible(true);// 这句的作用是忽略访问控制符
Object[] elementData = (Object[]) field.get(L);
System.out.println("这个ArrayList的容量为:"+elementData.length);

结果

这个ArrayList的容量为:10

可以看出如果初始化容量为0时 添加的元素少于10 则扩容还是为10

情况二:

// addAll扩容 情况二:
List<Integer> L=new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
L.addAll(Arrays.asList(11,12,13,14,15,16));

Class<? extends List> strClass = L.getClass();
Field field = strClass.getDeclaredField("elementData");// 私有属性elementData存放的是容量的大小
field.setAccessible(true);// 这句的作用是忽略访问控制符
Object[] elementData = (Object[]) field.get(L);
System.out.println("这个ArrayList的容量为:"+elementData.length);

结果

这个ArrayList的容量为:16

这时容量大小为16,而不是正常以为15或者22,因为==addAll有特殊的扩容规则==:扩容的大小 是 初始化的容量大小的1.5倍的大小 与 增加后所有元素的容量的大小 的 较大值,这里 初始化容量是10 扩容后是15,而增加后的元素是16 所有这里容量大小为16

目录
相关文章
|
3月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
3月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
15天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
35 5
|
15天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
18天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
41 1
|
20天前
|
监控 架构师 Java
从蚂蚁金服面试题窥探STW机制
在Java虚拟机(JVM)中,垃圾回收(GC)是一个至关重要的机制,它负责自动管理内存的分配和释放。然而,垃圾回收过程并非没有代价,其中最为显著的一个影响就是STW(Stop-The-World)机制。STW机制是指在垃圾回收过程中,JVM会暂停所有应用线程的执行,以确保垃圾回收器能够正确地遍历和回收对象。这一机制虽然保证了垃圾回收的安全性和准确性,但也可能对应用程序的性能产生显著影响。
18 2
|
23天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
2月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
65 8
|
27天前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环