【问题标题】:Item not adding to HashSet unless I declare it locally [duplicate]除非我在本地声明,否则项目不会添加到 HashSet [重复]
【发布时间】:2015-09-28 00:04:30
【问题描述】:

我有一个HashSet<User> 和一个在while 循环外声明的用户,在循环内我使用setter 方法设置名称,然后使用add(User) 将用户添加到HashSet

这似乎只更新HashSet 中的单个用户。只有当我在 while 循环中声明用户时,每次都会向HashSet 添加一个新用户。

我在想这是因为如果HashSet add() method 接收到一个与当前在集合中的对象具有相同内存地址的对象,它只会更新该对象而不向 HashSet 添加另一个新对象。它是否正确?

然后在循环中实例化 User 将导致它具有不同的内存地址,因此作为新对象添加到 HashSet

我可以把代码放在这里,但这是一个作业,我认为我的教授不希望我分享代码。如您所见,我的问题更多是关于 Java 语言而不是我的作业。但是,如果每个人都绝对需要查看代码,我会发布一些有用的东西。

【问题讨论】:

  • 查看我对这个问题的回答:stackoverflow.com/q/29830784/217324,这似乎是同一个问题。顺便说一句,仅仅因为你不能发布给你问题的真实代码并不意味着你不能构建一个重现特定问题的示例。
  • @nathanhughes 很明显,它不像我预期的那样需要。如果需要,我会及时发布。

标签: java scope hashset


【解决方案1】:

我在想这是因为如果 HashSet add() 方法接收到一个与当前在集合中的对象具有相同内存地址的对象,它只会更新该对象,而不会向 HashSet 添加另一个新对象。这是正确的吗?

没错。根据定义,HashSet 将只允许每个唯一对象中的一个。但是,关于更新对象的部分与它在 HashSet 中的成员身份无关。由于 HashSet 只包含引用,因此您对对象所做的任何更改(在您的 while 循环中或之外)都会自动反映在 HashSet 中。

然后在循环中实例化 User 会导致它有不同的内存地址

也是如此。对于每个实例化,每个对象都有不同的引用。 HashSet 将分别存储一个且仅一个。

【讨论】:

  • 啊,好吧,所以实际的散列涉及内存地址作为输入?
  • 我不确定散列算法。您可以在 JDK 安装文件中找到源代码。我还在this answer 中找到了它。如果你想知道我为什么要链接到一个 HashMap 算法,docs 状态 这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2021-11-02
  • 2019-11-24
  • 2019-06-26
相关资源
最近更新 更多