java - java中定义为a = b时,为什么ArrayList.add()会向多个arraylist添加值?
问题描述
我最近在 java 中遇到了一个奇怪的“功能”,这意味着当我将项目添加到不同的列表时,ArrayLists 似乎神奇地添加了项目。见下文:
List<Integer> i = new ArrayList<Integer>();
List<Integer> i2 = i;
i.add(77);
System.out.println(i);
System.out.println(i2);
该程序给出输出:
[77]
[77]
但是,如果您只用整数替换列表:
int i = 5;
int i2 = i;
i = 7;
System.out.println(i);
System.out.println(i2);
它像我期望的那样工作,给出结果
7
5
为什么会发生这种情况,当我这样做时,我怎样才能停止i
并i2
成为同一个列表i.add()
?
解决方案
在这方面,基元之类的int
行为与对象之类的行为不同ArrayList
。与原语一起使用=
会产生原语的副本,而对对象这样做会得到相同的对象。如果您随后尝试改变对象(例如.add()
),那么对象将被改变,并且引用它的两个变量都可以看到。
要制作“软拷贝”(包含相同元素的不同列表),您可以ArrayList
使用现有的 ' 调用构造函数ArrayList
:
List<Integer> i = new ArrayList<>();
List<Integer> i2 = new ArrayList<>(i);
推荐阅读
- indentation - 删除不需要的 pyweb 缩进
- r - 使用 ifelse() 在 for 循环中创建一个新变量,但第二个循环擦除了第一个循环的成就
- javascript - 注释插件不适用于 Chart.js 2.8.0
- android - 在 kotlin 中,我们应该选择密封类进行错误处理还是自定义异常类?
- r - r中两行第二行和最后一行之间的日期差
- cypress - 没有条件的赛普拉斯拦截
- django - 为什么 {{ form }} 代表模板文件中的表单实例?
- c# - 在Unity中按住键时如何停止在TMP输入字段中重复输入字母
- swift - 在swiftui中修改项目类后ListView不更新
- flutter - 想要在颤振中初始化 TimeZone 包,代码给出这个错误