哈希值
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得的地址,不是数据实际存储的物理地址)
在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位 那么就会把链表转换 为红黑树(提高查询的速度)