黑马程序员技术交流社区

标题: HashSet唯一性问题 [打印本页]

作者: jttsai    时间: 2013-11-26 09:41
标题: HashSet唯一性问题
Set<String> set = new HashSet<String>();

                String s = new String("hello");
                String s1 = new String("hello");

                set.add(s);
                set.add(s1);

                System.out.println("size:" + set.size());
                for (String ss : set) {
                        System.out.println(ss);
                }

为什么输出的是
size:1
hello

new String("hello")不是两个对象么?他们的hashCode不是应该不一样么?就不会比较equals了?
作者: RuntimeError!    时间: 2013-11-26 09:59
new String("hello")是两个对象 但是默认貌似是把toString(s)加到set中,就是存的实际是字符串,所以hashCode是相等的 = =  
作者: quan23355    时间: 2013-11-26 10:14
s和s1确实是两个不同的对象,按理说哈希值会不一样,但我们仔细看看hashCode方法的源码时
  1. public int hashCode() {
  2. int h = hash;
  3. if (h == 0 && count > 0) {
  4. int off = offset;
  5. char val[] = value;
  6. int len = count;

  7. for (int i = 0; i < len; i++) {
  8. h = 31*h + val[off++];
  9. }
  10. hash = h;
  11. }
  12. return h;
  13. }
复制代码

会发现,并不是比较的是地址值
h = 31*h + val[off++];由于s和s1的值是相等的,会得到一样的结果,因此哈希值也就相同了
如果我们希望比较的是地址值,自定义hashcode方法


作者: ☆星痕泪    时间: 2013-11-26 10:39
呵呵刚刚凑巧复习到这,你可以试一下当你添加第一个hello时,sop(s1);s控制台返回的是true,当你添加第二个2 sop(s2),hello时,控制台返回的是false,因为java认为你添加了相同元素,比较了地址值相同,就会再次比较元素是否相同。发现相同就会返回false,所以第二个不会打印出来,只会打印你集合长度和第一个存储进的元素。
作者: ☆星痕泪    时间: 2013-11-26 10:55
  1. import java.util.*;
  2. class ArrayListTest2
  3. {
  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 Set<String> set = new HashSet<String>();

  11.         String s = new String("hello");
  12.         String s1 = new String("hello");

  13.         sop(set.add(s));//控制台输出true
  14.         sop(set.add(s1));//输出false

  15.         sop("size:" + set.size());
  16.         for (String ss : set)
  17.                 {
  18.                    sop(ss);
  19.         }        
  20.         }
  21. }
复制代码

如图

JAHG5RPIODYR%I1YDU%NLBD.jpg (16.09 KB, 下载次数: 47)

JAHG5RPIODYR%I1YDU%NLBD.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2