ArrayList是Java集合框架中最常用的动态数组实现,提供了灵活的数据存储和操作方式。掌握其核心技巧能显著提升开发效率。
默认构造函数创建的ArrayList初始容量为10,频繁扩容可能影响性能。预先估算数据量并指定初始容量可减少扩容开销:
// 预估存放500个元素
ArrayList list = new ArrayList<>(500);
批量添加元素时使用addAll
比循环添加更高效:
ArrayList srcList = new ArrayList<>();
// 填充数据...
ArrayList destList = new ArrayList<>();
destList.addAll(srcList);
使用迭代器进行安全删除,避免ConcurrentModificationException:
ArrayList numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Iterator it = numbers.iterator();
while(it.hasNext()) {
if(it.next() % 2 == 0) {
it.remove(); // 安全删除偶数
}
}
Java 8+的forEach配合lambda表达式:
numbers.forEach(n -> System.out.println("Number: " + n));
与数组相互转换:
// ArrayList转数组
String[] arr = list.toArray(new String[0]);
// 数组转ArrayList
ArrayList newList = new ArrayList<>(Arrays.asList(arr));
使用Stream API进行过滤和映射:
List squares = numbers.stream()
.map(x -> x * x)
.collect(Collectors.toCollection(ArrayList::new));
自定义对象排序需实现Comparable或使用Comparator:
class Person implements Comparable {
String name;
// 实现compareTo...
}
ArrayList people = new ArrayList<>();
Collections.sort(people); // 自然排序
// 使用Comparator按名称排序
people.sort(Comparator.comparing(p -> p.name));
二分查找前必须排序:
Collections.sort(numbers);
int index = Collections.binarySearch(numbers, 42);
ArrayList非线程安全,多线程环境可采用:
// 使用Collections.synchronizedList
List syncList = Collections.synchronizedList(new ArrayList<>());
// 或者使用CopyOnWriteArrayList
CopyOnWriteArrayList safeList = new CopyOnWriteArrayList<>();
频繁插入/删除考虑LinkedList,随机访问保持ArrayList。批量操作使用subList
:
List sub = list.subList(1, 4);
sub.clear(); // 删除原list的1-3位置元素
预先分配足够容量避免多次扩容:
ArrayList largeList = new ArrayList<>(10000);
使用List.of创建不可变列表:
List immutableList = List.of("A", "B", "C");
工厂方法创建ArrayList:
ArrayList quickList = new ArrayList<>(List.of("X", "Y", "Z"));
掌握这些技巧能充分发挥ArrayList优势,在合适场景下选择最优实现方案。注意根据具体需求权衡线程安全、性能开销和功能特性。