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