java - HashSet 是否制作添加对象的内部副本?

标签 java reference

假设我有一个像这样的递归函数

public void someRecur(List<Integer>someList){
  if(someBreakCondition)
    Set.add(someList);
  for(int i = 0; i < someLen ; i++){
    someList.add(someInt);
    someRecur(someList);
    someList.remove(someInt);
   }
}

remove 会影响已经放入集合中的列表吗?我应该怎么做才能为集合提供列表的实际副本?

最佳答案

您不会将对象放入 map ;您将 引用 添加到堆中的对象。

Java 数据结构包含对对象的引用,而不是对象本身。如果您从数据结构中删除引用,其他对象可能仍具有该引用的副本。

如果两个对象持有对一个可变对象的引用,那么每个对象都会看到另一个对象所做的更改。 (这就是线程安全很重要的原因。)

当没有人引用堆上的一个对象时,它就有资格进行 GC。

关于java - HashSet 是否制作添加对象的内部副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13047757/

相关文章:

rust - 为什么不能在同一结构中存储值和对该值的引用?

C++ 函数取值,它们应该取引用

java - 在 Manjaro Linux 上为 React Native 运行 JDK 时出现问题

java - 如何处理 setter 在 JAXB 自动从请求正文解码时抛出的异常?

java - java中如何去掉小数点后几位?

javascript:如何将变量转换为具有相同名称并返回原始值的函数

.net - 引用的 DLL 未复制到引用项目

Java 星期几,每个语言环境有 2 个字母

java - 类文件 javax/servlet/ServletException 中非 native 或抽象方法中的缺失代码属性

c++ - 引用、逻辑运算符和循环条件