jeckfan 2010-09-20 22:02
浏览 216
已采纳

请教hashcode相关问题

代码如下:
import java.util.*;
public class Hacode {

public static void main(String[] args) {
HashSet hs=new HashSet();
Cat a1=new Cat("aaa",1);
Cat a2=new Cat("aaa",1);
Cat a3=new Cat("bbb",2);
Cat a4=new Cat("bbb",2);
hs.add(a1);
hs.add(a2);
hs.add(a3);
hs.add(a4);
hs.add(a1);

System.out.println(hs.size());
a1.age=22;
hs.remove(a2);
System.out.println(hs.size());

}
}
class Cat {

String name;
int age;
public Cat(String n,int a){
name=n;
age=a;
}

public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + age;
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Cat other = (Cat) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

}

为什么明明已经把a1给remove了还是输出hs的size是2呢?我只知道这与hashcode有关系,但是真的没彻底搞明白。请哪位热心高人给予详细解答呢?谢谢啊

  • 写回答

3条回答 默认 最新

  • yznkaixin 2010-09-21 23:37
    关注

    不知道你有没有看过里面的源码,额。。。

    这样说吧。

    HashSet的add内部使用的是HashMap。
    Hashmap内部使用的存放数据其实是个数组。
    table[].

    刚开始put
    c1=Cat("cat",1)
    hashCode假设为1.
    那么通过一定的对这个hashCode算法算出来的hash值假设为11.

    也就是table[11]=c1.

    现在你把c1的改成Cat("cat",20)
    假设这个时候hashCode变成20.

    那么当你用现在这个去remove的时候,通过对这个hashCode的算法算出来的hash值
    就不是11了,假设为20。

    那这个时候remove就会去找
    table[20],把这个东西给remove掉。可以table[20]这个时候并没有放东西。
    所以remove不掉任何东西,就false了。

    要不你看下源码么,应该就会明白了,关注下hashMap在put的时候hash函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line