Java 集合中的Name返回null?
这是我的第一节课Java 集合中的Name返回null?,java,collections,Java,Collections,这是我的第一节课 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)
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。您的分配错误。赋值的语法是:
variable=value代码>
public User(String name,int age)
{
this.name = name;
this.age = age;
}
因此,您的代码所做的是更改构造函数参数的值,而不是使用这些参数来实例化对象成员。您的赋值是错误的。赋值的语法是:variable=value代码>
public User(String name,int age)
{
this.name = name;
this.age = age;
}
因此,您的代码所做的是更改构造函数参数的值,而不是使用这些参数来实例化对象成员。this.name
引用实例名称对象,name
引用本地名称对象。应该是-
public User(String name,int age){
this.name=name;
this.age=age;
}
name=this.name
此处本地引用是已分配的实例引用,默认情况下,该实例引用已分配null
,因此它将变为null。此。名称
指实例名称对象,名称
指本地名称对象。应该是-
public User(String name,int age){
this.name=name;
this.age=age;
}
name=this.name
这里本地引用是赋值实例引用,默认情况下赋值为null
,因此它将变为null。就像Martijn Courtaux和Subhrajyoti Majumder alredy所说的,您必须更改构造函数中的赋值
另一个错误是hashCode方法。它需要一个大写的C,就像这样:
@Override
public int hashCode() {
int i = this.name.hashCode() + this.age;
return i;
}
@Override注释可以很好地检查此类错误
说明:您的类User
有一个方法hashcode
,该方法不会覆盖对象中的hashcode
方法。但正是这种方法被HashSet
用来检查对象的相等性(因此名为HashSet
)。就像Martijn Courtaux和Subbrajyoti Majumder alredy所说的,你必须更改构造函数中的赋值
另一个错误是hashCode方法。它需要一个大写的C,就像这样:
@Override
public int hashCode() {
int i = this.name.hashCode() + this.age;
return i;
}
@Override注释可以很好地检查此类错误
说明:您的类User
有一个方法hashcode
,该方法不会覆盖对象中的hashcode
方法。但正是该方法被HashSet
用来检查对象的相等性(因此命名为HashSet
)。这是因为public int hashcode()是hashcode的错误实现。
这将是:
public int hashCode()这是因为public int hashCode()是hashCode的错误实现。
这将是:
公共int hashCode()但现在它允许重复值Amit
打印两次。由于某些原因,我不能将Set
Set
No设置为类型安全。但是现在它允许重复值Amit
打印两次。您可以将Set
type安全设置为No吗由于某些原因,我不能。但是现在它允许重复值Amit
打印两次。但是现在它允许重复值Amit
打印两次。