草庐IT

HashCode

全部标签

java - hashCode() 方法当 equals() 基于多个独立字段时

我有一个类,它的相等性基于2个字段,这样如果任何一个相等,那么这种类型的对象被认为是相等的。我如何为这样的equals()编写hashCode()函数,以便保留当equals返回true时hashCode相等的一般约定?publicclassMyClass{intid;Stringname;publicbooleanequals(Objecto){if(!(oinstanceofMyClass))returnfalse;MyClassother=(MyClass)o;if(other.id==this.id||other.name==this.name)returntrue;retur

java - 散列复合对象

编辑:这个问题与按位运算符无关,不能用WhyareXORoftenusedinjavahashCode()butanotherbitwiseoperatorsareusedrarely?回答。我见过不同的对象哈希计算方法:classA{publicBb;publicCc;@Overridepublicbooleanequals();@OverridepublicinthashCode(){returnc.hashCode()^b.hashCode();//XORreturnc.hashCode()+prime*b.hashCode();//SUMreturnObjects.hash(b

java - 从字符串和整数创建散列

我记得eclipse和idea有这个模板可以根据对象的属性自动创建对象的hashCode。如果使用数字和字符串,其中一种策略是这样的。returnstringValue.hashCode()+intValue*32;Ooor类似的东西。我手头没有eclipse或想法,我想创建这样的功能。编辑根据我创建这个小类的答案classStringInt{privatefinalStrings;privatefinalinti;staticStringIntvalueOf(Stringstring,intvalue){returnnewStringInt(string,value);}privat

java - 是否有可能使 Eclipse 生成 hashCode 和等于 HashCodeBuilder 和 EqualsBuilder

默认生成的hashCode和equals实现充其量是丑陋的。是否有可能使eclipse从HashCodeBuilder和EqualsBuilder生成一个,甚至可能是一个带有ToStringBuilder的toString? 最佳答案 看看Commons4E有段时间没更新了,不过我猜应该不会有太大变化吧?更新:刚刚检查了3.4.1,它工作正常。 关于java-是否有可能使Eclipse生成hashCode和等于HashCodeBuilder和EqualsBuilder,我们在StackO

java - Double.doubleToLongBits(x) 的含义

我正在编写一个类Vec2D,表示一个二维vector。我将x和y存储在double中。当要求生成equals(Objectobj和hashCode()时,eclipse生成了这个:@OverridepublicinthashCode(){finalintprime=31;intresult=1;longtemp;temp=Double.doubleToLongBits(x);result=prime*result+(int)(temp^(temp>>>32));temp=Double.doubleToLongBits(y);result=prime*result+(int)(temp^

java - 高效的 hashCode() 实现

我经常使用IntelliJIDEA自动生成类的hashCode()方法,通常该方法采用以下形式:result=31*result+...我的问题是乘以31的目的是什么?我知道这是一个素数,但为什么要专门选择31?此外,如果为特别小/大的数据集实现hashCode(),人们会以不同的方式处理这个问题吗? 最佳答案 乘以31很快,因为JIT可以将其转换为左移5位和减法:x*31==(x如果没有任何特别的额外信息,我会坚持使用这种方法。它的速度相当快,并且很可能以合理分布的哈希码结束,而且它也很容易正确:)数据集的大小并不重要,但如果您有

java - 什么时候需要覆盖 equals 和 hashcode 方法?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:OverridingequalsandhashCodeinJava如果我有classA{intx=1;}...Aa1=newA();Aa2=newA();a1.equals(a2);如果我比较A的2个实例而不覆盖equals方法,我会得到预期的结果吗?

java - 打开弦乐

我很好奇Java和Scala是如何实现字符串开关的:classJava{publicstaticintjava(Strings){switch(s){case"foo":return1;case"bar":return2;case"baz":return3;default:return42;}}}objectScala{defscala(s:String):Int={smatch{case"foo"=>1case"bar"=>2case"baz"=>3case_=>42}}}Java似乎打开哈希码然后进行单个字符串比较:0:aload_01:dup2:astore_13:invokev

java - 没有同步或 volatile 关键字的延迟初始化

前几天HowardLewisShip发布了一篇名为"ThingsILearnedatHackerBedandBreakfast"的博客文章,要点之一是:AJavainstancefieldthatisassignedexactlyoncevialazyinitializationdoesnothavetobesynchronizedorvolatile(aslongasyoucanacceptraceconditionsacrossthreadstoassigntothefield);thisisfromRichHickey从表面上看,这似乎与关于跨线程内存更改可见性的公认智慧不一致,

java - 具有空键和空值的 HashMap

考虑以下代码:importjava.util.*;classEmployee{Stringname;publicEmployee(Stringnm){this.name=nm;}}publicclassHashMapKeyNullValue{Employeee1;publicvoiddisplay(){Employeee2=null;Mapmap=newHashMap();map.put(e2,"25");System.out.println("GettingtheValueWhene2issetasKEY");System.out.println("e2:"+map.get(e2))