这是我的第一堂课
public class User {
String name;
int age;
public User(String name,int age)
{
name=this.name;
age=this.age;
}
@Override
public boolean equals(Object obj)
{
User u=(User)obj;
if(this.age==u.age)
{
return this.name.equals(u.name);
}
else
{
return false;
}
}
public int hashcode()
{
return this.name.hashCode()+this.age;
}
@Override
public String toString()
{
return String.format("Name %s", this.name);
}
}
这是我的第二堂课
public class MainClass {
public static void main(String args[])
{
java.util.Set s=new java.util.HashSet();
s.add(new Integer(10));
s.add(new Integer(1));
s.add(new Integer(5));
s.add(new Integer(3));
s.add(new Integer(6));
s.add(new Integer(9));
s.add(new User("Amit",25));
s.add(new User("Amit",25));
java.util.Iterator it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
当我运行第二个程序名时,返回为null。
答案 0 :(得分:2)
this.name
表示实例名称对象,name
表示本地名称对象。它应该是 -
public User(String name,int age){
this.name=name;
this.age=age;
}
name=this.name;
此处为本地引用分配了实例引用,该引用将null
指定为默认值,因此它将变为空。
答案 1 :(得分:1)
你的任务错了。赋值的语法是:variable = value;
。
public User(String name,int age)
{
this.name = name;
this.age = age;
}
所以,你的代码所做的是改变构造函数参数的值,而不是使用这些参数来实例化对象成员。
答案 2 :(得分:1)
像Martijn Courteaux和Subhrajyoti Majumder alredy所说,你必须在构造函数中更改赋值。
另一个错误是你的hashCode方法。它需要一个大写的C,所以就像那样:
@Override
public int hashCode() {
int i = this.name.hashCode() + this.age;
return i;
}
@Override注释可以很好地检查这些错误。
说明:您的班级User
的方法hashcode
不会覆盖hashCode
中的Object
方法。但是HashSet
正是使用该方法来检查对象的等同性(因此名称为HashSet
)。
答案 3 :(得分:1)
这是因为public int hashcode()是hashcode的错误实现。 这将是:
public int hashCode()