哈希值和HashSet集合存储数据的结构

哈希值

  哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)

  在object类有一个方法,可以获取对象的哈希值

  int hashcode()返回该对象的哈希码值。

  hashcode方法的源码:

    public native int hashcode();

    native:代表该方法调用的是本地操作系统的方法

复制代码
public static void main(String[] args) {
        // Person类继承了object类,所以可以使用object类的hashcode方法
        Person p1 = new Person();
        int h1 = p1.hashCode();
        System.out.println(h1);//1967205423
        Person p2 = new Person();
        int h2 = p2.hashCode();
        System.out.println(h2);//42121758
       /*
        tostring方法的源码:
         return getClass( ).getName( ) +“@”+ Integer.toHexString(hashCode());
        */
        System.out.println(p1);
        System.out.println(p2);

        String s1 = new String( "abc") ;
        String s2 = new String("abc");
        System.out.println(s1.hashCode());
        System.out.println("重地".hashCode()) ;
        System.out.println("通话".hashCode());
    }
复制代码
复制代码
class R{
    int count;
    public R(int count){
        this.count = count;
    }
    public String toString(){
        return "R[count:"+count+"]";
    }
    public boolean equals(Object obj){
        if(this == obj)
            return true;
        if(obj != null && obj.getClass() == R.class){
            R r = (R)obj;
            return this.count == r.count;
        }
        return false;
    }
    public int hashCode(){
        return this.count;
    }
}
 
 
public class HashSetTest2{
    public static void main(String[] args){
        HashSet hs = new HashSet();
        hs.add(new R(5));
        hs.add(new R(-3));
        hs.add(new R(9));
        hs.add(new R(-2));
        //打印HashSet集合,集合元素没有重复
        System.out.println(hs);
        //取出第一个元素
        Iterator it = hs.iterator();
        R first = (R)it.next();
        //为第一个元素的count实力变量赋值
        first.count = -3;
        //再次输出HashSet集合,集合元素有重复元素
        System.out.println(hs);
        //删除count为-3的R对象
        hs.remove(new R(-3));    //删除的是原本定义为-3的对象,而不是后面改动的对象。因为HashSet根据hashCode值定位。
        System.out.println(hs);
        System.out.println("hs是否包含count为-3的对象?"+hs.contains(new R(-3)));    //结果为false,因为被删除了
        System.out.println("hs是否包含count为-2的R对象?"+hs.contains(new R(-2)));    //结果为false,因为值被改动了
    }
}
复制代码

 

HashSet集合存储数据的结构

 

 

posted @   漁夫  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示