java - 将对象添加到 Java 集合时,是按值添加还是按引用添加?

标签 java pointers collections

我环顾四周,无法弄清楚这一点:我有一个实现观察者模式的对象和一个 List 实现,该实现允许在列表中的任何对象上触发更改事件时将监听器添加到列表中以避免手动添加/删除列表中每个对象的监听器。

我遇到的问题是,当创建相同 List 实现的新实例并从现有列表添加对象时,对象更改不会从添加到新列表的 bean 中触发。我的想法是,当将一个对象添加到一个集合时,它只会添加一个指向现有对象的指针,在这种情况下,更改通知将在新列表中的对象上触发,但这并没有发生。谁能帮我弄清楚可能是什么问题?我见过类似的问题,但没有一个可以帮助我解决这个问题。

用例是一个股票扫描仪,其中一个列表包含我正在关注的市场中的所有股票,而扫描仪列表仅包含通过标准的股票,但扫描仪未获取使用触发的价格、数量等更新观察模式。 - 邓肯

最佳答案

你的理解是正确的;集合保存对对象的引用。例如,这个:

final StringBuilder stringBuilder = new StringBuilder();
final List<StringBuilder> stringBuilderList = new ArrayList<StringBuilder>();
stringBuilderList.add(stringBuilder);
stringBuilderList.add(stringBuilder);
stringBuilder.append("yes");
System.out.println(stringBuilderList);

将打印这个:
[yes, yes]

因为只有一个 StringBuilder实例,所以附加 "yes"在列表的每个元素中。

但请注意,集合按值保存这些引用,而不是按引用。例如,这个:
StringBuilder stringBuilder = new StringBuilder("yes");
final List<StringBuilder> stringBuilderList = new ArrayList<StringBuilder>();
stringBuilderList.add(stringBuilder);
stringBuilder = new StringBuilder("no");
// now stringBuilder refers to a different object than before
stringBuilderList.add(stringBuilder);
System.out.println(stringBuilderList);

将打印这个:
[yes, no]

因为列表的两个元素引用不同的对象,即使两个对象都由相同的变量标识。

为了获得更多帮助来找出您的代码出了什么问题,我认为您必须发布一个演示该问题的最小程序。

关于java - 将对象添加到 Java 集合时,是按值添加还是按引用添加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8978774/

相关文章:

java - 将 Java 应用程序与 SQL Server 连接

java - eclipse 警告 : Type safety (Java Generics)

json - 解码 JSON 时指向接口(interface)的指针与持有指针的接口(interface)

c++ - 我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?

C++ 自己的观察者模式

c# - 字典和哈希表之间的区别

java - 按顺序迭代 HashMap

java - 如何在聚焦时更改 JPanel 的不透明度?

java - 对于 JPA 元模型生成的类,Maven "clean install site"失败

c# - 如何从C#中的StringCollection中删除重复项?