HashSet不是不能添加相同的元素吗?怎么我添加成功了?

luobing_2008 2011-08-31 06:51:01
HashSet<int[]> set = new HashSet<int[]>();
int[] whole= {1,2};
set.add(whole);
int[] xwhole= {1,2};
set.add(xwhole);
Iterator<int[]> ite = set.iterator();
while (ite.hasNext()) {
System.out.println(Arrays.toString(ite.next()));
}

打印结果:

[1, 2]
[1, 2]
...全文
434 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luobing_2008 2011-08-31
  • 打赏
  • 举报
回复
HashSet是一个不包含重复元素的 collection。更确切地讲,HashSet 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。
luobing_2008 2011-08-31
  • 打赏
  • 举报
回复
楼上的数组,什么时候变成对象了?
r4141496091 2011-08-31
  • 打赏
  • 举报
回复
明显是两个不同的对象!!!!!!! hashcode除非重写,否则他们在hashset里面用于不是相等
风尘中国 2011-08-31
  • 打赏
  • 举报
回复

那你就不要使用数组,面向对象编程也尽量不使用数组,你可以用其他的数据类型存储数字,你说的已经是另外一

个问题了,你可以CSDN再开一个帖子讨论,这个帖子应该结了

[Quote=引用 10 楼 luobing_2008 的回复:]

楼上的解释非常好,那我要到HashSet中添加10000个不同的数组,起不没办法了?能指教下吗?
[/Quote]
阳明 to life 2011-08-31
  • 打赏
  • 举报
回复
这种东西有源码直接看源码就知道了,你如果重写hashcode和equals方法那就另当别论了
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {//这里就是原因所在
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}

modCount++;
addEntry(hash, key, value, i);
return null;
}
luobing_2008 2011-08-31
  • 打赏
  • 举报
回复
楼上的解释非常好,那我要到HashSet中添加10000个不同的数组,起不没办法了?能指教下吗?
风尘中国 2011-08-31
  • 打赏
  • 举报
回复
不好好看回复,告诉你调用whole.equals(xwhole)你去调用Arrays.equals(whole, xwhole)干嘛,你调用的方法就是根据两个数组的逻辑值是否一样返回结果,而HashSet调用的是whole.equals(xwhole)或者xwhole.equals(whole)判断是否是一个元素,你执行下面的main函数,一切都明白
你运行下
public static void main(String[] args){
HashSet<int[]> set = new HashSet<int[]>();
int[] whole= {1,2};
set.add(whole);
int[] xwhole= {1,2};
set.add(xwhole);
Iterator<int[]> ite = set.iterator();
while (ite.hasNext()) {
System.out.println(Arrays.toString(ite.next()));
}
System.out.println(whole.equals(xwhole));
}


[Quote=引用 7 楼 luobing_2008 的回复:]

Java code
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;


public class Main {

public static void main(String[] args) {

HashSet<int[]> set = new ……
[/Quote]
luobing_2008 2011-08-31
  • 打赏
  • 举报
回复
那个高手能解释下吗?
luobing_2008 2011-08-31
  • 打赏
  • 举报
回复
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;


public class Main {

public static void main(String[] args) {

HashSet<int[]> set = new HashSet<int[]>();
int[] whole= {1,2};
set.add(whole);
int[] xwhole= {1,2};
set.add(xwhole);
Iterator<int[]> ite = set.iterator();
while (ite.hasNext()) {
System.out.println(Arrays.toString(ite.next()));
}
System.out.println(whole);
System.out.println(xwhole);
System.out.println(Arrays.equals(whole, xwhole));
}

}

打印结果:

[1, 2]
[1, 2]
[I@6bbc4459
[I@152b6651
true
huntor 2011-08-31
  • 打赏
  • 举报
回复

System.out.println(whole.hashCode());
System.out.println(xwhole.hashCode());
System.out.println(whole.equals(xwhole));
System.out.println(Arrays.toString(whole.getClass().getInterfaces()));


6727959
31929496
false
[interface java.lang.Cloneable, interface java.io.Serializable]
淡定的峰哥 2011-08-31
  • 打赏
  • 举报
回复
数组是没有重写hashCode方法的
luobing_2008 2011-08-31
  • 打赏
  • 举报
回复
我没重写呀,就一个main入口函数打印的
风尘中国 2011-08-31
  • 打赏
  • 举报
回复
你添加的仍然是不同的元素,whole和xwhole虽然逻辑内容一样但是他们二者并不一样,你调用xhole.equals(whole)看看输出结果还是false
打油的程序员 2011-08-31
  • 打赏
  • 举报
回复

你运行这两句,看看结果

System.out.println(whole);
System.out.println(xwhole);
lanjingling539 2011-08-31
  • 打赏
  • 举报
回复
hashset是不能添相同的元素的,你看你重新equals()和hashcode()方法了吗

62,615

社区成员

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

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