怎么做服装外贸网站,温州做高端网站公司,西安未央区做网站,一个网站要怎么做【README】
本文旨在po出 hashCode #xff0c; equals的api描述#xff0c;以加深理解#xff1b;
本文翻译自 jdk 文档#xff1b; 【1】Object.hashCode()
1#xff09;介绍#xff1a;返回对象的哈希码值。支持此方法是为了有利于哈希表#xff0c;例如由 java.u…【README】
本文旨在po出 hashCode equals的api描述以加深理解
本文翻译自 jdk 文档 【1】Object.hashCode()
1介绍返回对象的哈希码值。支持此方法是为了有利于哈希表例如由 java.util.HashMap 提供的哈希表。
在 Java 应用程序执行期间只要在同一个对象上多次调用它hashCode 方法必须始终返回相同的整数前提是对象上的 equals 比较中使用的信息没有被修改。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
hashCode方法需要遵守的约定如果根据 equals(Object) 方法两个对象相等则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果*干货。
如果根据 equals(Object) 方法两个对象不相等则不需要对这两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。但是程序员应该意识到为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
尽可能实用类 Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。 这通常通过将对象的内部地址转换为整数来实现但 Java™ 编程语言不需要这种实现技术。
补充 可以看下 equals() System.identityHashCode() 【1.1】String.hashCode()
返回此字符串的哈希码。 String 对象的哈希码计算如下 s[0]*31^(n-1) s[1]*31^(n-2) ... s[n-1] 使用 int 算术其中 s[i] 是字符串的第 i 个字符n 是字符串的长度^ 表示求幂。 空字符串的哈希值为零。 返回此对象的哈希码值。
private final char value[]; // 只能被一次赋值不可二次修改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;}
字符串底层是字符数组存储的以字符串 aaa为例存储结构为 [a, a, a] 字符a的 ASCII 为97则hash值计算步骤如下
i 取值 0 1 2初始时 hhash0
ival[i]h0979719731*9797 310429731*310497 96321
所以字符串 aaa的hash值等于 96321 。
我们令 vi val[i]则以后如下规则
h0 v0;
h131*v0v1;
h231* [31*v0 v1] v2;
...
通过归纳法我们可以得出字符串的hash值的计算公式为
hn 31^n * v0 31^n-1 * v1 ...... 31 * vn-1 31^0 * vn; 其中vn表示字符串的第n个字符n从0开始
所以 字符串 aaa 的hash值 h2 31^2 * 97 31 * 97 97 96321 【2】Object.equals ()
1)介绍指示其他某个对象是否“等于”这个对象。2equals 方法在非空对象引用上实现等价关系
它是自反的对于任何非空引用值 xx.equals(x) 应该返回 true。它是对称的对于任何非空引用值 x 和 y当且仅当 y.equals(x) 返回 true 时x.equals(y) 才应返回 true。它是可传递的对于任何非空引用值 x、y 和 z如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true那么 x.equals(z) 应该返回 true。它是一致的对于任何非空引用值 x 和 yx.equals(y) 的多次调用始终返回 true 或始终返回 false前提是对象的 equals 比较中使用的信息没有被修改。
对于任何非空引用值 xx.equals(null) 应返回 false。
Object 类的 equals 方法实现了对象上最有区别的可能等价关系也就是说对于任何非空引用值 x 和 y当且仅当 x 和 y 引用同一个对象x y 的值为 true时此方法才返回 true。
请注意每当重写此方法时通常都需要重写 hashCode 方法以维护 hashCode 方法的一般约定即相等的对象必须具有相等的哈希码。
补充也可以看看 hashCode(), java.util.HashMap 【3】System.identityHashCode(Object x)
1介绍为给定对象返回与默认方法 hashCode() 返回的相同的哈希码无论给定对象的类是否覆盖 hashCode()。 空引用的哈希码为零。 【4】HashMap.hash(Object key) static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16);}
计算 key.hashCode() 并将散列的较高位异或传播到较低位。
由于该表使用二次幂掩码因此仅在当前掩码之上位变化的散列集将始终发生冲突。 众所周知的例子是在小表中保存连续整数的浮点键集。
因此我们应用了一种将较高位的影响向下传播的变换。 位扩展的速度、效用和质量之间存在权衡。 因为许多常见的哈希集已经合理分布因此不会从传播中受益并且因为我们使用树来处理 bin 中的大量冲突所以我们只是以最便宜的方式对一些移位的位进行异或以减少系统损失 以及合并最高位的影响否则由于表边界而永远不会在索引计算中使用。