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
打印两次。