黑马程序员技术交流社区

标题: 求助HashSet的问题 [打印本页]

作者: trhthyj    时间: 2014-5-9 06:17
标题: 求助HashSet的问题
添加元素时先比较地址值,如果地址值相同再比较对象是否相同,那下面这段代码中难道不是添加了两个“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. }
复制代码

作者: trhthyj    时间: 2014-5-9 06:57
还有一个问题是:为什么往集合里添加字符串对象时不用进行强转动作?
作者: 清规欲    时间: 2014-5-9 09:09
因为字符串常量池里只存在一个  “java04”
作者: 清规欲    时间: 2014-5-9 09:12
清规欲 发表于 2014-5-9 09:09
因为字符串常量池里只存在一个  “java04”

集合都加了 泛型 ,如果没有指定泛型默认为 Object ,所有类都继承Object ,可以将子类对象赋值给父类变量,所以....
作者: 焚雨成灰    时间: 2014-5-9 09:12
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.     }
复制代码

作者: 神马    时间: 2014-5-9 13:53
同意楼上,根据String类的hashCode算法,两个相同的字符串的hashCode值是相等的。
作者: 彭飞    时间: 2014-5-9 16:23

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

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

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




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