java之地址值和hash值的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之地址值和hash值的关系相关的知识,希望对你有一定的参考价值。

首先先说hash值,hash值是通过hashCode()Object有这个方法(个别重写的先不谈如String),你可以去看Object中的hashCode()方法;这个方法上面有(@.....说明英语不好 反正就是表示非显示不给看的)(被native修饰过的说明不是用本语言写的就是不是java来实现的),总的来说这个方法就是通过hash算法来的(后面一个数永远等于前面两个数之和),这个就是哈希值;而电脑是怎么算的呢?每一个东西都有一个ASCII码比如a是97....然后现在都是通过斐波那契算法来算的(想了解的自己去百度),应该明白哈希值了吧。
然后说说地址值吧,每一个东西都会被电脑放在硬盘内存里面,然后电脑通过hash算法得到hash值,最后你的地址值就hash值的十六进制,所以那些地址值有小写字母什么的。
所以你有时候重写hashCode方法注意返回值是int类型但是不是十进制哦!不然会出现erro异常的。所以一般重写hashCode都是直接返回1即不会输入特别复杂的数组,不然你还要转十六进制;还帮你扩展扩展,equals除了String重写了不同以外,都是继承了Object类的equlas方法;注意equals比较的也是是否是同一个对象和"=="一样的一个比较基本数据类型一个比较引用类型的。但是我们只能重写“equals”,基本数据类型系统自带不给你显示的所以我也看不到,其实equals不重写的话比较的就是地址码,就是hashCode方法得来的。集合hashSet有时候不能满足我们加入的条件需要我们自己重写equlas和hashCode方法了,前面也说了 其实可以只重写hashCode方法就可以了,那为什么都要一起写呢,因为你不觉得十六进制的转换很麻烦吗?为了效率基本上都是直接return1;你的条件都是写在equals里面。
你可以去试试重写hashCode方法,在打印这个类对象,显示的就是包名加地址码了,不要超过十六这个数字会抛erro异常的。
参考技术A 地址是存储某个数据的位置信息,两个地址相同的对象,根本上就是同一个,其中一个的内容变化,另一个也同样变化,直到其中一个变量指向另一地址。
哈希值是对象所有或者指定内容根据一特定算法得到的值,java对象中继承自object类的equals方法就是默认比较哈希值的,两个不同地址的对象,如果哈希值相同,使用默认比较方法是会被认为相等,但是一个对象变化并不会引起另一个的反应。
当然对象的哈希计算方法也可以重写,只是这样得到的结果并不是我们一般情况下讨论的哈希值。equals方法同理。
纯手打,求采纳。
参考技术B hash值是摘要,类似md5值。java应该没地址这种说法吧,我记得c语言才有

关于java中基础数据类型传值和引用类型传值的总结

先看一组代码:

public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int[] array = {1,2};
        swap(a, b);
        System.out.println(a + " " + b);
        swap(array, 0, 1);
        System.out.println(array[0] + " " + array[1]);
    }
    public static void swap(int x,int y){
        int z = x;
        x = y;
        y = z;
    }
    public static void swap(int[] array,int x,int y){
        int xx = array[x];
        int yy = array[y];
        array[x] = yy;
        array[y] = xx;
    }

最后结果分别是1,2(基础数据类型传值);2,1(引用数据类型传值)

基础数据类型传值和引用数据类型传值的区别

基本变量类型:

在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的

引用变量类型:

只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址

! 地址的区别

在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的

也就是说

public static void swap(int x,int y)

这里的x和y实际上是新开创的地址,然后将外部的a和b的数值复制而成的。
因此在方法内部对x和y的任何操作都不会对外部的a和b造成影响

引用数据类型变量,调用方法时作为参数是按引用传递的

public static void swap(int[] array,int x,int y)

我们可以看到,这里传进去的x和y,是array数组的下标。
也就是说,所谓引用传递,就是说传进方法内的是外部a和b两个数所在的地址
因此,在方法内部,是对计算机底层对应地址中的数进行操作,由于外部的数实际上就是对应地址中的值,所以外部的数也就被改变了。

以上是关于java之地址值和hash值的关系的主要内容,如果未能解决你的问题,请参考以下文章

幸运值和随机数之间的关系

Hashmap的实现原理

分布式之一致性hash

nginx 负载均衡之一致性hash,普通hash

Redis数据类型之散列(hash)

java8 hash算法