hashCode方法 与 equals 方法

  • Object中的:
    • hashCode()
    • equals()
  • Integer中的
    • hashCode()
    • equals()
  • Character中的
    • hashCode()
    • equals()
  • Float中的:
    • hashCode()
      • 一个例子:
    • equals()
  • String 中的:
    • hashCode()
      • 一个小小的例子:
    • equals()
    • 参考目录

Object中的:

hashCode()

hashCode() 方法为本地方法,具体实现不得而知,返回一个整数,这个整数默认情况下,通常是对象的内存地址值,不过可以保证,不同的对象一定有不同的hashCode值(没有重写此方法的情况下)(hashCode()方法的建立是为了HashMap的使用)

@HotSpotIntrinsicCandidatepublic native int hashCode();

equals()

equals()方法,则是在比较两个对象的地址是否一致。

public boolean equals(Object obj) {return (this == obj);}

Integer中的

hashCode()

hashCode() 方法 返回的 直接 就是,int 类型的这个数字本身。

private final int value;
 public Integer(int value) {this.value = value;}
public int hashCode() {return Integer.hashCode(value);}
public static int hashCode(int value) {return value;}

equals()

equals()方法,则是在同为Integer类型的前提下,判断,两个数字是否相等。(也就是在比较,表示数字的二进制代码是否相同)

public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}

Character中的

hashCode()

hashCode() 方法 返回的是 字符在Unicode字符集中的十进制编号。
可以配合 查询网站,尝试:https://unicode-table.com/cn/blocks/

 private final char value;
@Deprecated(since="9")public Character(char value) {this.value = value;}
 public int hashCode() {return Character.hashCode(value);}
 public static int hashCode(char value) {return (int)value;}

equals()

equals()方法,则是在同为 Character 类型的前提下,判断,两个字符是否相等。(也就是在判断,字符的Unicode编号是否相同(底层中编号同样是二进制的))

public boolean equals(Object obj) {if (obj instanceof Character) {return value == ((Character)obj).charValue();}return false;}

Float中的:

hashCode()

hashCode() 方法,当值为NaN时,一律返回0x7fc00000,其它值,返回Float值的存储格式的二进制数,并转换为int类型的数字给予返回。

private final float value;
@Deprecated(since="9")public Float(float value) {this.value = value;}
@Overridepublic int hashCode() {return Float.hashCode(value);}
public static int hashCode(float value) {return floatToIntBits(value);}
@HotSpotIntrinsicCandidatepublic static int floatToIntBits(float value) {if (!isNaN(value)) {return floatToRawIntBits(value);}return 0x7fc00000;}
@HotSpotIntrinsicCandidatepublic static native int floatToRawIntBits(float value);

一个例子:

Float ji=3f;//输出 数值为 3 的Float存储格式的二进制内容System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(ji))+"  "+Integer.toBinaryString(Float.floatToRawIntBits(ji)).length()+"位");//输出Float类型 3数值的 hashCode值System.out.println(ji.hashCode());

在这其中,一位符号位 为 0,8位阶码域为 10000000,23位尾数域为 10000000000000000000000
符号位为0,表示为正数,8位阶码域的十进制为128,减去32位浮点数的指数偏移量127,实际指数为1。尾数域中,加上隐藏位的1,为1.100000000000000000000
将尾数域的数字的小数点,移动实际指数大小的位数,得到11.000000000000000000000
将最终值转化为十进制,即为3。

同样的hashCode() 返回的则是数值Float存储格式的二进制数值,表示的十进制数值。所以返回的是 01000000010000000000000000000000,表示的十进制数值。即为 1077936128

equals()

equals()方法,则是在同为 Float 类型的前提下,判断两个FLoat的数值是否相等(也就是在判断底层存储代表数值的二进制数值是否相等)(在floatToIntBits()方法的情况下,所有的NaN的比较记为相等,因为都为0x7fc00000,(想要区分NaN的底层可以使用floatToRawIntBits()方法))。

 public boolean equals(Object obj) {return (obj instanceof Float)&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));}

String 中的:

hashCode()

hashCode() 方法,把当前每个字符的Unicode编号进行一定的计算,来返回一个int值。

当hash的值为0时,hashIsZero的boolean的值为 true,避免重复计算。

private final byte coder;   //编码器,值通常为UTF16。也就是底层存储的是UTF16的 编码。
 /** Cache the hash code for the string */private int hash; // Default to 0
/*** Cache if the hash has been calculated as actually being zero, enabling* us to avoid recalculating this.*/private boolean hashIsZero; // Default to false;
 public int hashCode() {int h = hash;if (h == 0 && !hashIsZero) {h = isLatin1() ? StringLatin1.hashCode(value): StringUTF16.hashCode(value);if (h == 0) {hashIsZero = true;} else {hash = h;}}return h;}

StringUTF16 类中的方法

 public static int hashCode(byte[] value) {int h = 0;int length = value.length >> 1;for (int i = 0; i < length; i++) {h = 31 * h + getChar(value, i);}return h;}
  @Native static final byte LATIN1 = 0;@Native static final byte UTF16  = 1;

一个小小的例子:

        String agt="你好";System.out.println(agt.hashCode()+" String hash");

可以查证的是,字符‘你’的Unicode编号二进制为100111101100000,十进制为20320。字符‘好’的Unicode编号二进制为101100101111101,十进制为 22909
同时,Java底层存储的是Utf-16,所以调用的是StringUTF16 类中的方法。
按照 StringUTF16 类中的方法的计算方式,我们应该是:20320×31+22909这样来计算。结果正好为652829

equals()

equals()方法,则是在判断,两个字符串,在字面上是否是相等的。(比较底层的Utf-16的编码是否相等。(在两个字节内,Unicode编号与 utf-16是一样的)(当大于两个字节时,utf-16编码,会用四个字节来表示一个字符))

public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String aString = (String)anObject;if (!COMPACT_STRINGS || this.coder == aString.coder) {return StringLatin1.equals(value, aString.value);}}return false;}
@HotSpotIntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {if (value.length == other.length) {for (int i = 0; i < value.length; i++) {if (value[i] != other[i]) {return false;}}return true;}return false;}

参考目录

jdk 源码

可以参考一哈我写的这篇,https://blog.csdn.net/norang/article/details/111661489

Object类 Integer类 Character类 Float类 String类------中的 hashCode() 方法 与 equals(Object obj) 方法的实现的探讨相关推荐

  1. Object类中的hashCode方法

    原文:http://www.bkjia.com/ASPjc/919437.html Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这 ...

  2. JAVA进阶教学之(Object类中的hashCode方法)

    import java.util.Objects;/* hashCode方法 在Object中的hashCode方法是怎样的? public native int hashCode(); 这个方法不是 ...

  3. abstract类_012 JAVA 抽象类、接口、String类的基础了解

    1.抽象方法和抽象类 抽象方法:使用abstract修饰的方法,没有方法体,只有声明.抽象方法可以当做是一种规范,让子类必须实现. 注意: 1.抽象方法没有方法体,只能以分号结尾 2.抽象方法只能声明 ...

  4. java 中String类的常用方法总结,玩转String类

    String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...

  5. Java常用类库(Object类、String类、StringBuffer类、包装类、Math类、System类)详解

    常用类库 java.lang java.lang包下放置了Java开发中常用的类和接口,所以为简化该包下类的使用,java.lang包下的类在使用时不需要导入这些类 java.lang包下常用类有: ...

  6. JavaSE学习总结(八)常用类(上)Object类==与equals方法的区别浅克隆的特点Scanner类String类String两种创建对象方式的区别String类的各种功能

    JavaSE学习总结(八)常用类(上)/Object类/==与equals方法的区别/浅克隆的特点/Scanner类/String类/String两种创建对象方式的区别/String类的各种功能 常用 ...

  7. 《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法

    散列码( hash code ) 是由对象导出的一个整型值.散列码是没有规律的.如果 x 和 y 是两个不同的对象, x.hashCode( ) 与 y.hashCode( ) 基本上不会相同. 在表 ...

  8. java number string_java基础系列(一):Number,Character和String类及操作

    这篇文章总结了Java中最基础的类以及常用的方法,主要有:Number,Character,String. 1.Number类 在实际开发的过程中,常常会用到需要使用对象而不是内置的数据类型的情形.所 ...

  9. Java基础---API概述---常用类(Object类/String类)---equals和==

    API概述 API:application programming interface,应用程序编程接口 用于规定方法名称的规则集合,定义了方法的修饰符.返回值类型.方法的名称.方法的参数列表.方法的 ...

最新文章

  1. python学习--服务期间通讯和mysql数据库操作
  2. 英文论文中i.e.,e.g.,etc.的正确用法
  3. 牛客 - 收集纸片(最短哈密顿路径-状压dp)
  4. maven打包时跳过测试
  5. ajax框架怎么学,Ajax框架之DWR学习(文件上传案例)
  6. CSS 自定义属性 -- 使用 JS 和不使用 JS
  7. 阿里云OpenSearch使用体验V1
  8. Linux x86-64 IOMMU详解(六)——Intel IOMMU参与下的DMA Coherent Mapping流程
  9. AD21怎么打印丝印层的PDF
  10. NI CompactRIO嵌入式系统开发流程总结
  11. android 百度基站定位服务器,Android基站定位原理及实现代码
  12. 美通企业日报 | 阿里收购网易考拉入股网易云音乐;宁德时代与博世达成战略合作...
  13. CSS过滤器(CSS filters)
  14. 常见的网络流量识别技术
  15. 为梦想--不抛弃,不放弃!!!
  16. java智能点餐系统研究内容_JAVA课程实践报告 基于web的点餐系统毕业设计
  17. JavaScript 和读取服务器cookie
  18. matlab 矩阵维度必须一致,错误使用 /
  19. Redis高可用 Sentinel
  20. 小议SCI 论文攻略(转载)

热门文章

  1. (dp) 力扣309. 最佳买卖股票时机含冷冻期 思路
  2. sharpen和filter2D
  3. 查看肺结节图像(luna16)
  4. 搞笑配音软件用哪个?这几款快看看
  5. Java实现Object和Map之间的转换
  6. PTA L1-043 阅览室
  7. 阿里钉钉火了,疫情过后将超过腾讯微信?
  8. Java中的byte类型是有符号的吗_JAVA中byte类型的介绍。 谢谢
  9. 小程序使用vant/weapp
  10. BASE64Decoder And BASE64Encoder