Java—ArrayList(扩容机制)
时间:2023-07-01 04:37:00
对于ArrayList集合可能大家都不陌生,但是集合可能大家都不陌生。ArrayList集合的扩容机制大家是否了解呢?我们今天着重来看看
目录
什么场景适合?
ArrayList特点
实战演练
ArrayList扩容机制
综上所述,ArrayList的特点如下
什么场景适合?
检索更多的场景
ArrayList特点
1、ArrayList集合底层采用数据结构Object类型
2、ArrayList默认初始容量为10,扩容因子为1.5
3.建议给出估计的初始容量,减少数组扩容的次数。ArrayList集合更重要的优化策略.由于原始数组中的数据需要在扩展容量的同时复制到新数组中,但如果需要插入大量数据,赋值数组的形式效率很低,因此在大多数情况下,会使用带参结构函数进入估计容量,并提前定义容量。
4、ArrayList非线程安全
实战演练
import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List list = new ArrayList(); list.add("b");//索引下标0 list.add("d"); list.add("c"); list.add("a"); list.add("d"); //允许使用重复元素 System.out.println(list); //输出结果:[b, d, c, a, d] System.out.println(list.get(2)); //输出指定标的元素,输出结果:c list.add(1,"f");///在指定索引的标准位置添加元素 System.out.println(list); ///输出结果:[b, f, d, c, a, d],下标索引位置的元素自动向后移动 List a = new ArrayList(); a.add("123"); a.add("456"); list.addAll(2,a); ///将集合插入指定索引下标的位置 System.out.println(list);///输出结果:[b, f, 123, 456, d, c, a, d] ///在集合中首次出现的索引下获取指定元素 System.out.println(list.indexOf("d")); ///输出结果:4 ///获集合中最后一次出现的索引下获取指定元素 System.out.println(list.lastIndexOf("d"));///输出结果:7 list.remove(2); ///在指定索引下标记去除元素 System.out.println(list); ///输出结果:[b, f, 456, d, c, a, d] list.set(1,"ff"); ///在指定索引下标记修改元素 System.out.println(list); ///输出结果:[b, ff, 456, d, c, a, d] ///根据索引下标的起始位置截取一段元素,形成新的集合。截取时,包括起始索引,不包括结束时的索引 List sublist= list.subList(2,4); System.out.println(sublist);//输出结果:[456, d] System.out.println(list.size() } }
import java.util.LinkedList; import java.util.List; public class ListTest { public static void main(String[] args){ List l1 = new LinkedList(); for(int i = 0;i<=5;i ){ l1.add("a" i); } System.out.print(l1); l1.add(3,"a100"); System.out.println(l1); l1.set(6,"a200"); System.out.println(l1); System.out.print((String)l1.get(2) " "); System.out.println(l1.indexOf("a3")); l1.remove(1); System.out.println(l1); } }
输出结果:
[a0,a1,a2,a3,a4,a5]
[a0,a1,a2,a100,a3,a4,a5]
[a0,a1,a2,a100,a3,a4,a200]
a2 4
[a0,a2,a100,a3,a4,a200]
ArrayList扩容机制
ArrayList使用前不需要像数组一样提前定义大小空间,容量随使用时自动增加,为什么要使用?ArrayList的add当添加元素时,底部还需要判断集合的容量是否可以放下要添加的元素?不要直接定义固定尺寸吗?
add添加方法分为三个步骤:
①、判断集合容量是否符合添加元素
②、添加元素
③、集合长度 1
解答:
用户不需要提前定义尺寸,因为默认情况下已经定义了尺寸。事实上,有一个边界值,而不是无限增长。由于底层有扩展因子(扩展因子为1.5)当数量达到数组的百分之多时,容量就会扩大。ArrayList默认初始尺寸为10
问题:你可以思考为什么ArrayList底层扩容因子是1.5?为什么不是1.3、2.4……?
综上所述,ArrayList的特点如下
1、ArrayList集合底层采用数据结构Object类型
2、ArrayList默认初始容量为10,扩容因子为1.5
3.建议给出估计的初始容量,减少数组扩容的次数。ArrayList集合更重要的优化策略.由于原始数组中的数据需要在扩展容量的同时复制到新数组中,但如果需要插入大量数据,赋值数组的形式效率很低,因此在大多数情况下,会使用带参结构函数进入估计容量,并提前定义容量。
4、ArrayList非线程安全