A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jttsai 山林野马   /  2013-11-26 09:41  /  1540 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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了?

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
枫儿 + 1 + 5 神马都是浮云

查看全部评分

4 个回复

倒序浏览
new String("hello")是两个对象 但是默认貌似是把toString(s)加到set中,就是存的实际是字符串,所以hashCode是相等的 = =  
回复 使用道具 举报
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方法

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
呵呵刚刚凑巧复习到这,你可以试一下当你添加第一个hello时,sop(s1);s控制台返回的是true,当你添加第二个2 sop(s2),hello时,控制台返回的是false,因为java认为你添加了相同元素,比较了地址值相同,就会再次比较元素是否相同。发现相同就会返回false,所以第二个不会打印出来,只会打印你集合长度和第一个存储进的元素。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
  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, 下载次数: 42)

JAHG5RPIODYR%I1YDU%NLBD.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马