在HashSet中更改值

我读过这个问题:更改集合中的元素会更改“等于”语义

但是,我不知道如何解决无法更改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):

哈希码更改后,我无法从HashSet中删除该值。就像在链接的问题中一样,我理解

为什么 会这样,但是我不知道如何删除更改后的值。有可能这样做吗?

回答:

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

以上是 在HashSet中更改值 的全部内容, 来源链接: utcz.com/qa/422095.html

回到顶部