gpt4 book ai didi

java - 更改 HashSet 中的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:52 29 4
gpt4 key购买 nike

我读过这个问题:Changing the elements in a set changes the 'equals' semantics

但是,我不知道如何解决我无法更改 HashSet 中的项目并稍后将其删除的问题。

我有一些示例源代码:

public static void main(String[] args) {
TestClass testElement = new TestClass("1");
Set<TestClass> set = new HashSet<>();
set.add(testElement);
printIt(testElement, set, "First Set");
testElement.setS1("asdf");
printIt(testElement, set, "Set after changing value");
set.remove(testElement);
printIt(testElement, set, "Set after trying to remove value");
testElement.setS1("1");
printIt(testElement, set, "Set after changing value back");
set.remove(testElement);
printIt(testElement, set, "Set removing value");
}

private static void printIt(TestClass hullo, Set<TestClass> set, String message) {
System.out.println(message + " (hashCode is " + hullo.hashCode() + "):");
for (TestClass testClass : set) {
System.out.println(" " + testClass.toString());
System.out.println(" HashCode: " + testClass.hashCode());
System.out.println(" Element is equal: " + hullo.equals(testClass));
}
}

其中 TestClass 只是一个 POJO,它包含一个变量(加上 getter 和 setter)并实现了 hashcode() 和 equals()。

请求显示 equals() 和 hashcode() 方法。这些是由 eclipse 自动生成的:

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((s1 == null) ? 0 : s1.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestClass other = (TestClass) obj;
if (s1 == null) {
if (other.s1 != null)
return false;
} else if (!s1.equals(other.s1))
return false;
return true;
}

结果如下:

First Set (hashCode is 80):
TestClass [s1=1]
HashCode: 80
Element is equal: true
Set after changing value (hashCode is 3003475):
TestClass [s1=asdf]
HashCode: 3003475
Element is equal: true
Set after trying to remove value (hashCode is 3003475):
TestClass [s1=asdf]
HashCode: 3003475
Element is equal: true
Set after changing value back (hashCode is 80):
TestClass [s1=1]
HashCode: 80
Element is equal: true
Set removing value (hashCode is 80):

当 hashcode 发生变化时,我无法从 HashSet 中删除该值。如在 linked question ,我理解为什么是这样的,但我不知道如何删除更改的值。有没有可能这样做?

最佳答案

您遇到问题是因为哈希集中的键不是不可变的。如果您没有不可变键,一旦修改,您将失去原始键对象的引用。并且永远无法处理它,这有时被称为集合中的内存泄漏。因此,如果您使用不可变键,就不会遇到这种情况。

关于java - 更改 HashSet 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17209907/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com