您现在的位置: 哈希hash论坛 > 哈希交流群 > 哈希值与哈希表

哈希值与哈希表

来源:哈希交流群  热度:   时间:2022-05-14 18:01
哈希值 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得的地址,不是数据实际存储的物理地址) 在Object类中有一个方法,可以获...
哈希值与哈希表
哈希值
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得的地址,不是数据实际存储的物理地址)
 
在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
    }
}
1
 
HashSet集合存储数据的结构(哈希表)
jdk1.8版本之前:哈希值 = 数组 + 链表
jdk1.8之后:
哈希表 = 数组 + 链表
哈希表 = 数组 + 红黑树(提高查询的速度)
哈希表的特点:速度快
数组结构:把元素进行了分组(相同哈希值的元素是一组)链表/红黑树结构把相同哈希值的元素连在一起
哈希冲突: 两个元素不同 但是哈希值相同
如果链表的长度超过了8位 那么就会把链表转换 为红黑树(提高查询的速度)