名称在集合中返回null?

时间:2014-04-23 07:28:14

标签: 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)
    {
        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。

4 个答案:

答案 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()