Java基本类型包装类的hashCode方法,Integer、String...
2019-03-29 20:39
369 查看
hashCode方法含义
hash值在java中是一个int类型,主要用来在散列存储结构中确定对象的位置,一个好的hashCode方法应该尽量保证应尽量保证对象hash值分布的均匀性,同时减少重复hash值的出现。
Integer中的hashCode方法实现
public static int hashCode(int value) { return value; }
Integer的hashCode方法实现比较简单,直接以对应的int值作为hash值。
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; }
上面代码中的hash的定义(hash值),value的定义(String对应的char数组):
/** Cache the hash code for the string */ private int hash; // Default to 0 private final char value[]; public String(String original) { this.value = original.value; this.hash = original.hash; }
这里的h变量先等于了hash,首先判断hash是否等于0,如果不等于0说明它的hash值不需要再计算一遍了(已经在构造函数中获取了),同时查询ASCII码表知道,null对应的ASCII值为0,显然这也符合hash初始为0的设置(即初始Sting == null)。h不等于0且字符串不为空才执行计算操作,说明空字符串对应的hash值也为0。
计算方式为:val[0]*31^(n-1) + val[1]*31^(n-2)… + val[n-1],使用素数31相乘产生的hash值的重复的概率更小。
Long中的hashCode方法实现
public static int hashCode(long value) { return (int)(value ^ (value >>> 32)); }
通俗的讲就是将long的前32位与后32位进行异或后得到hash值。
Double中的hashCode方法实现
public static int hashCode(double value) { long bits = doubleToLongBits(value); return (int)(bits ^ (bits >>> 32)); }
类似于Long中的实现方法。
Chracter中的hashCode方法实现
public static int hashCode(char value) { return (int)value; }
Character中的hashCode方法返回字符对应的ASCII值。
Boolean中的hashCode方法实现
public static int hashCode(boolean value) { return value ? 1231 : 1237; }
value为true时对应1231,为false时对应1237。
Boolean中的hashCode方法实现
public static int floatToIntBits(float value) { int result = floatToRawIntBits(value); // Check for NaN based on values of bit fields, maximum // exponent and nonzero significand. if ( ((result & FloatConsts.EXP_BIT_MASK) == FloatConsts.EXP_BIT_MASK) && (result & FloatConsts.SIGNIF_BIT_MASK) != 0) result = 0x7fc00000; return result; }
floatToRawIntBits(value)是一个native方法,具体实现没看,直观的看即是Float对象的hash值等于 函数 floatToRawIntBits返回的值。
相关文章推荐
- Java基础知识强化65:基本类型包装类之Integer的构造方法
- Java基础知识强化68:基本类型包装类之Character概述和Character常见方法
- Java中的Integer和int等包装类和基本数据类型简单比较
- Java学习日志(13-2-StringBuffer/StringBuilder与基本数值类型包装类)
- Java面向对象 String 基本数据类型对象包装类
- 黑马程序员—java基础学习--String字符串类,基本数据类型包装类
- java基础4:String与StringBuffer及基本数据类型包装类
- JAVA基础 day13 String类和StringBUffer类的常用方法 基本数据类型包装类的学习
- JAVA基础:StringBuffer\基本数据类型与包装类
- java基本数据类型,String、Integer等类型,Class三种对象引用的箭头,即箭头是怎么指的?
- 黑马程序员——Java String、StringBuffer、StringBuilder、基本数据类型对象包装类
- 黑马程序员——Java语言基础:String、基本数据类型对象包装类
- 01 Java基本数据类型、包装类、装箱拆箱、parseXxx()、String.valueOf()
- Java面向对象 String 基本数据类型对象包装类
- java基础-----String和基本数据类型包装类
- Java基础知识强化67:基本类型包装类之Integer直接赋值的面试题
- Java基础回顾--基本数据类型包装类1【Integer与int解惑】
- Java的基本数据类型:8种基本类型、对应的包装类、引用数据类型及与String 之间的转换。
- 3.6 java基础总结①包装类,基本数据类型,String相互间转换
- 黑马程序员 java 基础 毕向东 面向对象 String StringBuffer StringBuilder 基本数据类型包装类