Tag: 哈希码

toString(),equals()和hashCode()

所以,我有一个需要实现的一堆方法的接口,方法名称是不相关的。 实现这个接口的对象通常被放入集合中,并且还有我希望它们使用的特殊的toString()格式。 所以,我认为将hashCode(),equals()和toString()放入界面会很方便,以确保我记得覆盖这些的默认方法。 但是,当我将这些方法添加到接口时,如果我没有实现这三个方法,那么IDE /编译器就不会抱怨,即使我明确地将它们放在接口中。 为什么这不会被强制执行? 它抱怨说,如果我不执行任何其他方法,但它不执行这三个。 是什么赋予了? 任何线索?

在子类中重写equals()&hashCode()…考虑超级域

是否有一个具体的规则如何覆盖equals()和hashCode()在考虑超级字段的 子类 ? 知道有很多参数:超级字段是私人/公共,有/没有getter … 例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和 new HomoSapiens("M", "80", "1.80", "Cammeron", "VeryHot").equals( new HomoSapiens("F", "50", "1.50", "Cammeron", "VeryHot")) 将返回真实:( public class Hominidae { public String gender; public String weight; public String height; public Hominidae(String gender, String weight, String height) { this.gender = gender; this.weight = weight; this.height = height; } … } public class HomoSapiens […]

糟糕的想法在HashMap中使用String键?

我明白String类的hashCode()方法不能保证为不同的String-s生成唯一的哈希码。 我看到很多将String键放入HashMap-s的用法(使用默认的String hashCode()方法)。 如果一个地图put了一个以前放置在地图上的HashMap条目,并且使用了一个真正的不同的String键,那么很多这种用法可能会导致重大的应用程序问题。 你会遇到什么情况,String.hashCode()为不同的String-s返回相同的值? 密钥是string时,开发人员如何解决此问题?

如何用两个键(Key-Pair,Value)创build一个HashMap?

我有一个整数的二维数组。 我希望他们被放入一个HashMap。 但我想从基于数组索引的HashMap中访问元素。 就像是: 对于A [2] [5], map.get(2,5)返回与该键相关的值。 但是,我怎么用一对钥匙创build一个哈希映射? 或者一般来说,我可以通过使用get(key1,key2,… keyN)来访问元素的方式: Map<((key1, key2,..,keyN), Value) )。 编辑:发布这个问题3年后,我想添加更多一点 我碰到了NxN matrix另一种方法。 数组索引, i和j可以用下面的方式表示为一个单独的key : int key = i * N + j; //map.put(key, a[i][j]); // queue.add(key); 而且指数可以通过这种方式从key中撤回: int i = key / N; int j = key % N;

hashCode()在Javastring上的一致性

Java String的hashCode值计算为( String.hashCode() ): s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1] 有什么情况下(如JVM版本,供应商等)下面的expression式将评估为false? boolean expression = "This is a Java string".hashCode() == 586653468 更新#1:如果你声称答案是“是的,有这样的情况” – 那么请给出一个具体的例子,当“这是一个Javastring”.hashCode()!= 586653468.尝试作为具体/具体尽可能。 更新#2:我们都知道依赖于hashCode()的实现细节通常是不好的。 但是,我正在谈论String.hashCode() – 所以请保持答案集中在String.hashCode()。 在这个问题的背景下,Object.hashCode()是完全不相关的。

Java HashMap如何处理具有相同哈希代码的不同对象?

根据我的理解,我认为: 两个对象具有相同的哈希码是完全合法的。 如果两个对象相等(使用equals()方法),那么它们具有相同的哈希码。 如果两个对象不相等,则它们不能具有相同的哈希码 我对么? 现在,如果正确,我有以下问题: HashMap内部使用该对象的哈希码。 因此,如果两个对象可以具有相同的哈希码,那么HashMap如何跟踪它使用的密钥呢? 有人可以解释HashMap如何在内部使用对象的哈希码吗?

哈希码计算的明智之处是什么?

Eclipse 3.5有一个很好的function来生成Java hashCode()函数。 它会产生例如(稍微缩短:) class HashTest { int i; int j; public int hashCode() { final int prime = 31; int result = prime + i; result = prime * result + j; return result; } } (如果在类中有更多的属性, result = prime * result + attribute.hashCode();对每个附加属性重复。对于ints,可以省略.hashCode()。 这看起来很好,但对于素数的select31。 它可能是从Java String的hashCode实现中获得的 ,这是由于硬件乘法器引入后长期以来的性能原因。 在这里,对于i和j的较小值,有很多哈希码碰撞:例如(0,0)和(-1,31)具有相同的值。 我认为这是一个坏事(TM),因为小的值经常出现。 对于String.hashCode,你还会发现许多具有相同散列码的短string,例如“Ca”和“DB”。 如果你select一个较大的素数,那么如果你select了这个素数,这个问题就会消失。 所以我的问题是:什么是最好的select? 你有什么标准来find它? […]

什么是Java中的“内部地址”?

在Javadoc for Object.hashCode()中声明 尽可能多地合理实用,由类Object定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。) 这是一个常见的miconception这与内存地址有关,但它不会改变,恕不另行通知,并且hashCode()不会也不能改变对象。 @ Neet提供了一个很好的答案https://stackoverflow.com/a/565416/57695但我正在寻找更多的细节。 这里举一个例子来说明我的担忧 Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); Unsafe unsafe = (Unsafe) theUnsafe.get(null); for (int t = 0; t < 10; t++) { System.gc(); Object[] objects = new Object[10]; for (int i = 0; i < objects.length; i++) objects[i] = new Object(); for (int i = 0; i < […]

在Java中使用hashcode有什么用?

在Java中, obj.hashcode()返回一些值。 这个哈希码在编程中有什么用处?

Java Array HashCode实现

这很奇怪 一位同事询问了java中myArray.hashCode()的实现。 我以为我知道,但后来我跑了一些testing。 检查下面的代码。 我注意到奇怪的是,当我写第一个系统的结果是不同的。 请注意,这几乎就像是报告内存地址,并修改类地址或东西。 只是想我会分享。 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] = […]