记录Java 集合类 List 的坑

原创
ithorizon 8个月前 (09-01) 阅读数 85 #Java

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在使用过程中的一些常见问题,期待对大家有所帮助。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Java


热门