Java HashSet中对象的问题

Java HashSet中对象的问题,java,hashset,Java,Hashset,我创建了一组使用2个字符串的控制台对象。一个是控制台的公司名称,另一个是控制台名称。我对大多数基本方法都没有问题(我知道如何添加到HashSet、清除HashSet等等),但是我在删除单个对象以及检查HashSet是否包含某个对象方面有问题。我已经包含了HashSet类的相关代码片段 import java.util.HashSet; public class testHashSet { private HashSet <Console> testSe

我创建了一组使用2个字符串的控制台对象。一个是控制台的公司名称,另一个是控制台名称。我对大多数基本方法都没有问题(我知道如何添加到HashSet、清除HashSet等等),但是我在删除单个对象以及检查HashSet是否包含某个对象方面有问题。我已经包含了HashSet类的相关代码片段

   import java.util.HashSet;

    public class testHashSet
    {
    private HashSet <Console> testSet;

    /**
     * Constructor
     */
    public testHashSet()
    {
        testSet = new HashSet <Console> () ;
        setTestSet();
    }

    public void setTestSet(){
        testSet.add(new Console("Nintendo" , "Wii U"));
        testSet.add(new Console("Sony" , "PS4"));
        testSet.add(new Console("XBox" , "Microsoft"));
    }

    /**
     * Method to remove object from HashSet
     */
    public void removeData(){
        Console d = new Console("Sony" , "PS4");
        testSet.remove(d);
        printHashSet();
    }

    /**
     * Method to check for specific object in HashSet
     */
    public void checkForItem(String anyCompany, String anyConsole){
        boolean exist = testSet.contains(new Console (anyCompany, anyConsole));
        System.out.println(exist);
    }

您没有在
控制台
类中重写
hashCode()
equals()

因此,您最终使用java的默认实现,它认为
控制台
的两个实例(并且您正在方法中创建新实例)是不同的,即使您将相同的字符串传递给构造函数也是如此

为了解决您的问题,您需要通过在
控制台
类中实现自定义
equals()
方法来“帮助”java识别相等的对象。为了遵守(并且由于
HashSet
尝试查找元素的方式),您还需要实现一个自定义的
hashCode()
方法

一个基本的实现可以是

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((companyName == null) ? 0 : companyName.hashCode());
    result = prime * result
            + ((consoleName == null) ? 0 : consoleName.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;
    Console other = (Console) obj;
    if (companyName == null) {
        if (other.companyName != null)
            return false;
    } else if (!companyName.equals(other.companyName))
        return false;
    if (consoleName == null) {
        if (other.consoleName != null)
            return false;
    } else if (!consoleName.equals(other.consoleName))
        return false;
    return true;
}
(由eclipse生成)

额外好处:如果问题中没有输入错误,您还需要将构造函数中的赋值从

companyName = companyName;


您的Console类可能不会覆盖
hashCode
equals
。事实上,如果没有看到
Console
的代码,我们就无法判断出问题所在。但是是的,它几乎肯定不会适当地覆盖
hashCode
equals
。好的,我只是添加了代码。可能是@dimo414的重复。我恐怕看不出这与此有什么关系。
companyName = companyName;
companyName = anyCompany;