惊呆了!这些Java List竟然藏着这么多秘密!你get到了吗?

简介: 【6月更文挑战第17天】Java中的ArrayList在添加元素时自动扩容,容量翻倍以适应增长;LinkedList则利用双向链表结构提供高效头尾操作。迭代List时,并发修改会导致`ConcurrentModificationException`,需用Iterator或并发集合如CopyOnWriteArrayList。了解这些秘密能优化性能并避免异常。

在Java编程的世界里,List无疑是我们日常开发中经常打交道的一个接口。它代表了有序集合,允许我们存储和访问元素的顺序。但是,你有没有想过,这个看似简单的List背后竟然隐藏着这么多的秘密和高级用法呢?今天,就让我来为你揭开这些秘密的面纱吧!

秘密一:ArrayList的扩容机制

ArrayList是List接口的一个常用实现,它以数组的形式在内存中存储元素。但是,随着元素的不断添加,ArrayList的容量也会逐渐增大。这个扩容的过程其实并不是简单的重新分配一个更大的数组,而是会涉及到一个复杂的计算和元素复制的过程。如果你深入了解这个过程,就能更好地控制ArrayList的内存使用,避免不必要的性能开销。

示例代码:

java
ArrayList list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
list.add(i);
}
// ArrayList在添加元素时会自动扩容
秘密二:LinkedList的双向链表结构

与ArrayList不同,LinkedList是以双向链表的形式来存储元素的。这意味着它在添加、删除元素时具有更高的效率,尤其是在列表的头部和尾部进行操作时。此外,LinkedList还支持更多的操作,比如将元素插入到指定位置,或者从指定位置删除元素等。

示例代码:

java
LinkedList linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.addFirst("B"); // 在头部插入元素
linkedList.addLast("C"); // 在尾部插入元素
System.out.println(linkedList.get(0)); // 输出B
秘密三:List的迭代与并发修改

在使用List进行迭代时,我们需要注意一个常见的陷阱:并发修改。也就是说,在迭代过程中,如果我们试图修改List(比如添加、删除元素),就会抛出ConcurrentModificationException异常。为了避免这个问题,我们可以使用Iterator或者并发集合(如CopyOnWriteArrayList)来进行迭代和修改操作。

示例代码(错误示例):

java
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Integer num = iterator.next();
if (num % 2 == 0) {
list.remove(num); // 这里会抛出ConcurrentModificationException
}
}
正确的做法是使用Iterator的remove方法:

java
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Integer num = iterator.next();
if (num % 2 == 0) {
iterator.remove(); // 使用Iterator的remove方法删除元素
}
}
以上就是关于Java List的一些秘密和高级用法。希望这些内容能够让你对List有更深入的了解,并在日常开发中更加得心应手!

相关文章
|
4月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
4月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
4月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
68 5
|
2月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
41 3
|
2月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
29 1
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
38 2
|
2月前
|
小程序 Java
小程序通过get请求提交数据到java后台
小程序通过get请求提交数据到java后台
34 0
|
4月前
|
Java 数据库
成功解决:java.sql.SQLSyntaxErrorException: Unknown column ‘origin_name‘ in ‘field list‘
这篇文章讲述了作者在使用SpringBoot和Mybatis-plus时遇到的一个数据库字段映射问题,即SQLSyntaxErrorException错误,原因是实体类字段和数据库字段不匹配。文章提供了两种解决方法:一是关闭自动驼峰命名转换配置,二是修改数据库字段以匹配实体类字段,最终成功解决了问题。
成功解决:java.sql.SQLSyntaxErrorException: Unknown column ‘origin_name‘ in ‘field list‘
|
4月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List