深入解析OnJava8-Examples中的List集合操作
前言
List是Java集合框架中最常用的数据结构之一,它提供了有序且可重复的元素存储能力。在Bruce Eckel的OnJava8-Examples项目中,ListFeatures.java文件展示了Java中List接口的各种实用操作。本文将深入解析这些操作,帮助读者全面掌握List的使用技巧。
List基础操作
创建与初始化
示例中首先创建了一个包含7个Pet对象的List:
List<Pet> pets = new PetCreator().list(7);
System.out.println("1: " + pets);
这里使用了PetCreator工厂类来生成Pet对象列表。输出显示列表初始包含各种宠物类型,如Rat、Manx、Cymric等。
添加元素
List会自动调整大小以适应新元素:
Hamster h = new Hamster();
pets.add(h); // 自动调整大小
System.out.println("2: " + pets);
add()
方法将元素追加到列表末尾,列表大小会自动增加。
元素检查与移除
System.out.println("3: " + pets.contains(h)); // 检查元素是否存在
pets.remove(h); // 通过对象引用移除
contains()
方法检查元素是否存在,remove()
方法通过对象引用移除元素。注意,移除操作需要精确的对象匹配。
进阶操作
索引相关操作
Pet p = pets.get(2); // 获取索引为2的元素
System.out.println("4: " + p + " " + pets.indexOf(p)); // 获取元素索引
Pet cymric = new Cymric();
System.out.println("5: " + pets.indexOf(cymric)); // 新对象不在列表中,返回-1
get()
通过索引获取元素,indexOf()
查找元素首次出现的索引。注意,对于新创建的对象,即使类型相同也不被视为列表中的元素。
指定位置插入
pets.add(3, new Mouse()); // 在索引3处插入新元素
add(index, element)
方法可以在指定位置插入元素,后续元素会自动后移。
子列表操作
创建子列表
List<Pet> sub = pets.subList(1, 4); // 获取子列表(包含1,不包含4)
subList()
方法创建原始列表的视图,对子列表的修改会影响原始列表。
排序与洗牌
Collections.sort(sub); // 原地排序
Collections.shuffle(sub, rand); // 随机打乱顺序
Collections
工具类提供了对列表的排序和随机重排功能。
批量操作
包含性检查
System.out.println("10: " + pets.containsAll(sub)); // 检查是否包含所有子列表元素
containsAll()
检查列表是否包含指定集合中的所有元素,不考虑顺序。
保留与移除
copy.retainAll(sub); // 只保留与sub相同的元素
copy.removeAll(sub); // 移除所有与sub相同的元素
retainAll()
和removeAll()
提供了批量操作元素的能力。
其他实用操作
列表转换
Object[] o = pets.toArray(); // 转换为Object数组
Pet[] pa = pets.toArray(new Pet[0]); // 转换为指定类型的数组
toArray()
方法提供了列表到数组的转换能力,第二种形式可以指定数组类型。
清空与判空
pets.clear(); // 清空列表
System.out.println("20: " + pets.isEmpty()); // 检查是否为空
clear()
移除所有元素,isEmpty()
检查列表是否为空。
总结
通过OnJava8-Examples中的ListFeatures示例,我们全面了解了Java List接口的各种操作:
- 基本操作:添加、移除、检查元素
- 索引操作:获取、查找、插入
- 子列表操作:创建视图、排序、洗牌
- 批量操作:包含检查、保留、移除
- 转换操作:列表与数组互转
- 状态操作:清空、判空
掌握这些操作能够帮助开发者更高效地处理有序数据集合。List作为Java集合框架的核心接口,其灵活性和功能性在实际开发中有着广泛的应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考