set中真的不能添加重复元素吗?

luqing414 2010-11-08 03:15:43

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test
{
public static void main(String[] args)
{
Set<Element> set = new HashSet<Element>();
Element i1 = new Element(1);
Element i2 = new Element(2);
Element i3 = new Element(3);
set.add(i1);
set.add(i2);
set.add(i3);
System.out.println("Before changed:");
printSet(set);
i1.setValue(2);
System.out.println(i1.equals(i2));
System.out.println("After changed:");
printSet(set);
}
public static void printSet(Set set)
{
Iterator it = set.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
}
class Element
{
private int value;
public Element(int value)
{
this.value = value;
}
public void setValue(int value)
{
this.value = value;
}
public int getValue()
{
return this.value;
}
@Override
public String toString()
{
return "" + this.value;
}
@Override
public boolean equals(Object obj)
{
if(this ==(Element)obj)
return true;
if (!(obj instanceof Element))
{
return false;
}
if (((Element) obj).getValue() == this.getValue())
{
return true;
}
return false;
}
@Override
public int hashCode()
{
return 37 + this.value;
}
}




在网上看到这个程序,这种先增加再修改的方法导致set有重复元素,是否违背了set的设计初衷呢
...全文
2508 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
susuifeng 2011-09-12
  • 打赏
  • 举报
回复
关注中................
eBao123 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ticmy 的回复:]

“return 37 + this.value;”
这样的hashCode还没有问题

javaAPI的描述是hashCode在一次运行中值是不应该改变的,而这个value是个动态值,显然是不按协定来

引用 13 楼 ebao123 的回复:

ticmy你叫的很多,但其实反而证明了你不懂hashcode,equals。
楼主的例子里的hashcode和equals是没问题的。……
[/Quote]

在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。

看懂前提了吗?
你的发言暴露了你从来没有写过hashcode的真相。
zhujyy520 2010-11-10
  • 打赏
  • 举报
回复
List动态集合的接口,好处是可以动态添加元素。很方便的通过Itractor迭代器来遍历集合元素。
Map是键值对形式的集合,好处是可以通过相应键找到相应的值,就好比一把钥匙开一把相应的锁。
set也是一种集合,其相邻的两个元素之间的有关系机制,好处是方便的横向的搜索相邻集合元素,但一旦删除其中的一个元素,则其相邻元素关系就得变更,不方便动态的添加和删除元素。
eBao123 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ticmy 的回复:]

“return 37 + this.value;”
这样的hashCode还没有问题

javaAPI的描述是hashCode在一次运行中值是不应该改变的,而这个value是个动态值,显然是不按协定来

引用 13 楼 ebao123 的回复:

ticmy你叫的很多,但其实反而证明了你不懂hashcode,equals。
楼主的例子里的hashcode和equals是没问题的。……
[/Quote]

我敢说你从来没有自己写过hashcode()方法,也根本不知道hashcode的意义。
自定义类的hashcode()就是要使用值而不是使用地址,这样才能真正的判断值的相等性而不是地址的相等性。懂?
OopsJeff 2010-11-10
  • 打赏
  • 举报
回复
set 只是在 添加元素的时候会去做equals. 当里面的元素发生了变化,是不监视的
mengyalizuopeng 2010-11-10
  • 打赏
  • 举报
回复
专业顶贴。。
OopsJeff 2010-11-10
  • 打赏
  • 举报
回复
是的 set 不能重复. list可以重复
set 乱序 list是顺序
TearsStoneJava 2010-11-10
  • 打赏
  • 举报
回复
学习ing
龙四 2010-11-10
  • 打赏
  • 举报
回复
“return 37 + this.value;”
这样的hashCode还没有问题

javaAPI的描述是hashCode在一次运行中值是不应该改变的,而这个value是个动态值,显然是不按协定来

[Quote=引用 13 楼 ebao123 的回复:]

ticmy你叫的很多,但其实反而证明了你不懂hashcode,equals。
楼主的例子里的hashcode和equals是没问题的。
[/Quote]
欢乐极客 2010-11-09
  • 打赏
  • 举报
回复
Set是无序不重复,List是有序重复
可以使用Set x = new HashSet(listInstance);的方式将有序重复的List转为无序不重复的~
反之却不怎么能~~
kebin0001 2010-11-09
  • 打赏
  • 举报
回复
15F 引用的原文已經說明了原因。

這裡補充一點,所謂不重複應該指的是可識別的資料,有 ID 的隱含意義,
所以這種資料不應該是可修改的。
因此修改ID造成物件重複,應該算是設計產生的 bug。

最後回到原問題 set中真的不能添加重复元素吗?
的確不能"添加"重複元素,但可以"修改"元素使其重複。
eBao123 2010-11-09
  • 打赏
  • 举报
回复
22楼你说了这么多,你看楼主的代码了吗?
add进来的时候是不等的,我add进来再把其中的一个值改成等于另一个值。懂了吗?
卡比兽的球 2010-11-09
  • 打赏
  • 举报
回复
最后是用element.value 比较两个对象
set保证没有相同的对象 但是不能保证 没有2个拥有相同属性值的对象吧
坐等高人解答
jspwind 2010-11-09
  • 打赏
  • 举报
回复
Set 集合是不允许重复的,估计地球人都知道,可是他是怎么算出重复数据并且不添加到集合里的呢?就有不少人不了解了。

Set 集合重复与否主要依赖于hashcode与equals,估计也是地球人都知道的。

Set 集合在add 的时候到底做了什么事呢?

Set 集合在add 时,就会先去执行添加进行来的对像的hashcode方法。然后再去这个Set集合里找这个hashcode这个码是否存在这个Set集合地址中,如果存在那么就调用这个对像的equals去处理,equals返回false表示不是同个对像,前面说了在地址中存在了,但equals是false。所以这个对像照样添加天set。
如果这个equlas返回true,那个Set集合就认为。这是同一个对像。不加进行添加操作。

如果hashcode这个码不存在这个Set集合地址中。则直接添加到Set .而不进行equals操作。

所以得出一个结论:
有相同hashcode的对像。可以存放在一个Set中,有相同equals的对像不能存放在同一个Set中。


eBao123 2010-11-09
  • 打赏
  • 举报
回复
脑残好多啊。
Set只在add的时候保证唯一性,你add进来后再改Set就管不了了。
也就是说,Set中是可以存在非唯一性的情况的。
当然,正常情况下我们要避免add进来后再修改对象的值。
niemengwem 2010-11-09
  • 打赏
  • 举报
回复
很黄很暴力
tmhk123 2010-11-09
  • 打赏
  • 举报
回复
这个用怀疑吗
liukelin 2010-11-09
  • 打赏
  • 举报
回复
现在还没有学到那里帮不了忙。
ScAREcrOw_ss 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 waiter081 的回复:]

你想跟sun公司叫板?
[/Quote]

Oracle
waiter081 2010-11-09
  • 打赏
  • 举报
回复
你想跟sun公司叫板?
加载更多回复(15)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧