黑马程序员技术交流社区
标题:
求助HashSet的问题
[打印本页]
作者:
trhthyj
时间:
2014-5-9 06:17
标题:
求助HashSet的问题
添加元素时先比较地址值,如果地址值相同再比较对象是否相同,那下面这段代码中难道不是添加了两个“java04”对象吗?它们的地址值为什么相同?
import java.util.*;
class HashSetDemo
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add("java01");
hs.add("java02");
hs.add("java03");
hs.add("java04");
hs.add("java04");//为什么这两个java04地址值相同?
Iterator it=hs.iterator();
while(it.hasNext())
{
sop(it.next());
}
}
}
复制代码
作者:
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值是由字符串中的字符计算出来的
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
复制代码
作者:
神马
时间:
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