昨天在用hashSet的时候 想起了几个问题,set是不可以重复,当往一个set里面添加对象的时候怎么判断的呢?
测试了一下 觉得是 先取得hashcode 如果相同就比较equals
如下(简写了):
Collection<User> coll = new HashSet<User>(); for (int i = 0; i < 2; i++) {
User u = new User(i, "name" + i);
coll.add(u);
}
User u = new User(0, "name0");
coll.add(u);
coll.add(u); Iterator<User> it = coll.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}这里在循环中添加的对象处理过程是比较hashcode,(这里都是相同的1),然后通过equals,我觉得是因为引用的不同 就是不同的对象,所谓的不重复
但是在下面 coll.add(u);的时候,仅仅取得hashcode就返回了,并没有添加进去,按照上面不是应该进行equals判断吗? 有人硕士因为两个u == 相等的缘故,这样更糊涂了,什么时候用equals 什么时候用==??ps:
一个对象杂新建的时候就有一个hashcode ,这个hashcode是固定的还是可以人为指定的?,比方上面的hashCode方法返回一个4,是不是说该对象的hashcode已经被改成4了?
测试了一下 觉得是 先取得hashcode 如果相同就比较equals
如下(简写了):
Collection<User> coll = new HashSet<User>(); for (int i = 0; i < 2; i++) {
User u = new User(i, "name" + i);
coll.add(u);
}
User u = new User(0, "name0");
coll.add(u);
coll.add(u); Iterator<User> it = coll.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}这里在循环中添加的对象处理过程是比较hashcode,(这里都是相同的1),然后通过equals,我觉得是因为引用的不同 就是不同的对象,所谓的不重复
但是在下面 coll.add(u);的时候,仅仅取得hashcode就返回了,并没有添加进去,按照上面不是应该进行equals判断吗? 有人硕士因为两个u == 相等的缘故,这样更糊涂了,什么时候用equals 什么时候用==??ps:
一个对象杂新建的时候就有一个hashcode ,这个hashcode是固定的还是可以人为指定的?,比方上面的hashCode方法返回一个4,是不是说该对象的hashcode已经被改成4了?
解决方案 »
- java与C++大对决!!!!!!!!!!
- 关于用java播放声音的问题之LOOP方法
- 谁帮我做下这个很简单的java题目啊?
- 请问如何知道hashtable中的values是二进字还是整型或字符传?
- JAVA Web编程中Oracle SQL的调优及表、索引的设计和优化
- -----菜鸟问题,高手帮忙啊-----
- 关于Java多线程编程的书都有哪些?
- 准备学习JAVA,问大家几个菜问题。
- 放假发分——剩下的900呵呵
- 如何在jbuider 6中将swing 控件放在自己想要放的位置 在线等待
- 如何将FlowLayout布局添加到BorderLayout 的SOUTH?
- 求救~linux系统下用java编写一个内存测试程序,算出cpu的miss rate等一大堆数据
[code]
public User(int id,String name) {
this.name=name;
this.id=id;
}
@Override
public String toString() {
return "[id="+id+" name="+name+"]";
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof User)){
return false;
}
User u=(User)obj;
if(id==u.getId()){
return true;
}
return false;
}
@Override
public int hashCode() {
return 4;
}[/code]
this.name=name;
this.id=id;
}
@Override
public String toString() {
return "[id="+id+" name="+name+"]";
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof User)){
return false;
}
User u=(User)obj;
if(id==u.getId()){
return true;
}
return false;
}
@Override
public int hashCode() {
return 4;
}
a.equals(b)==True ==> a.hashCode()==b.hashCode()
a.hashCode()==b.hashCode()对equals方法无要求
a.equals(b)==False对hashCode方法无要求
a.hashCode()!=b.hashCode() ==> a.equals(b)==False