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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© trhthyj 中级黑马   /  2014-5-9 06:17  /  1339 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

添加元素时先比较地址值,如果地址值相同再比较对象是否相同,那下面这段代码中难道不是添加了两个“java04”对象吗?它们的地址值为什么相同?
  1. import java.util.*;
  2. class HashSetDemo
  3. {
  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);
  7.         }
  8.        
  9.         public static void main(String[] args)
  10.         {
  11.                 HashSet hs=new HashSet();
  12.                 hs.add("java01");
  13.                 hs.add("java02");
  14.                 hs.add("java03");
  15.                 hs.add("java04");
  16.                 hs.add("java04");//为什么这两个java04地址值相同?


  17.                 Iterator it=hs.iterator();
  18.                 while(it.hasNext())
  19.                 {
  20.                         sop(it.next());
  21.                 }
  22.         }
  23. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
天涯追梦 + 1

查看全部评分

8 个回复

倒序浏览
还有一个问题是:为什么往集合里添加字符串对象时不用进行强转动作?
回复 使用道具 举报
因为字符串常量池里只存在一个  “java04”
回复 使用道具 举报
清规欲 发表于 2014-5-9 09:09
因为字符串常量池里只存在一个  “java04”

集合都加了 泛型 ,如果没有指定泛型默认为 Object ,所有类都继承Object ,可以将子类对象赋值给父类变量,所以....
回复 使用道具 举报
HashSet比较的并不是地址值而是Hash值,字符串的Hash值是由字符串中的字符计算出来的
  1. public int hashCode() {
  2.         int h = hash;
  3.         if (h == 0 && value.length > 0) {
  4.             char val[] = value;

  5.             for (int i = 0; i < value.length; i++) {
  6.                 h = 31 * h + val[i];
  7.             }
  8.             hash = h;
  9.         }
  10.         return h;
  11.     }
复制代码
回复 使用道具 举报
同意楼上,根据String类的hashCode算法,两个相同的字符串的hashCode值是相等的。
回复 使用道具 举报

HashSet   首先比较的是哈希地址值。并且是不可重复的。
当你添加第一个Java04的时候,集合中没有这个哈希地址值,而后再添加的时候,底层调用一对比,发现已经有了相同哈希地址值,然后不在存入。

为了程序的精密和安全性,应该覆盖HashCode   和 equals   方法。你的视频应该马上就会看到。

list 和Set  最大的区别就是前者同步,可重复,后者 不同步,不可重复,  父类如此, 子类必然继承这2大特性。
回复 使用道具 举报
因为Hashset 底层数据结构式哈希表,它将要存储的元素通过哈希算法算出一个哈希值来标识存储的位置。如果哈希值相同,会在次判断元素的equals方法,看内容是否相同。它保证元素唯一性依赖的方法是hashcode和equals.
第二个问题:为什么往集合里添加字符串对象时不用进行强转动作?那是因为集合添加方法接收的是任意对象。所以不用强转。
回复 使用道具 举报
两个字符串的hashcode和equal相同被认为是同一对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马