我在使用自己的类作为HashMap的键时遇到问题publicclassActorId{privatefinalintplayerId;privatefinalintid;ActorId(intplayerId,intid){this.playerId=playerId;this.id=id;}publicbooleanequals(ActorIdother){returnthis.id==other.id&&this.playerId==other.playerId;}publicinthashCode(){inthash=1;hash=hash*31+playerId;hash=ha
因此,JavaWeakHashMap允许创建一个映射,如果其键变弱,其条目将被删除。但是,本地图中的值变弱时,如何创建一个条目被删除的map?我想使用map的原因是作为一个全局哈希表,它根据对象的ID跟踪对象。ID--->ObjectAddressKey--->Value(其中ID是一个文本字符串)我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。有人对此有任何想法吗? 最佳答案 支持这样的map,例如Guava:Mapm=newMapMaker().weakValues().makeMap();
这个问题在这里已经有了答案:ExplanationofHashMap#hash(int)method(2个答案)关闭7年前。看了JDK的源码,觉得HashMap的hash()函数很好玩。它的源代码是这样的:staticinthash(inth){//ThisfunctionensuresthathashCodesthatdifferonlyby//constantmultiplesateachbitpositionhaveabounded//numberofcollisions(approximately8atdefaultloadfactor).h^=(h>>>20)^(h>>>12
所以我有这个正在开发的通用HashTable类,我想将它用于任意数量的传入类型,我还想将内部存储数组初始化为LinkedList的数组(用于冲突目的),其中每个LinkedList都提前(为了类型安全)指定为HashTable类的泛型类型。我怎样才能做到这一点?下面的代码最能说明我的意图,当然编译不过。publicclassHashTable{privateLinkedList[]m_storage;publicHashTable(intinitialSize){m_storage=newLinkedList[initialSize];}} 最佳答案
我有一个整数类型,比如说long,它的值在Long.MIN_VALUE=0x80...0(-2^63)和Long之间.MAX_VALUE=0x7f...f(2^63-1)。我想以干净高效的方式将其散列为相同类型的正整数(即介于1和Long.MAX_VALUE之间)约50%的冲突。我的第一次尝试是这样的:数学.abs(x)+1(x&Long.MAX_VALUE)+1但是那些和类似的方法总是对某些值有问题,即当x是0/Long.MIN_VALUE/Long.MAX_VALUE。当然,天真的解决方案是使用2个if语句,但我正在寻找更清洁/更短/更快的东西。有什么想法吗?注意:假设我在Java
对象的散列在java的HashMap中是如何工作的?我在想,与字符串相比,使用整数作为键是否更有效,或者它是否无关紧要。如果我有:Stringstr="hello";ObjecthelloObject=newObject();如果是String,什么更好?使用整数键:HashMaphashes=newHashMap();hashes.put(str.hashCode(),helloObject);还是使用字符串键?HashMaphashes=newHashMap();hashes.put(str,helloObject);从插入的角度和从搜索的角度来看,什么更有效率?
我有一个处理大量数据集的程序。对象最好存储在哈希实现的容器中,因为程序会不断在容器中寻找对象。第一个想法是使用HashMap,因为这个容器的get和remove方法更适合我需要的用途。但是,我发现HashMap的使用非常消耗内存,这是一个主要问题,所以我认为切换到HashSet会更好,因为它只使用,而不是每个元素,但是当我查看实现时,我了解到它使用底层HashMap!这意味着它不会节省任何内存!所以这是我的问题:我所有的假设都是正确的吗?HashMap内存浪费吗?更具体地说,每个条目的开销是多少?HashSet和HashMap一样浪费吗?是否有任何其他基于Hash的容器会显着减少内存消
我有一个应用程序,它按行显示一组对象,一个对象=一行。对象存储在HashMap中。行的顺序不会影响应用程序的功能(这就是为什么使用HashMap而不是可排序集合的原因)。但是我注意到,当使用两个不同版本的Java虚拟机运行时,同一个应用程序的运行方式不同。该应用程序使用JDK5编译,可以使用Java5或Java6运行时运行,没有任何功能差异。有问题的对象覆盖java.lang.Object#hashCode()并且显然已经注意遵循JavaAPI中指定的契约(Contract)。它们在应用程序的每次运行中(在相同的Java运行时中)总是以相同的顺序出现这一事实证明了这一点。出于好奇,为什
我很好奇Object类是如何实现的。例如方法hashCode()或wait()如何表示内部状态。例如,用于存储调用对象的wait()的线程的内部锁或数据结构。为了找到这些,我下载了OpenJDK的源代码并开始挖掘。首先,我遇到的是\openjdksrc\jdk\src\share\native\java\lang\Object.c文件,其中包括:staticJNINativeMethodmethods[]={{"hashCode","()I",(void*)&JVM_IHashCode},{"wait","(J)V",(void*)&JVM_MonitorWait},{"notify"
我想实现在服务器上上传的某些文件的可恢复的即时哈希生成。这些文件很大,所以我正在使用MessageDigest类的update(byte[])方法(如此处所述,例如:HowcanIgenerateanMD5hash?),因为新字节来自HttpServletRequest的InputStream。一切顺利,但是,当我想添加可恢复上传支持时,它变得很有趣。如果上传提前终止,不完整的文件将存储在磁盘上。但是,Controller(和底层服务)退出,因此MessageDigest对象丢失。在此之前,我可以将MessageDigest对象序列化到磁盘(或数据库,这无关紧要),当我再次反序列化对象