Java底层技术系列文章-hashcode深入理解
带着问题去理解:
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深入理解的更多相关文章
- 跟我学-Java底层技术系列文章
对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库 HashCode深入理解 java线程框架窥探 2.集合类 java枚举类使用 递归 ...
- Java底层技术系列文章-总揽
对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库 HashCode深入理解 java线程框架窥探 2.集合类 java枚举类使用 递归 ...
- Java底层技术系列文章-线程池框架
一.线程池结构图 二.示例 定义线程接口 public class MyThread extends Thread { @Override publicvoid run() { System.o ...
- Java 加解密技术系列文章
Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...
- 深入理解java内存模型系列文章
转载关于java内存模型的系列文章,写的非常好. 深入理解java内存模型(一)--基础 深入理解java内存模型(二)--重排序 深入理解java内存模型(三)--顺序一致性 深入理解java内存模 ...
- Java内存模型解惑--观深入理解Java内存模型系列文章有感(二)
1.volatile关键字修饰的域的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用 ...
- 夯实Java基础系列10:深入理解Java中的异常体系
目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...
- 如何才能够系统地学习Java并发技术?
微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些 ...
- java底层学习
额,马上就要面试了,Java的底层肯定是需要了解的.网上找了找java的底层文章,做个记号.java底层主要是类的加载.连接和初始化. 本文主要分为四个方面: (1)java底层概述 (2)new和n ...
随机推荐
- RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密
原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...
- OC笔记一:Objective
1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码 ...
- 零元学Expression Blend 4 - Chapter 32 简单轻松的学会如何使用Visual States(上)
原文:零元学Expression Blend 4 - Chapter 32 简单轻松的学会如何使用Visual States(上) Visual State Manager中文翻译为视觉状态管理器,这 ...
- C# TIFF图像开发
NuGet安装控件: Install-Package BitMiracle.LibTiff.NET -Version 实现代码: private BitmapSource TiffToBitmap(s ...
- WPF实现系统禁音的方法
方法1: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern ...
- WP8.1使用HttpClient类
Uri uri = new Uri("http://www.cnsos.net/weburl/index.htm", UriKind.Absolute); HttpClient m ...
- 关于EF ORM 框架的使用问题
1.无法更新 EntitySet“System_UserInfo20140218001”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping& ...
- Qt在Windows下的三种编程环境搭建(图文并茂,非常清楚)good
尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器 ...
- 插件化二(Android)
插件化二(Android) 上一篇文章<插件化一(android)>里大概构思了下插件加载与校验的流程和一些大体设计,这次就具体展开,在<动态加载与插件化>里提到以apk形式开 ...
- Oracle数据库密码重置、导入导出库命令
重置办法如下:打开CMD命令提示符,然后输入下面命令进行重置: 输入sqlplus /nolog,回车 SQL> conn /as sysdba 已连接: SQL>alter user s ...