黑马程序员技术交流社区
标题:
关于一个Set集合的问题
[打印本页]
作者:
在乎..
时间:
2013-7-19 00:59
标题:
关于一个Set集合的问题
class abc{
private int a;
public abc(int i){
this.a=i;
}
public int hashCode(){
return 1;
}
public boolean equals(){
if(this.a==1)
{
return true;}
else
return false;
}
}
...
abc a=new abc(5); abc b=new abc(1); abc c=new abc(5); Collection<abc> c1=new HashSet<abc>(); c1.add(a); c1.add(b); c1.add(c); System.out.println(c1.size()); //打印是3 ,为什么b还能存进去?不是太懂
作者:
a767175432
时间:
2013-7-19 01:25
b是添加不进去的,你现在添加进去了是因为equals(Object o)没有被重写,你这是重载所以会添加进入
还有建议编码风格需要改正,类名大写
作者:
周之浩
时间:
2013-7-19 08:20
本帖最后由 周之浩 于 2013-7-19 08:23 编辑
hashSet中不能存放两个用equals(重写父类Object类的equals(Object obj))比较相等的值,如果两个对象用equals比较为true则只能放入一个对象,后放入的对象被丢掉而你的程序中没有用equals方法比较相同的两个对象,可以看看我写的小例子如果不懂我再给你讲讲
package com.ccit;
import java.util.Collection;
import java.util.HashSet;
public class HashTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<People> coll = new HashSet<People>();
People p1 = new People("zhou", 22, "男");
People p2 = new People("zhan", 25, "女");
People p3 = new People("lisi", 26, "男");
People p5 = new People("zhou", 28, "女");
People p4 = new People("zhou", 22, "男");
coll.add(p1);
coll.add(p2);
coll.add(p3);
coll.add(p4);
coll.add(p5);
System.out.println(coll.size());
for(People p : coll)
{
System.out.println(p);
}
}
}
class People
{
private String name;
private int age;
private String sex;
public People(String name,int age,String sex)
{
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public boolean equals(Object obj) {
boolean flag = false;
if(obj instanceof People)
{
People p1 = (People)obj;
if(this.hashCode() == p1.hashCode())
flag = true;
}
return flag;
}
@Override
public int hashCode() {
return name.hashCode()+sex.hashCode()+age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.name+"\t"+this.age+"\t"+this.sex;
}
}
复制代码
作者:
肥猫
时间:
2013-7-19 08:47
本帖最后由 肥猫 于 2013-7-19 08:58 编辑
关键就在于你的3个NEW,而且你的EQUALS方法的重写是重点。当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,
就调用它的equals方法与新元素进行比较,相同的话就不存了,{不相同就散列其它的地址。},最主要的是:{你的EQUALS方法重写的有问题,比较对象属性是否为1?这里因该用来比较两个对象才对,你这么做就是JVM就默认了两个对象为FALSE了,因为BOOLEAN默认的EQUALS去比较了。相当与你那EQUALS方法是废的,就是这样。}这就是为什么会有3个的原因了。
再清楚点说HASHCODE值只是用来分配存储空间地址和查询用的,主要的判定还是EQUALS。
作者:
Mr_Free
时间:
2013-7-27 22:28
package cn.itcast.day3;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class hashProblem {
public static void main(String[] args){
Abc a=new Abc(5);
Abc b=new Abc(1);
Abc c=new Abc(5);
Collection<Abc> c1=new HashSet<Abc>();
c1.add(a);
c1.add(b);
c1.add(c);
Iterator it = c1.iterator();
while(it.hasNext()){
Abc abc = (Abc)it.next();
System.out.println("get对象的a值"+abc.getA());
}
System.out.println(c1.size()); }
}
class Abc{
private int a;
public Abc(int i){
this.a=i;
}
public int getA()
{
return this.a;
}
public int hashCode(){
return 1;
}
public boolean equals(Object obj){
Abc ab =(Abc)obj;
if(ab.a==1)
{
return true;
}
else
return false;
}
}
复制代码
我帮你把代码改了下,问题出在equals方法上面 因为你这里用的equal()里面没有写参数,所以没有覆盖Object的方法,所以就不能按照你的方法判断。b写进去的原因是你new了3次,内存创建3次地址空间,这3个对象分别指向3个地址空间,所以肯定不相等,然后就存进去了。
作者:
sergio
时间:
2013-7-29 20:05
{:soso_e136:}hashCode()中最好不要写固定值返回值,写的固定值的话,挂在同一个单向链表下,数据不能均匀分布也就起不到增删效果了,要均衡分布,最好像这样:a.hashCode()获取当前变量的哈希值来增加元素。
第二个:equals()方法写的有些问题。如下的你可以参考下:
public boolean equals(Object o)
{
if(this == o)
{
return true;
}
if(o instanceof abc)
{
abc aABC = (abc)o;
if(aABC.a.equals(this.a))
{
return true;
}
}
return false;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2