古镇免费网站建设最好看免费观看高清大全猪蜜蜜剧本
web/
2025/10/4 15:18:39/
文章来源:
古镇免费网站建设,最好看免费观看高清大全猪蜜蜜剧本,网站制作学习,织梦手机网站分亨链接怎么做适用于什么场景#xff1f;
检索比较多的场景#xff0c;例如学生成绩管理系统#xff0c;老师对学生的成绩进行排名或查询操作 ArrayList有哪些特点#xff1f;
1、ArrayList集合底层采用了数组数据结构#xff0c;是Object类型
2、动态数组。ArrayList的默认初始容量…适用于什么场景
检索比较多的场景例如学生成绩管理系统老师对学生的成绩进行排名或查询操作 ArrayList有哪些特点
1、ArrayList集合底层采用了数组数据结构是Object类型
2、动态数组。ArrayList的默认初始容量为10扩容因子为1.5数组长度随着容量的增长数组长度。但是数组的长度并不会随着ArrayList的容量立即缩小除非显示的调用 trimToSize 方法
3、建议给定一个预估计的初始化容量减少数组扩容的次数这是ArrayList集合比较重要的优化策略.因为在在扩容的同时需要将原来数组中的数据复制到新数组里但如果要插入大量数据时赋值数组的形式效率很低所以大多数情况下会使用带参构造函数传入一个预估计容量提前定义好容量。
4、ArrayList是非线程安全的
单独看这些特点我们还是回觉得有些枯燥结合具体场景我们来分析分析 实战演练
import java.util.ArrayList;
import java.util.List;public class ListTest {
public static void main(String[] args) {ListString list new ArrayListString();list.add(b);//第一个索引下标0list.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)); //输出指定下标的元素输出结果clist.add(1,f);//在指定索引下标位置添加元素System.out.println(list); //输出结果[b, f, d, c, a, d]原来下标为1和1之后的下标索引位置的元素自动向后移动ListString a new ArrayListString();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));//输出结果7list.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]//根据索引下标的起始位置截取一段元素形成一个新的集合截取的时候包含开始的索引不包含结束时的索引ListString sublist list.subList(2,4);System.out.println(sublist);//输出结果[456, d]System.out.println(list.size());//输出结果7}
}
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;i5;i){l1.add(ai);}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类实现了Serializable接口说明我们创建的ArrayList数组可以序列化存储数据库、传输数据等和反序列化但是用于存储元素的数组elementData为什么还用transient关键字修饰呢我们都知道用transient关键字修饰的变量可以不进行序列化和反序列化那这样做是为什么呢
大家设想一个场景此时我的数组长度为15但实际元素大小为11是不是剩余4个空间没有用到如果我们在序列化和反序列化的时候是不是就要多序列化和反序列化4个空间的内容是不是浪费了无效的操作所以秉持着高效第一的原则减少无效操作。在ArrayList的底层有两个方法readObject和writeObject用于序列化 此时我们会发现在遍历的范围是0到实际数组的大小拿上面的场景来说就是0-10的范围序列化数组中0-10的元素这样没有用到的4个空间是不是就没有被序列化和反序列化。 ②、添加元素——add 思想 创建一个Object类型的空数组注意当第一次add添加元素的时候才指定默认容量为10
ensureCapacityInternal方法先判断容量值是否大于当前ArrayList的容量如果大于当前集合容量则需要调用grow方法进行扩容反之不用操作 ③、grow扩容——ArrayList扩容机制
ArrayList的使用前不需要像数组一样提前定义大小空间容量是随着使用时自动增长的那为什么在使用ArrayList的add方法添加元素的时候底层还需要判断集合的容量是否能够放下要添加的元素呢又没有定义固定大小直接放进去不就好了吗
add方法添加分为三步
①、判断集合容量是否满足添加的元素
②、添加元素
③、集合长度1 什么时候需要扩容
如果当前容量 1超过数组长度 用户不需要提前定义大小那是因为底层默认已经定义好了大小。其实是有一个边界值的并不是无限增长的。使用时增加是因为底层有扩展因子(扩容因子是1.5)当数量达到数组的百分之多少的时候就会扩容。ArrayList默认的初始大小是10其实在一开始new完之后的数组容量并不是10而且一个空的数组当添加第一个元素的时候会进行第一次扩容数组容量变为10
ArrayList扩容的时候会将原来的数组复制到一个新的数组中为什么这么做那原来的数组什么时候回收
当 ArrayList 需要扩容时会创建一个新的更大的数组并将原来的数组中的元素复制到新数组中。这样做的原因是为了确保数组的连续性以便能够快速地访问和修改元素。如果不进行数组复制而是直接在原数组上进行扩容可能会因为内存不连续而导致性能下降。
原来的数组会在扩容后变得多余不再被使用。原来的数组会在没有任何引用指向它时变为不可达即没有任何变量指向原数组时原数组会成为垃圾对象。一旦原数组成为不可达的垃圾对象垃圾回收器就会在适当的时候将其回收释放其占用的内存空间。这个过程是由垃圾回收器自动管理的程序员不需要显式地释放原数组。 ④、在指定位置插入新元素——add 当我们在指定位置插入元素的时候要插入下标的后面元素会整体向后移动一位增加了系统额外的系统开销如上面的图片例子来说如果要插入位置越靠近数组前面我们会发现数组的移动变得很大 ⑤、更新元素——set ⑥、删除元素——remove 不管是删除指定位置元素和直接删除元素都涉及到了数组元素的移动所以我们要删除的元素如果越靠近数组的前面所消耗的性能越大 注意不要遍历集合删除元素会出现数据不一致问题个别元素没有删除成功 ⑦、查找元素——indexOf 因为数组有一个特点是可以根据下标查找元素如果按照指定下标查找元素ArrayList的性能会很高但是根据上图的源码我们不难发现如果是根据元素查找下标会从头到尾遍历整个数组如果数组的位置特别靠近末尾那整个查询会非常耗时 出现的问题
线程安全问题当多线程环境下同时对集合操作添加、删除、修改元素可能导致数据不一致问题数组越界、数据丢失等 解决方案
使用CopyOnWriteArrayList线程安全集合使⽤ Collections.synchronizedList 包装 ArrayList然后操作包装后的 list CopyOnWriteArrayList
CopyOnWrite — —写时复制
读操作是⽆锁的性能较⾼写操作的时候先将当前容器复制一份然后在新数组上执行写操作结束之后再将原容器的引用指向新容器 备参考网上图片
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86845.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!