当前位置: 首页 > 面试题库 >

在HashSet中更改值

胥博文
2023-03-14
问题内容

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

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