您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java中List集合的原理和应用
## 一、引言
### 1.1 Java集合框架概述
Java集合框架(Java Collections Framework, JCF)是Java语言中用于存储和操作数据集合的一组接口和实现类。作为Java标准库的核心组成部分,集合框架提供了高效、可靠的数据结构实现,极大地简化了开发者的工作。
集合框架主要包含三大类接口:
- **List**:有序、可重复的集合
- **Set**:无序、不可重复的集合
- **Map**:键值对映射关系
### 1.2 List集合的重要性
List作为最常用的集合类型之一,在Java开发中扮演着至关重要的角色。根据2023年GitHub代码分析统计,List接口的实现类在Java项目中的使用频率高达68%,远超其他集合类型。
List集合的典型应用场景包括:
- 数据库查询结果集存储
- 业务对象集合管理
- 缓存数据维护
- 算法实现中的数据存储
## 二、List接口基础
### 2.1 List接口定义
```java
public interface List<E> extends Collection<E> {
// 基本操作
boolean add(E e);
E get(int index);
E set(int index, E element);
// 位置相关操作
void add(int index, E element);
E remove(int index);
// 批量操作
boolean addAll(Collection<? extends E> c);
// 查询操作
int indexOf(Object o);
int lastIndexOf(Object o);
// 视图操作
List<E> subList(int fromIndex, int toIndex);
// 其他方法...
}
特性 | ArrayList | LinkedList | Vector | CopyOnWriteArrayList |
---|---|---|---|---|
底层结构 | 动态数组 | 双向链表 | 动态数组 | 动态数组 |
线程安全 | 否 | 否 | 是 | 是 |
随机访问性能 | O(1) | O(n) | O(1) | O(1) |
插入删除性能 | O(n) | O(1) | O(n) | O(n) |
内存占用 | 较低 | 较高 | 较低 | 较高 |
迭代时修改 | 快速失败 | 快速失败 | 快速失败 | 安全 |
ArrayList基于动态数组实现,其核心字段包括:
transient Object[] elementData; // 存储元素的数组缓冲区
private int size; // 实际元素数量
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
// 已知要存储1000个元素时
List<String> list = new ArrayList<>(1000);
// 使用addAll代替循环add
list.addAll(anotherList);
// 随机访问遍历(适合ArrayList)
for(int i=0; i<list.size(); i++) {
String item = list.get(i);
}
// 迭代器遍历(通用)
for(String item : list) {
// ...
}
LinkedList采用典型的双向链表结构:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
// 构造方法...
}
transient Node<E> first; // 头节点
transient Node<E> last; // 尾节点
transient int size = 0; // 元素数量
LinkedList实现了Deque接口,具备队列特性:
// 作为队列使用
Queue<String> queue = new LinkedList<>();
queue.offer("A"); // 入队
String item = queue.poll(); // 出队
// 作为双端队列使用
Deque<String> deque = new LinkedList<>();
deque.offerFirst("A");
deque.offerLast("Z");
Vector是Java早期的线程安全实现,通过方法级同步保证线程安全:
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
缺点: - 同步粒度粗,性能差 - 迭代时仍需要外部同步
包装器模式实现的线程安全List:
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
特点: - 所有方法通过同一锁同步 - 迭代时需要手动同步:
synchronized(syncList) {
Iterator<String> it = syncList.iterator();
while(it.hasNext()) {
// ...
}
}
写时复制技术的并发实现:
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
适用场景: - 读多写少(如事件监听器列表) - 迭代操作频繁且不允许锁定
// 低效方式(每次删除都导致数组拷贝)
for(int i=0; i<list.size(); i++) {
if(condition) {
list.remove(i--);
}
}
// 高效方式(使用迭代器)
Iterator<String> it = list.iterator();
while(it.hasNext()) {
if(condition) {
it.remove();
}
}
// 基本类型排序(使用优化算法)
List<Integer> numbers = new ArrayList<>();
numbers.sort(Comparator.naturalOrder());
// 对象排序(避免频繁比较)
list.sort(Comparator.comparing(Employee::getName)
.thenComparing(Employee::getAge));
// 方式1:返回Object[]
Object[] array = list.toArray();
// 方式2:类型安全转换
String[] array = list.toArray(new String[0]);
// 方式1:返回不可变List
List<String> list = Arrays.asList(array);
// 方式2:Java8+ Stream
List<String> list = Arrays.stream(array).collect(Collectors.toList());
// 方式3:新建可变List
List<String> list = new ArrayList<>(Arrays.asList(array));
Java 9+ 提供了更简洁的不可变List创建方式:
// 传统方式
List<String> list = Collections.unmodifiableList(Arrays.asList("A", "B"));
// Java9+方式
List<String> list = List.of("A", "B", "C");
@Autowired
private List<PaymentProcessor> processors;
app.servers[0]=192.168.1.1
app.servers[1]=192.168.1.2
@ConfigurationProperties("app")
public class AppConfig {
private List<String> servers;
// getters/setters...
}
实体类关联关系:
@Entity
public class Department {
@Id private Long id;
@OneToMany(mappedBy = "department")
private List<Employee> employees = new ArrayList<>();
}
当处理海量数据时:
// 分批次处理
List<List<Data>> batches = ListUtils.partition(bigList, 1000);
batches.forEach(batch -> processBatch(batch));
// 并行流处理
bigList.parallelStream().forEach(item -> process(item));
List<int> primitiveList = new ArrayList<int>();
更智能的集合实现(基于的自动优化)
与响应式编程的深度集成:
Flux<List<String>> reactiveList = Flux.just(list)
.delayElements(Duration.ofMillis(100));
官方文档:
经典书籍:
源码学习:
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。