我读过这个问题:更改集合中的元素会更改“等于”语义
但是,我不知道如何解决无法更改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中删除该值。就像在链接的问题中一样,我理解
为什么 会这样,但是我不知道如何删除更改后的值。有可能这样做吗?
您正面临问题,因为哈希集中的键不是不可变的。如果没有不变的键,则一旦修改,您将失去对原始键对象的引用。而且将永远无法得到解决,这有时被称为集合中的内存泄漏。因此,如果您使用不可变键,则不会遇到这种情况。
我试图向ArrayList对象添加构造函数有3个参数(int,int,hashset)的对象。当我添加一个新对象时,哈希集中的值会发生某种变化,所以我添加了错误的值。例如,我创建3个对象,添加这3组整数: 但object会收到这些: 我不明白为什么集合会改变其值。这是函数代码: 在这段代码中我: > 获取对象的ArrayListallIndexedItems,描述文本中的单词(文本在mysql表中
问题内容: 我将从显示代码开始: 什么是SQLite3代码,将可乐行的价格列的值更改为12。 所以我希望输出为可乐12 sprite 9。 谢谢大家! 问题答案: 这些可能只是转录错误或错别字,但您应该从语句中删除单词,并且在列名周围不需要单引号,因此该语句应类似于:
问题内容: 在哈希图中,提供的键的哈希码用于将值放在哈希表中。在哈希集中,对象哈希码用于将值放置在基础哈希表中。即,哈希图的优点是您可以灵活地确定要作为密钥的内容,这样您就可以完成类似的事情。 这可以将诸如玩家名称之类的字符串映射到玩家本身。 我的问题是,当键的哈希码更改时,查找会发生什么情况。 我希望这不是Hashmap的主要关注点,因为我既不希望也不希望更改密钥。在前面的示例中,如果玩家名称更
问题内容: 我在使用ElasticSearch时遇到问题,如何更改为日志文件中的另一个字段? 问题答案: 在elasticsearch输出中,您可以为要运送的事件设置document_id。这最终将成为elasticsearch中的_id。您可以使用logstash配置中可用的各种参数/字段引用/…。像这样: 在此示例中,someFieldOfMyEvent最终成为ES中此事件的_id。
我想要dockerise的遗留web应用程序使用一些旧的类,如,这些类在Java SE7之前一直受到支持。现在,在docker容器中,默认的jdk获取(在安装tomcat-6容器时)是 OpenJdk不支持这些类
当我单击Governates_nameedt(EditText)时,我有两个想要的数组。在AlertDialog中显示Governate_names,并根据我选择的值,在state_names数组中选择值。当我运行代码时,asList被更改,我在<code>create()中得到一个错误。show() 处于状态_nameedt(编辑文本)。 我的代码 我的错误 05-13 16:42:25.720