java - 使对象为空
问题描述
在下面的代码中,我将 ex1 对象添加到 ArrayList。然后我将 ex1 对象设为空。但是当我从arraylist返回对象时,它仍然是以前的值没有更改为null。这是为什么?正如我认为所有的参考变量都指的是堆中的同一个对象。所以它应该是空的
List<Example> ex = new ArrayList<>();
Stack<Example> st = new Stack<>();
Example ex1 = new Example();
ex1.age = 15;
ex.add(ex1);
st.push(ex1);
ex1 = null;
//System.out.println(ex1.age);
System.out.println(ex.get(0).age);
System.out.println(st.peek().age);
输出为 15
解决方案
Java 语言规范中描述了此行为。
当调用方法或构造函数时(第 15.12 节),实际参数表达式的值在执行方法或构造函数的主体之前初始化新创建的参数变量,每个声明的类型。
所以当你调用add
方法时,引用被复制,并且这个副本被存储。将原始参考更改为指向对null
复制的参考没有影响。
您可以做的是将复制的引用传递给AtomicReference
. 因此,虽然您复制的所有引用都指向 的相同位置,但AtomicReference
您可以更新此引用指向的位置。
推荐阅读
- r - 在数据表中复制“拥有”的正确方法是什么?
- java - 当 `OnclickListener doesn't` 在活动上工作时,是否有任何微不足道的情况?
- c# - 如何在 Azure 的 ConfigurationManager.ConnectionStrings 上使用 ConnectionStrings 创建 EF 迁移?
- java - 由于权限限制,AWS Pipeline 未为 Lambda 创建 S3 触发器
- roku - 使用 SG 组件 (SearchView) 可以在 MainScene 中观察到 gridview 吗?
- excel - Excel DATEDIF 未显示正确答案
- php - 在 PHP 中将多维关联数组显示为表格
- c# - 如何从列表中查找重复键
> fileHashList = 新列表 >(); - vim - 如何在 nvim 和 Mac 中隐藏具有某些扩展名的文件?
- amazon-web-services - EC2 可以动态管理我的服务器系统属性吗?