关于日常开发和面试——集合List及数组避坑之一二

1、集合与循环的碰撞

关于在循环中对集合进行新增或删除元素操作的问题。这是一个常见的陷阱,因为这样做可能导致迭代器失效或者遍历到不应该访问的元素。

以下是一个简单的示例代码,展示了为什么不能在循环中对集合进行新增或删除元素操作:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class CollectionModificationExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (String s : list) {
            // 在循环中对集合进行修改操作
            list.remove(s);
            System.out.println(s);
        }
    }
}

在这个例子中,我们在循环中尝试从list中移除每个元素。然而,由于List.remove()方法改变了集合的大小,这会导致迭代器失效,从而无法正确遍历所有元素。

正确的做法是在循环外部对集合进行修改操作,或者使用Iterator来遍历集合。例如:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class CollectionModificationExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        // 使用 Iterator 遍历集合并进行修改操作
        for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
            String s = iterator.next();
            iterator.remove();
            System.out.println(s);
        }
    }
}

在这个例子中,我们使用Iterator来遍历集合,并在循环内部进行修改操作。这样可以确保迭代器始终指向下一个元素,而不会因为集合大小的变化而失效。

总结来说,不能在循环中对集合进行新增或删除元素操作,因为这可能导致迭代器失效或者遍历到不应该访问的元素。正确的做法是在循环外部对集合进行修改操作,或者使用Iterator来遍历集合。

2、数组转集合不要翻车

在Java编程中,数组和集合都是常见的数据结构。数组是一种线性数据结构,它的大小在创建时就确定了,且不能动态地改变。而集合则是一种动态数据结构,可以动态地添加或删除元素。

在某些情况下,我们需要将一个数组转换为集合。例如,当我们需要对数组进行排序、查找、过滤等操作时,使用集合会更加方便。此外,如果数组的大小可能会发生变化,那么使用集合也是更好的选择。

在Java中,有两种主要的集合类型:List和Set。List允许重复元素,而Set则不允许重复元素。在这篇文章中,我们将重点介绍如何将数组转换为List。

首先,让我们来看一个简单的例子,展示如何将一个Integer类型的数组转换为List:

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayToListExample {
    public static void main(String[] args) {
        Integer[] array = {1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(array);
        list.add(6);
        System.out.println(list);
    }
}

在这个例子中,我们首先定义了一个Integer类型的数组array,然后使用Arrays.asList(array)方法将其转换为List。

然而,需要注意的是,Arrays.asList(array)返回的是一个固定大小的列表(List),这个列表是基于给定数组的视图,而不是一个真正的列表(List)。这意味着,当你尝试向这个列表(List)添加元素时,就会抛出UnsupportedOperationException异常,因为这个列表(List)不允许添加元素。

为了避免这种错误,我们应该使用ArrayList<Integer>或者其他可变列表(List)来存储Integer类型的数组内容。这样就可以在运行时动态地添加或删除元素了。

下面是修改后的代码示例:

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Integer[] array = {1, 2, 3, 4, 5};
        List<Integer> list = new ArrayList<>(Arrays.asList(array));
        list.add(6);
        System.out.println(list);
    }
}

在这个例子中,我们首先创建了一个ArrayList<Integer>对象,并将其初始化为Arrays.asList(array)的结果。这样,我们就可以在运行时动态地添加元素了。

总结来说,将一个数组转换为集合,尤其是将一个Integer类型的数组转换为List,需要注意以下几点:

  1. 使用ArrayList<Integer>或者其他可变列表(List)来存储数组内容。
  2. Arrays.asList(array)返回的是一个固定大小的列表(List),这个列表不允许添加元素。
  3. 如果需要动态地添加或删除元素,应该直接操作列表(List)本身。
相关推荐
IT_陈寒1 天前
Vue的这个响应式陷阱,我debug了一整天才爬出来
前端·人工智能·后端
兔子零10241 天前
手把手教你在 Claude Code 中接入 DeepSeek-V4
后端
掌心向暖RPA自动化1 天前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭1 天前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
phenhorlin1 天前
我做了个工具,让切换 Homebrew 镜像像切 npm 源一样简单
后端·shell
6951 天前
两周浅学 RAG
后端
TeamDev1 天前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入
AI人工智能+电脑小能手1 天前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
迦南的迦 亚索的索1 天前
AI_11_Coze_AI面试助手
人工智能·面试·职场和发展
AI人工智能+电脑小能手1 天前
【大白话说Java面试题】【Java基础篇】第25题:JDK1.8的新特性有哪些
java·开发语言·后端·面试