草庐IT

HashCode

全部标签

java - 使用 Class 作为 HashMap 的键是否会导致不良影响?

考虑以下几点:Map,Object>myMap=newHashMap,Object>();FoofooObject=NewFoo();myMap.put(fooObject.getClass(),fooObject)注意java.lang.Class本身并没有实现hashCode()方法,而是隐式地从java.lang.Object继承了它。我在JDK1.8中验证了这一点。java.lang.Class用作java.util.HashMap的键是否安全?myMap.get(Foo.class)是否总是返回我输入的值,如myMap.put(fooObject.getClass(),foo

java - 为什么会延迟生成 Java String 哈希码?

在java.lang.String.java中出现,Java只会生成hashcode,然后在调用hashcode()之后存储它,但为什么不直接在构造函数中生成hashcode?相关代码:if(h==0&&count>0){intoff=offset;charval[]=value;intlen=count;for(inti=0;i大部分都可以放在构造函数中。 最佳答案 为什么要花时间生成一个很可能不会被使用的哈希码?大多数字符串都是在没有调用hashcode()的情况下构造、使用然后进行垃圾回收的。

Java:只检查不可变对象(immutable对象)的equals()中的hashCode

我有一个不可变对象(immutable对象),例如笛卡尔空间中的一个节点。该类是不可变的,因此我缓存了hashCode以实现非常快速的散列。privatefinalinthashCode;privatefinaldoublex,y,z;publicNode(finaldoublex,finaldoubley,finaldoublez){this.x=x;this.y=y;this.z=z;this.hashCode=Objects.hashCode(this.x,this.y,this.z);}@Overridepublicbooleanequals(finalObjectobj){i

java - 如何使用String.hashCode生成主键

我知道这似乎已经讨论过了,答案是肯定的,String.hashCode可以为不同的字符串生成相等的值,但不太可能(CanJava'shashCodeproducesamevaluefordifferentstrings?)。但是它确实发生在我的应用程序中。以下代码将产生相同的哈希码:-347019262(jave1.7.25)Stringstring1="/m/06qw_";Stringstring2="/m/0859_";System.out.println(string1+","+string1.hashCode());System.out.println(string2+","+

java - 如果我们只覆盖类中的 hashCode() 并在 Set 中使用它会发生什么?

这可能不是真实世界的场景,只是想知道会发生什么,下面是代码。我正在创建一组UsingSet类的对象。根据Java中的哈希概念,当我第一次添加包含“a”的对象时,它会创建一个哈希码为97的桶并将对象放入其中。同样,当它遇到带有“a”的对象时,它会调用类UsingSet中重写的hashcode方法,它会得到hashcode97那么下一步是什么?由于我没有覆盖equals方法,默认实现将返回false。那么,值“a”的对象将保存在与先前哈希码为97的对象所在的同一桶中?还是会创建新的存储桶?有人知道它将如何在内部存储吗?/*packagewhatever;//don'tplacepackag

Java,Object.hashCode() 结果在所有 JVM/系统中都是常量?

对于同一对象,Object.hashCode()的输出是否需要在所有JVM实现上都相同?例如,如果"test".hashCode()在1.4上返回1,它是否可能在1.6上返回2。或者如果操作系统不同,或者实例之间的处理器架构不同怎么办? 最佳答案 没有。hashCode的输出可能会在JVM实现之间发生变化,甚至在同一JVM上程序的不同执行之间。但是,在你给出的具体例子中,"test".hashCode()的值将实际上是一致的,因为hashCode的实现对于Stringobjects是String的API的一部分(参见theJavad

java - 当同一程序在 JVM5 和 JVM6 中运行时,HashMap 中的项目顺序不同

我有一个应用程序,它按行显示一组对象,一个对象=一行。对象存储在HashMap中。行的顺序不会影响应用程序的功能(这就是为什么使用HashMap而不是可排序集合的原因)。但是我注意到,当使用两个不同版本的Java虚拟机运行时,同一个应用程序的运行方式不同。该应用程序使用JDK5编译,可以使用Java5或Java6运行时运行,没有任何功能差异。有问题的对象覆盖java.lang.Object#hashCode()并且显然已经注意遵循JavaAPI中指定的契约(Contract)。它们在应用程序的每次运行中(在相同的Java运行时中)总是以相同的顺序出现这一事实证明了这一点。出于好奇,为什

java - hashcode数是否代表内存地址?

这个问题在这里已经有了答案:HowishashCode()calculatedinJava(11个答案)关闭9年前。我了解到hashcode是一个UniqueIdentificationreferencenumber,是一个十六进制数。我的疑问是,引用号是否代表对象的内存地址?例如:Employeeee1=newEmployee();System.out.println(e1.hashcode());这段代码会返回对象的内存地址吗?

java - Set.toString() 是如何实现的?

toString()方法在Set或其层次结构中没有被覆盖,那么元素是如何打印的?importjava.lang.Math;importjava.util.HashSet;classHello{publicStringname="";Hello(Stringname){this.name=name;}publicstaticvoidmain(Stringargs[]){Helloh1=newHello("first");Helloh2=newHello("second");Helloh3=newHello("third");Helloh4=newHello("fourth");Hello

java - Java 中的 equals() 和 hashCode() 契约

BertBates和KathySierra的SCJP6学习指南第554页(以及其他要求)指出x.hashCode()!=y.hashCode()要求x.equals(y)==false.但是Object的Javadoc并没有明确提到这样的要求。引用:如果根据equals(Object)方法两个对象相等,则对这两个对象中的每一个调用hashCode方法必须产生相同的整数结果。我是否应该将Javadoc所说的视为实质蕴涵,例如eq->hc?那么这两个来源之间就不会有冲突。 最佳答案 这两个语句是等价的。简单地说:如果两个hashcode