我建立了一个类OutLinks,里面有url和anchor。我使用set来保存这些outlinks,规则是只要url相同就算相同,不能在加入到set中。我在outlinks完成了自己的hashCode方法,可是现在的结果是url相同的结果也都加入到了set中。为什么会这样?
主函数
import java.util.*;
public class SetPrac {     public static void main(String[] args) {
        Set<OutLink> setLinks= new HashSet<OutLink>();
        OutLink[] outLinks = new OutLink[10]; 
        for(int i=0;i<outLinks.length;++i){
         outLinks[i] = new OutLink("www.aaa.com",String.valueOf(i));
        }
        for(int i=0;i<outLinks.length;++i){
         setLinks.add(outLinks[i]);
        }
        
        Iterator it = setLinks.iterator();
        while(it.hasNext()){
         System.out.println(it.next());
        }
    }
}
OutLinks.java
package CollectionPractice;public class OutLink {
private String toUrl;
private String Anchor;

public int hashCode() {
return toUrl.hashCode();
}

public String getToUrl() {
return toUrl;
}
public void setToUrl(String toUrl) {
this.toUrl = toUrl;
}
public String getAnchor() {
return Anchor;
}
public void setAnchor(String anchor) {
Anchor = anchor;
}
public OutLink(String toUrl,String Anchor){
this.toUrl = toUrl;
this.Anchor = Anchor;
}
public String toString(){
return "url: "+toUrl+"   Anchor: "+Anchor;
}
}想要的结果是set中只加入:
url: www.aaa.com   Anchor: 0
可是现在的结果是:
url: www.aaa.com   Anchor: 9
url: www.aaa.com   Anchor: 8
url: www.aaa.com   Anchor: 7
url: www.aaa.com   Anchor: 6
url: www.aaa.com   Anchor: 5
url: www.aaa.com   Anchor: 4
url: www.aaa.com   Anchor: 3
url: www.aaa.com   Anchor: 2
url: www.aaa.com   Anchor: 1
url: www.aaa.com   Anchor: 0

解决方案 »

  1.   

    因为你没有为OutLink提供equals()方法
    HashSet是通过这个方法来判断两个元素是否相同的,对于一个哈希表来说,不同的对象完全可能有相同的哈希码在OutLink类中加入下面的方法就可以了    public boolean equals(Object o) {
         if (o instanceof OutLink) 
         return this.toUrl.equals(((OutLink)o).getToUrl());
         return false;
        }
      

  2.   

    谢谢alexandertech
    是hashcode和equals都需要写吗?
    因为还有set这里还不是很熟,比如LinkedHashSet也是需要equals吗?我想找找学习一下,请问哪里有这样的详细资料呀?怎么网上找不到呢
      

  3.   

    http://www.ideyatech.com/2011/04/effective-java-equals-and-hashcode/但愿你英语不差