博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java底层技术系列文章-hashcode深入理解
阅读量:5019 次
发布时间:2019-06-12

本文共 1225 字,大约阅读时间需要 4 分钟。

带着问题去理解:  

    1. Object类HashCode方法是如何实现的,和String类有什么区别?

    2.HashCode和Equals之间的关系?

 

一、hashCode作用   

    hashCode方法返回该对象的哈希码值,主要是用于对象查找的快捷性,要确保同一个对象多次hashcode一定返回同样的hashcode值(其实hashcode值是有缓存)。如在HashTable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的.

 

二、HashCode实现  

     hashcode主要用于对象查找的快捷性,在设计时应尽量避免hashcode值一样造成冲突。所以要计算得到不同对象有hashcode值,应找到每个对象都不一样的特性,寻思着Object对象大概只有内存地址不一样。所以Object类中hashCode方法实现如下:

  public native int hashCode();

    Object类直接是直接调用本地c++方法中的hashCode,原因是java中是没办法拿到对象内存中的地址,所以转交给c++中实现,在底层c++代码中,通过对对象内存地址进行映射,就得到对象的散列值。  

   

    那在String类中,String类是继承Object类,会是同样的方法获得hashcode吗? 

   我们不妨来考虑String类对象的场景,String a = new String(“abc”) 和 String b = new String(“abc”),a对象和b对象的内存地址不一样,但是他们的内容是一样的。显然,如果同样采用内存的方法来获取hashcode值,就会出现相同内容,hashcode值不一样。所以在String类中,重写了hashCode方法     

   

public int hashCode() {        int h = hash;        if (h == 0 && value.length > 0) {            char val[] = value;             for (int i = 0; i < value.length; i++) {                h = 31 * h + val[i];            }            hash = h;        }        return h;}

  

 

   在String类中,是根据字符串char值相加获取hashcode值,这样使得通过new出来相同内容的对象,能够有相同hashcode值。  

 

三、hashCode与equals关系

    相同的hashcode值,equals不一定相同。这是因为不同的内存地址,有可能equals相同。

    但equals相同,hashcode值一定相同

转载于:https://www.cnblogs.com/wanwusheng/p/6117806.html

你可能感兴趣的文章
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
Codeforces Round #327 (Div. 2)
查看>>
How to install ia32-libs in Ubuntu 14.04 LTS (Trusty Tahr)
查看>>
The Ctrl & CapsLock `problem'
查看>>
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>
cmake使用
查看>>
面向对象高级
查看>>
Bitwise And Queries
查看>>
oracle连接问题ORA-00604,ORA-12705
查看>>
Java从零开始学十三(封装)
查看>>
Python2和Python3中的rang()不同之点
查看>>
lintcode28- Search a 2D Matrix- easy
查看>>
A Simple Tree Problem
查看>>
Modular Inverse [ZOJ 3609]
查看>>
Amd,Cmd, Commonjs, ES6 import/export的异同点
查看>>