哈希值与哈希表

哈希值

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

  • 在Object类中有一个方法,可以获取对象的哈希值
    int hashCode() 返回该对象的哈希码值

  • hashCode方法的源码:
    public native int hashCode
    native:代表该方法调用的是本地操作系统的方法

package com.HashCode;

import java.util.Objects;
/*
   哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得的地址,不是数据实际存储的物理地址)
   在Object类中有一个方法,可以获取对象的哈希值
   int hashCode() 返回该对象的哈希码值
   hashCode方法的源码:
   public native int hashCode
   native:代表该方法调用的是本地操作系统的方法
 */
public class Demo01HashCode extends Object {
    public static void main(String[] args) {
        //Person类继承了Object类,所以可以使用Object类的hashCode方法
        Person p1 = new Person();
        int h1 = p1.hashCode();
        System.out.println(h1); //356573597   | 1

        Person p2 = new Person();
        int h2 = p2.hashCode();
        System.out.println(h2); //1735600054  | 1
        /*
        toString方法的源码
         public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }*/
        System.out.println(p1); //com.HashCode.Person@1540e19(十六进制)|com.HashCode.Person@1
        System.out.println(p2); //com.HashCode.Person@677327b6(十六进制)|com.HashCode.Person@1
        System.out.println(p1==p1); //true
        /*
              String类的哈希值
                    String类重写了Object类的hashCode方法
         */
        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(s1.hashCode());  //96354
        System.out.println(s2.hashCode());  //96354

        System.out.println("重地".hashCode()); //1179395
        System.out.println("通话".hashCode()); //1179395
    }
}

HashSet集合存储数据的结构(哈希表)

  • jdk1.8版本之前:哈希值 = 数组 + 链表
  • jdk1.8之后:
    哈希表 = 数组 + 链表
    哈希表 = 数组 + 红黑树(提高查询的速度)
  • 哈希表的特点:速度快
  • 数组结构:把元素进行了分组(相同哈希值的元素是一组)链表/红黑树结构把相同哈希值的元素连在一起
  • 哈希冲突: 两个元素不同 但是哈希值相同
  • 如果链表的长度超过了8位 那么就会把链表转换 为红黑树(提高查询的速度)
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值