当前位置: 首页 > 面试题库 >

Java数组HashCode实现

拓拔欣嘉
2023-03-14
问题内容

这很奇怪。一位同事询问了java中myArray.hashCode()的实现。我以为我知道,但是后来我进行了一些测试。检查下面的代码。我注意到的奇怪想法是,当我编写第一个系统时,结果是不同的。请注意,这几乎就像报告内存地址并修改类一样,将地址或其他内容移动了。只是想我会分享。

int[] foo = new int[100000];
java.util.Random rand = new java.util.Random();

for(int a = 0; a < foo.length; a++) foo[a] = rand.nextInt();

int[] bar = new int[100000];
int[] baz = new int[100000];
int[] bax = new int[100000];
for(int a = 0; a < foo.length; a++) bar[a] = baz[a] = bax[a] = foo[a];

System.out.println(foo.hashCode() + " ----- " + bar.hashCode() + " ----- " + baz.hashCode() +  " ----- " + bax.hashCode());

// returns 4097744 ----- 328041 ----- 2083945 ----- 2438296
// Consistently unless you modify the class.  Very weird
// Before adding the comments below it returned this:
// 4177328 ----- 4097744 ----- 328041 ----- 2083945


System.out.println("Equal ?? " +
  (java.util.Arrays.equals(foo, bar) && java.util.Arrays.equals(bar, baz) &&
  java.util.Arrays.equals(baz, bax) && java.util.Arrays.equals(foo, bax)));

问题答案:

java.lang.Array hashCode方法继承自Object,这意味着哈希码取决于引用。要基于数组的内容获取哈希码,请使用Arrays.hashCode

请注意,尽管它是一个浅哈希码实现。一个深层的实现也存在Arrays.deepHashCode



 类似资料:
  • 本文向大家介绍Java实现hashCode()方法,包括了Java实现hashCode()方法的使用技巧和注意事项,需要的朋友参考一下 示例 要轻松实现对象的hashCode方法,可以使用HashCodeBuilder类。 选择字段: 使用反射: 布尔参数指示是否应使用瞬态字段。 使用反射避免某些字段:            

  • 问题内容: hashCode()如何实现? 我的假设是它将对象存储位置用作运行哈希函数的初始数字(种子)。然而,这种情况并非如此。 我还研究了Hash:它在内部如何工作?但它不能回答我的问题。 是的,我可以下载SDK,但是在执行此操作并查看代码之前,也许其他人已经知道了。 谢谢 :) 编辑: 我知道它应该被覆盖等等,所以请尝试保持话题:) 问题答案: 当然,它是特定于实现的,但是通常,对象的哈希码

  • 问题内容: 我试图理解Java对象的hashCode(),并看到Java对象的hashCode()方法的以下代码: 因此,该类即:将隐式扩展该类。 主班: 正如隐式扩展类一样,因此它将具有类的方法。 我调用了on 对象,但由于尚未覆盖on ,因此从理论上讲它应该调用class的。 我的疑问是: 由于Object类没有任何实现,因此如何计算任何对象的哈希码? 就我而言,当我运行该程序时,它返回的哈希

  • 问题内容: 我想知道是否有人可以详细解释 在以下哈希码实现中执行(由eclipse生成,但与有效Java相同): 谢谢! 问题答案: 基本上,它对long的高32位与低32位进行异或。这是分解版本: 回答您的评论:您有一个long值,必须将其转换为int才能作为哈希的一部分(结果必须仅为32位)。你打算怎么做?您 可以 只使用低32位-但这意味着 仅 高32位的更改将被忽略,这不会使其成为一个很好

  • 问题内容: hashCode方法的最佳实现中可接受的答案为查找哈希码提供了看似不错的方法。但是我是哈希代码的新手,所以我不太了解该怎么做。 对于1),选择哪个非零值有关系吗?是一样好其他数字,如:黄金? 对于2),我是否将每个值添加到c?如果我有两个字段都是一个,,,等? 我在这堂课上解释得对吗? 问题答案: 该值并不重要,它可以是您想要的任何值。质数将导致值的更好分布,因此首选。 您不必添加它们

  • 我正在通过SonarLint传递我的代码,我遇到了这个linter违规:上调用。 这是我的代码: SonarLint给出了以下代码片段,作为改进代码的提示: 我应该如何更改代码以满足linter的要求?为什么?