我们老师给了我们一个程序,结果运行出来为什么是False?我怎么看都觉得是True啊import java.util.*;public class aa{

private final String first,last;
public aa(String first,String last){
this.first=first;this.last=last;
}

public boolean equals(aa n){
return n.first.equals(first) && n.last.equals(last);
}

public int hashCode(){
return first.hashCode()+last.hashCode();
}

public static void main(String arg[]){
Set<aa> s=new HashSet<aa>();
s.add(new aa("Tom","Cruise"));
System.out.println(s.contains(new aa("Tom","Cruise")));
}
}能讲解下吗?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【ying0305】截止到2008-06-24 10:53:46的历史汇总数据(不包括此帖):
    发帖数:12                 发帖分:290                
    结贴数:11                 结贴分:260                
    未结数:1                  未结分:30                 
    结贴率:91.67 %            结分率:89.66 %            
    值得尊敬
      

  2.   

    楼主看下API文档,不包含指定元素的时候返回true的,现在两个元素是相等的,当然返回false
      

  3.   

    contains(Object o) 
              如果 set 包含指定的元素,则返回 true。这是我API档的写法,莫非API档都有不同的?
      

  4.   

    你contains后面都new了一个aa,当然跟它里面的aa不一样啊.
    指向的内存地址不一样.
      

  5.   

    contains不用equals或者hashcode比吗?
      

  6.   

    s.add(new aa("Tom","Cruise")); //新建对象new aa("Tom","Cruise") 并添加
    System.out.println(s.contains(new aa("Tom","Cruise"))); //比较新建的对象
    contains方法指的是对象地址,两个都是新建对象,地址不同,当然为False
      

  7.   

    是我的API有问题,我当时看的时候也有点怪呢,呵呵
    唯一能解释的应该是Set中存放的是一个对aa对象的引用,而Set比较两个元素是否相等不是调用该元素的equals()方法(API上写是调用元素的equals方法,但是楼主重写了equals方法,两个元素是相等的),而是直接比较两个元素的引用是否指向同一地址,如果是则相等
      

  8.   

    嗯,contains可能不用equals比而是调用自己的方法吧,谢谢大家!