List<Integer> statusList = Arrays.asList(1, 2, 3);
System.out.println(statusList); // 输出:[1, 2, 3]
statusList.add(4); // 尝试添加一个元素
深入源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
private static class ArrayList<E> extends AbstractList<E> {
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
// 未实现 add/remove 等修改列表长度的方法
}
正确的使用方式
List<Integer> mutableList = new ArrayList<>(Arrays.asList(1, 2, 3));
mutableList.add(4); // 现在你可以安心添加元素了
System.out.println(mutableList); // 输出:[1, 2, 3, 4]
ArrayList.subList的双刃剑
基本用法与问题
List<String> bookList = new ArrayList<>(Arrays.asList("红楼梦", "西游记", "水浒传", "三国演义"));
List<String> selectedBooks = bookList.subList(1, 3);
System.out.println(selectedBooks); // 输出:[西游记, 水浒传]
selectedBooks.set(1, "封神演义");
System.out.println(bookList); // 输出:[红楼梦, 西游记, 封神演义, 三国演义]
常见错误
bookList.add("水经注");
System.out.println(selectedBooks); // 会抛出 ConcurrentModificationException
List<String> safeSubList = new ArrayList<>(bookList.subList(1, 3));
safeSubList.add("封神演义");
System.out.println(safeSubList); // 输出:[西游记, 水浒传, 封神演义]
总结与建议
-
使用Arrays.asList时要小心:不要尝试使用add、remove等方法改变列表大小。如果需要一个可变列表,创建一个新的ArrayList。 -
使用subList时需注意:它是原列表的视图,任何修改都会相互影响。如果需要独立的子列表,请创建一个新的ArrayList。 -
多加小心,避免常见错误:理解工具背后的实现原理,才能有效地避免使用过程中的“踩雷”。
微信赞赏支付宝扫码领红包
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。侵权投诉:375170667@qq.com