问题一:你用过 Java 中的哪些集合类?
ArrayList, LinkedList, HashMap, HashSet, TreeSet, Stack, Queue, PriorityQueue等
问题二:集合中遍历元素的方式?
Collection 接口实现子类
1. List 集合
- // list 集合
- public static void traversalList() {
- List<Integer> list = List.of(3, 5, 4, 9, 6);
- // 1. for 循环遍历
- System.out.println("传统 for循环遍历");
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i) + " ");
- }
- System.out.println();
- // 2. foreach 循环遍历
- System.out.println("增强 for循环遍历");
- for (Integer i : list) {
- System.out.print(i + " ");
- }
- System.out.println();
- // 3. 迭代器遍历
- System.out.println("迭代器 iterator遍历");
- Iterator<Integer> iterator = list.iterator();
- while (iterator.hasNext()){
- Integer i = iterator.next();
- System.out.print(i + " ");
- }
- System.out.println();
- // 4. forEach 方法遍历
- System.out.println("forEach 方法遍历");
- list.forEach(i -> System.out.print(i + " "));
- System.out.println();
- // 5. 使用 stream API 遍历
- System.out.println("stream API 遍历");
- list.stream().forEach(i -> System.out.print(i + " "));
- System.out.println();
- }
复制代码
2. Set 集合
Set 集合的遍历方式与 list 集合类似,但是 Set 集合不能使用 传统 for 循环遍历,因为 Set 不具备 get() 方法
- // set 集合
- public static void traversalSet() {
- Set<Integer> set = Set.of(7, 6, 3, 8, 4);
- // 1. foreach 循环遍历
- System.out.println("增强 for循环遍历");
- for (Integer i : set) {
- System.out.print(i + " ");
- }
- System.out.println();
- // 2. 迭代器遍历
- System.out.println("迭代器 iterator遍历");
- Iterator<Integer> iterator = set.iterator();
- while (iterator.hasNext()){
- Integer i = iterator.next();
- System.out.print(i + " ");
- }
- System.out.println();
- // 3. forEach 方法遍历
- System.out.println("forEach 方法遍历");
- set.forEach(i -> System.out.print(i + " "));
- System.out.println();
- // 4. 使用 stream API 遍历
- System.out.println("stream API 遍历");
- set.stream().forEach(i -> System.out.print(i + " "));
- System.out.println();
- }
复制代码
Map 接口实现子类
由于 Map 接口并没有直接或间接实现 Iterable 接口,故不能直接使用迭代器遍历,并且 Map 键值对映射关系中,只能由键得到值,不能由值得到键(键是唯一的,值不是),因此使用 keySet() 方法可以遍历键和值,使用 values() 方法只能遍历值。
- // map 集合
- public static void traversalMap(){
- Map<String, Integer> map = Map.of("a", 1, "b",
- 2, "c", 3, "d", 4);
- // 1. keySet
- System.out.println("使用 keySet 方法遍历");
- for (String key : map.keySet()) {
- System.out.print(key + "=" + map.get(key) + " ");
- }
- System.out.println();
- // 2. 使用 values 遍历值
- System.out.println("使用 values 方法遍历值");
- for (Integer i : map.values()) {
- System.out.print(i + " ");
- }
- System.out.println();
- // 3. 使用 Map.Entry
- System.out.println("通过 Map.Entry 遍历");
- for (Map.Entry<String, Integer> entry : map.entrySet()){
- System.out.print(entry.getKey() + "=" + entry.getValue() + " ");
- }
- System.out.println();
- // 4. 使用 forEach 方法
- System.out.println("forEach 方法遍历");
- map.forEach((key, value) -> System.out.print(key + "=" + value + " "));
- System.out.println();
- // 5. 使用 Stream API
- System.out.println("stream API 遍历");
- map.entrySet().stream().forEach(
- (entry -> System.out.print(entry.getKey() + "=" + entry.getValue() + " "))
- );
- System.out.println();
- }
复制代码
问题三:如何做到一边遍历元素一边删除元素?
1. List 集合
- // list 集合
- public static void TraversalAndRemoveList(){
- Integer[] arr = new Integer[]{3, 5, 4, 9, 6};
- // 此处将一个数组变为一个可变的 list 集合
- List<Integer> list = Arrays.stream(arr).collect(Collectors.toList());
- // 1. 传统 for循环 倒序遍历
- System.out.println("通过传统 for 循环倒序遍历并删除");
- for (int i = list.size()-1; i >= 0 ; i--) {
- if(list.get(i) % 2 == 0){
- list.remove(i);
- }
- }
- // 打印
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i) + " ");
- }
- System.out.println();
- // 2. 通过迭代器中的 remove 方法
- System.out.println("通过迭代器中的 remove 方法遍历并删除");
- list = Arrays.stream(arr).collect(Collectors.toList());
- Iterator<Integer> iterator = list.iterator();
- while (iterator.hasNext()){
- if (iterator.next() % 2 == 0){
- iterator.remove();
- }
- }
- iterator = list.iterator();
- while (iterator.hasNext()){
- System.out.print(iterator.next() + " ");
- }
- System.out.println();
- // 3. 使用 List 提供的 removeIf 方法
- System.out.println("通过 List 中的 removeIf 方法遍历并删除");
- list = Arrays.stream(arr).collect(Collectors.toList());
- list.removeIf(number -> number % 2 == 0);
- list.forEach(number -> System.out.print(number + " "));
- System.out.println();
- }
复制代码
2. Set 集合
- // Set 集合
- public static void TraversalAndRemoveSet(){
- Integer[] arr = new Integer[]{7, 6, 3, 8, 4};
- Set<Integer> set = Arrays.stream(arr).collect(Collectors.toSet());
- // 1. 使用 Iterator 的 remove 方法
- System.out.println("使用 Iterator 的 remove 方法");
- Iterator<Integer> iterator = set.iterator();
- while (iterator.hasNext()){
- if (iterator.next() % 2 == 0){
- iterator.remove();
- }
- }
- System.out.println(set);
- // 2. 使用 Set 的 removeIf 方法
- System.out.println("使用 Set 提供的 removeIf 方法");
- set.removeIf(number -> number % 2 == 0);
- System.out.println(set);
- // 3. 使用 Stream API 不改变原集合, 生成一个新集合
- System.out.println("使用 Stream API 生成一个不包含指定元素的新集合");
- set = set.stream()
- .filter(number -> number % 2 != 0)
- .collect(Collectors.toSet());
- System.out.println(set);
- }
复制代码
3. Map 集合
Map 集合的遍历删除方式的思路是通过 entrySet() 方法把 Map 中的每个 entry 节点存放在 Set 集合中,再通过 Set 集合的遍历删除方式进行;
- // Map 集合
- public static void TraversalAndRemoveMap(){
- // 删除所有值为偶数的元素
- Map<String, Integer> map = new HashMap<>();
- map.put("a", 1);
- map.put("b", 2);
- map.put("c", 3);
- map.put("d", 4);
- // 1. 通过 entrySet 方法转化为 Set, 使用 iterator 的 remove 方法
- System.out.println("转化为 Set 后, 使用 iterator 的 remove 方法");
- Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
- while (iterator.hasNext()){
- if(iterator.next().getValue() % 2 == 0){
- iterator.remove();
- }
- }
- System.out.println(map);
- // 2. 通过 entrySet 方法转化为 Set, 使用 removeIf 方法
- System.out.println("转化为 Set 后, 使用 removeIf 方法");
- map.entrySet().removeIf(entry -> entry.getValue() % 2 == 0);
- System.out.println(map);
- // 3. 使用 Stream API 生成一个不包含指定元素的新集合
- System.out.println("转化为 Set 后, 使用 Stream API");
- map = map.entrySet().stream()
- .filter(entry -> entry.getValue() % 2 != 0)
- .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
- System.out.println(map);
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |