Set容器的问题

神勇无敌.ZXF 2007-11-11 01:08:18
运行结果是1, 为什么不是3?


import java.util.HashSet;
import java.util.Set;

public class TestSet {

public int hashCode(){
return 1;
}

public boolean equals(Object b){
return true;
}

public static void main(String[] args){
Set set=new HashSet();
set.add(new Test());
set.add(new Test());
set.add(new Test());
System.out.println(set.size());
}
}
...全文
63 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdd330 2007-11-15
  • 打赏
  • 举报
回复
Set set=new HashSet();
System.out.println(set.add(new Test(1)));
System.out.println(set.add(new Test(2)));
System.out.println(set.add(new Test(3)));

结果true
false
false

你把对象的身份标识重写
public int hashCode(){
return 1;
}

public boolean equals(Object b){
return true;
}
所以HashSet认为它们是重复的对象,所以后面两次添加失败。size = 1
malong_01223 2007-11-14
  • 打赏
  • 举报
回复
你的代码看不出问题来,做了些改变:

import java.util.HashSet;
import java.util.Set;

public class Test{
private int i;
public Test(int i){
this.i = i;
}
public int hashCode(){
return 1;
}

public boolean equals(Object b){
return true;
}

public static void main(String[] args){
Set set=new HashSet();
set.add(new Test(1));
set.add(new Test(2));
set.add(new Test(3));
System.out.println(set.size());
}
}


执行结果还是:1
因为你重写了equals方法,每次添加时,调用此equals方法比较,可是此方法只返回真,也就是不管添加的对象是否相同都认为是相同的,所以不进行添加了,Set内只有对象new Test(1)的引用。没有new Test(2),new Test(3)的引用。
zdjray 2007-11-14
  • 打赏
  • 举报
回复
你故意跟自己作对么?
Set的定义可以看文档
jk88811 2007-11-11
  • 打赏
  • 举报
回复
faint, 基础不扎实...
kaiserlu 2007-11-11
  • 打赏
  • 举报
回复
Set就是传说中的散列表了,不能存储重复的元素。

至于HashSet就是由HashMap的实例来支持,它通过对所存储的对象的hashCode()方法返回的hash码来决定存放位置。
因为你的类中重写了hashCode()方法,并且每次返回都一样,所以在Set中只能存放一个。

有关HashSet的详细信息请查看源代码!!!或API文档
神勇无敌.ZXF 2007-11-11
  • 打赏
  • 举报
回复
读程序呀, 我是不理解程序的执行结果, 估计对Set容器知识点没掌握. 上面类名写错了, 应该是Test
kloyf 2007-11-11
  • 打赏
  • 举报
回复
这个set容器干什么用的?

62,614

社区成员

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

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