265/266哈希值和HashSet集合储存数据的结构(哈希表)

哈希值

 哈希值就是:对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

更重要的是:这里的内存地址是JVM虚拟机虚拟出来的地址,并不是真实的物理内存地址。

哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,

是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的(下面我们也会详细介绍怎么弄成相同的),

也就是说哈希值是一种逻辑上的确保唯一性,而地址值就是物理上确保唯一性。

public static void main(String[] args) {
        //person类继承了Object类所以就可以使用Object类的hashcode方法
        Person p1 = new Person();
        int i1 = p1.hashCode();
        System.out.println(i1);

        Person p2 = new Person();
        int i2 = p2.hashCode();
        System.out.println(i2);

    /**
     * toString方法的源码
     */
    System.out.println(p1);
    System.out.println(p2);
} }
运行结果:


public class extends Object{
@Override
//重写hashset方法
public int hashCode(){
return 1;


/**
* String类的哈希值
* String类重写Object类的hashCode方法
*/
String s1 = new String("aaa");
String s2 = new String("bbb");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());

什么时哈希表

在DK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同hash值的链表都存储在一个链表里。

但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。

而DK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时

,将链表转换为红黑树,这样大大减少了查找时间

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

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

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

hashcode方法的源码:

public native int hashcode()

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

 

posted @ 2022-07-07 10:30  ja不会va  阅读(76)  评论(0)    收藏  举报