记录Java 集合类 List 的坑
原创Java集合类List的坑
Java中的集合类为我们提供了方便地存储和操作对象的能力,其中List接口是使用最为广泛的一个。然而,在使用List的过程中,有一些常见的坑和需要注意的问题,本文将对此进行总结。
1. 使用原始类型需要注意
在Java中,List接口通常配合泛型使用,但是如果我们使用原始类型(如List而不是List<Integer>),在编译时期不会报错,但在运行时也许会遇到类型转换异常(ClassCastException)。所以,建议总是使用泛型。
2. 并发修改异常
在使用迭代器遍历List时,如果尝试直接修改List的内容(添加、删除元素),会抛出ConcurrentModificationException异常。正确的做法是使用迭代器提供的remove方法。
Iterator
iterator = list.iterator(); while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("remove")) {
iterator.remove(); // 使用迭代器的remove方法
}
}
3. 索引越界异常
在对List进行操作时,最常见的谬误之一是索引越界异常(IndexOutOfBoundsException)。当我们尝试访问一个不存在的索引时,如get(-1)或者list.size(),都会触发这个异常。在使用索引时,务必先检查索引的有效性。
4. List的subList方法
subList方法可以用来获取一个列表的子列表,但是需要注意的是,返回的子列表是原列表的视图,意味着对子列表的修改会影响原列表,反之亦然。此外,如果原列表在创建子列表后被修改(除了通过子列表自己的方法修改),那么子列表的行为是不确定的。
5. ArrayList和LinkedList的选择
ArrayList和LinkedList都实现了List接口,但两者在性能上有很大的差异。ArrayList在随机访问时更快,而LinkedList在添加和删除元素时更快。选择哪一个取决于应用场景。
6. 空指针异常
当尝试在一个null的List上调用方法时,会抛出空指针异常(NullPointerException)。在使用List之前,应当检查其是否为null。
7. 覆盖equals和hashCode方法
当我们在自定义类中使用List作为成员变量,并期待这个类的实例能够被放入基于哈希的集合(如HashSet)或者用作比较时,我们需要覆盖equals和hashCode方法。否则,默认的实现也许会引起预期之外的行为。
以上总结了Java集合类List在使用过程中的一些常见问题,期待对大家有所帮助。