import java.util.HashSet;public class Test { public static void main(String[] args) {
String s2 = new String("this");
String s3 = new String("this");
String s4 = "this"; HashSet<String> hs = new HashSet<String>();
hs.add(s2);
hs.add(s3);
hs.add(s4); System.out.println(hs.size()); //output:1 。还望高人解答
}
}

解决方案 »

  1.   

    Set<String> setStr=new HashSet<String>()
      

  2.   

    Set就是一个不可重复的集合.Set里面已经有了的元素不会再添加进去了,但它也不会报错.
    所以Set<String>中,只能有一个"this"
      

  3.   


            String s2 = new String("this");
            String s3 = new String("this");
    s2 和s3 不是用一个对象吧?...
    用new创建的,就应该不是同一个对象,那为什么不能重复添加进hashset?
      

  4.   

    大家说的对,set装的没有重复的,添加已经有的元素不会添加,也不会报错
      

  5.   

    JDK:public interface Set<E>extends Collection<E>一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。 
      

  6.   


    Set:无顺序的,元素不可重复(值不相同) 
    遍历:迭代 
    排序:SortedSet 
    HashSet:采用哈希算法来实现Set接口 
    唯一性保证:重复对象equals方法返回为true 
    重复对象hashCode方法返回相同的整数 
    不同对象 哈希码 尽量保证不相同
    System.out.println(s2.equals(s3));
    System.out.println(s3.equals(s4));
    值都是true
      

  7.   


    import java.util.HashSet;
    import java.util.Set;public class Test {
    public boolean equals(Object o){
    return true;
    }
    public static void main(String[] args) { Set<Test> hs = new HashSet<Test>();

    Test t1 = new Test();
    Test t2 = new Test();

    hs.add(t1);
    hs.add(t2); System.out.println(t1.equals(t2));  //true
    System.out.println(hs.size());   //2
    }
    }
      

  8.   

    Set比较是否是同一个元素依赖equals方法,而不是 ==
    s2.equals(s3)); ---> true
    s3.equals(s4)); ---> true而s2 == s3 ---> false
      s3 == s4 ---> false
      

  9.   

    重写equals 和 hashCode后:...import java.util.HashSet;
    import java.util.Set;public class Test {
    public boolean equals(Object o){
    return true;
    }

    public int hashCode(){
    return 100;
    }

    public static void main(String[] args) { Set<Test> hs = new HashSet<Test>();

    Test t1 = new Test();
    Test t2 = new Test();

    hs.add(t1);
    hs.add(t2); System.out.println(t1.equals(t2));  //true
    System.out.println(hs.size());   //1
    }
    }
      

  10.   

    import java.util.HashSet;
    import java.util.Set;public class Test
    {
    /*public boolean equals(Object o)
    {
    return true;
    }*/

    public static void main(String[] args)
    {

    Set<Test> hs = new HashSet<Test>();

    Test t1 = new Test();
    Test t2 = new Test();

    hs.add(t1);
    hs.add(t2);

    System.out.println(t1.equals(t2)); // false
    System.out.println(hs.size()); //2
    }
    }
    public boolean equals(Object o)
    {
        return true;

    你让它返回true,不代表它就是t1.equals(t2) == true
    ....
      

  11.   

    没必要重写,Set用的是Object的equals而不是你自己写的equals
    看看你写的那个,不管谁调用都返回"true",这个貌似没什么意义吧?
      

  12.   


    重写的equals的返回值应该是 return false; 不然的话,你new 100个对象放set里 大小也都是1 !
      

  13.   

    String 重写了hashCode ()(至于是什么算法就不知道了) 和equals()方法的.其他类没有重写撒.没重写的时候 hashCode()是地址,所以new一个对象就插得进去.看你11楼和9楼的问题你已经解决了吧.
      

  14.   

    貌似楼主已经找到答案了,set检查完equals()还要检查hashcode(),两者缺一不可
      

  15.   


    这个没重写 hashCode()他比较地址发现不等,就不用比较equals()了.比较顺序是先 hashCode() 若相等在 equals()若hashCode()不等 那就不等了  就不调用equals()了.
      

  16.   


    equals return true 只是用来测试玩的,呵呵
      

  17.   

    1. hashSet中比较是否重复的依据是a.hasCode()=b.hasCode() && a.equals(b)
    2. String的hashCode依据: 以依赖于char[i]的int值以和char[i]的排列序的算法计算出的.不依赖String的ref.
    3. String的equals依据: a=b || ( a.length=b.length && { a[i]=b[i] } )
    4. 只有用a=b时比校的才是比校的ref,也就是说这时才是比校是a与b是不是同一个对象
    5. 结论: 两个不同ref的String可能会被认为是集合中的同一个元素.