带着问题去理解:

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值一定相同

Java底层技术系列文章-hashcode深入理解的更多相关文章

  1. 跟我学-Java底层技术系列文章

    对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库  HashCode深入理解 java线程框架窥探 2.集合类     java枚举类使用 递归 ...

  2. Java底层技术系列文章-总揽

    对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库  HashCode深入理解 java线程框架窥探 2.集合类     java枚举类使用 递归 ...

  3. Java底层技术系列文章-线程池框架

    一.线程池结构图    二.示例 定义线程接口 public class MyThread extends Thread { @Override publicvoid run() { System.o ...

  4. Java 加解密技术系列文章

    Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...

  5. 深入理解java内存模型系列文章

    转载关于java内存模型的系列文章,写的非常好. 深入理解java内存模型(一)--基础 深入理解java内存模型(二)--重排序 深入理解java内存模型(三)--顺序一致性 深入理解java内存模 ...

  6. Java内存模型解惑--观深入理解Java内存模型系列文章有感(二)

    1.volatile关键字修饰的域的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用 ...

  7. 夯实Java基础系列10:深入理解Java中的异常体系

    目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...

  8. 如何才能够系统地学习Java并发技术?

    微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些 ...

  9. java底层学习

    额,马上就要面试了,Java的底层肯定是需要了解的.网上找了找java的底层文章,做个记号.java底层主要是类的加载.连接和初始化. 本文主要分为四个方面: (1)java底层概述 (2)new和n ...

随机推荐

  1. C#中??操作符的使用

    为了实现Nullable数据类型转换成non-Nullable型数据,就有了一个这样的操作符”??(两个问号)“,双问号操作符意思是取所赋值??左边的,如果左边为null,取所赋值??右边的, 比如i ...

  2. 第一次做C++项目的一点小总结

    本人原本一菜鸟java程序员,但业余涉猎还算广泛,稍微了解些C++内容.主要之前曾爱好过汇编语言.所以对于C语言能从汇编层面加以理解,C++则是在此基础上又加了面向对象.stl等一类东西嘛. 这次做了 ...

  3. Android零基础入门第73节:Activity初入门,创建和配置如此简单

    Activity是Android应用的重要组成单元之一,也是Android应用最常见的组件之一.前面看到的示例通常都只包含一个Activity或一个AppCompatActivity,但在实际应用中这 ...

  4. HDFS的几点改进

    HDFS(Hadoop Distributed File System)是一个运行在商用机器上面的分布式文件系统,其设计思想来自于google著名的Google File System论文. HDFS ...

  5. ML:吴恩达 机器学习 课程笔记(Week5~6)

    Neural Networks: Learning Advice for Applying Machine Learning Machine Learning System Design

  6. postgresql + JDBC 学习

    Based on debian 9, postgresql 9.6 and Java 8, at Dec-24-2018 ======================================= ...

  7. Python字典的合并与拆分

    1.字典的合并 dict1={1:[1,11,111],2:[2,22,222]} dict2={3:[3,33,333],4:[4,44,444]} dictMerged2=dict(dict1, ...

  8. 细谈unity资源加载和卸载

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...

  9. 高并发 Nginx+Lua OpenResty系列(10)——商品详情页

    本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后 ...

  10. Fabric1.4源码解析: 链码容器启动过程

    想写点东西记录一下最近看的一些Fabric源码,本文使用的是fabric1.4的版本,所以对于其他版本的fabric,内容可能会有所不同. 本文想针对Fabric中链码容器的启动过程进行源码的解析.这 ...