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 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题