黑马程序员技术交流社区
标题:
关于HashSet集合的存储问题
[打印本页]
作者:
qy
时间:
2011-11-15 10:20
标题:
关于HashSet集合的存储问题
HashSet集合存储对象。将对象的引用存储的到集合中
当存储的对象是同一个对象时,也就是对象的引用相同,赋予的哈希值相同
那么HashSet就会只存储一个对象,。
如:
:Person per1=new Person("黑马");
:Person per2=new Person("黑马");
Collection collections=new HashSet();
collections.add(per1);
collections.add(per2);
问题来了 -->当两个对象相同时(per1和per2),那么集合是存储的第一个对象 还是将第一个对象替换为第二个对象来存储?
作者:
史晓霞
时间:
2011-11-15 10:28
如果两个对象相同,第二个对象就不会存进来,还是第一个对象
作者:
宋文轩
时间:
2011-11-15 12:37
依然是第一个,set集合是元素不重复的集合,在存储元素的时候,会先判断是否重复,如果重复则不存,并不是覆盖。
作者:
葛雨龙
时间:
2011-11-15 17:30
第一个对象 因为比较的时候 存在相同的 就不会把第2个传进来了
作者:
qy
时间:
2011-11-15 17:37
蒽。。该贴已哦了
作者:
qy
时间:
2011-11-16 00:08
该贴未完。。。。。。。。。
。。。。。。。。。。。。。。
作者:
qy
时间:
2011-11-16 00:13
大家看 这段代码的运行结果。。并不是一个 。而是存储了两个对象
heima.jpg
(459.67 KB, 下载次数: 121)
下载附件
2011-11-16 00:12 上传
作者:
胡文杰
时间:
2011-11-16 00:36
这个谁都没有覆盖谁!是两个变量值相同的不同的对象,就是它们的哈希码不同,所以能够添加到Hashset集合里面!没有谁覆盖谁!
作者:
anerror
时间:
2011-11-16 01:25
{:soso_e136:}
存放的是obj,不是那个字符串。
Iterator it = cllo.iterator();
while(it.hasNext()){
System.out.println(it.next().hashCode());
}
不同obj的hashCode不一样。
如果你存两次相同的对象,就能看出来了
作者:
anerror
时间:
2011-11-16 01:29
{:soso_e141:}表达能力不行。
继续楼上,
比如你是用名字new出来的person对象,这里是两个叫 黑马 的人,一个东村的,一个西村的、
而不是一个 黑马往Set里面装两次。
作者:
李龙龙
时间:
2011-11-16 02:03
HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行 分组和划分对象的存储区域,object类中定义一个hashCode()方法来返回每个java对象的哈希码 当从HashSet集合查找某个对象时,java系统首先调用对象的hashCode方法获取该对象的哈希码 然后根据哈希码找到相应的存储区域,最后取出该存储区域的每一个元素与该对象进行equals方法比较,这样不用遍历集合中的所有元素就可以得到结论。新建对象哈希值不同。当覆盖hashCode和equals方法时会改变object类的hashcode方法。
当一个对象被存储进hashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段否则对象修改后的哈希值与最初存储进h在这种情况下,即使在contains方法之一该对象的当前应用作为的参数去hashSet集合中检索对象,也就返回找不到对象的结果,
这也会导致无法从hashSet集合中单独删除当前对象,从而造成内村泄露ashSet集合中时哈希值就不同了。
作者:
qy
时间:
2011-11-16 04:16
该贴注意。。那么多人都顺着我的帖子往下接,但是 给我的[color=DeepSkyBlue]错误[/color]答案 。差点也让我给误导进去了。还是一个高手私下给我说的,童鞋们!!咱不要为了得分儿神马答案都敢给吧!!
复制代码
作者:
程梦真
时间:
2014-12-21 16:04
你把2个对象的hashCode值打出来看一下 你都知道这是2个不同的对象,怎么会覆盖能,你试试基本类型应该是直接覆盖
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2