草庐IT

java - 为什么 Map.compute() 采用 BiFunction

我不明白为什么Map.compute()和Map.computeIfPresent()拿BiFunction参数以及Map.computeIfAbsent()一个Function:Vcompute(Kkey,BiFunctionremappingFunction)VcomputeIfPresent(Kkey,BiFunctionremappingFunction)VcomputeIfAbsent(Kkey,FunctionmappingFunction)我期待一个普通的Function,分别将旧值映射到新值。一个Supplier为新的值(value)。调用者已经拥有key(第一个参数)

java - Java 8's HashMap misbehaves if the keys implement Comparable in a way that isn' t 与equals一致是不是bug?

我知道从Java8开始,如果HashMap有足够多的哈希冲突,并且键实现了Comparable,它会useabalancedtreeinsteadofalinkedlistforthebin.但据我所知,Comparable接口(interface)doesnotrequirecompareTo()应“与equals()一致”(尽管强烈建议这样做)。我错过了什么吗?似乎新的实现允许HashMap违反Map接口(interface)的要求,如果键恰好具有兼容但不推荐的Comparable实现。以下JUnit测试在OpenJDK8u72上暴露了此行为:importstaticorg.jun

java - HashMap 顺序在使用 Thread 时发生变化,但在没有 Thread 时保持不变

我知道HashMap不保证顺序。考虑以下代码:importjava.util.HashMap;importjava.util.Map;publicclassSandBox{protectedstaticclassBook{Stringname;publicBook(Stringname){this.name=name;}@OverridepublicStringtoString(){returnname;}}protectedstaticclassMyThreadextendsThread{@Overridepublicvoidrun(){super.run();finalintn=1

java - Java中的HashMap.values()方法返回的集合是什么?

JavaSE6.0API表示java.util.HashMap中的values()方法返回一个Collection类型。JVM如何决定在运行时返回哪个集合。它是特定于jvm的还是有Java遵循的任何一般准则。我浏览了HashMap的源代码,但找不到任何线索。非常感谢任何帮助,或者如果问题很蹩脚,请指出原因。谢谢。 最佳答案 你可以在源代码中看到:publicCollectionvalues(){if(values==null){values=newAbstractCollection(){...他们实际上给出了AbstractCol

Java 8 流 : iterate over Map of Lists

我有以下对象和map:MyObjectStringname;Longpriority;foobar;Map>anotherHashMap;我想在另一个map中转换map。结果映射的键是输入映射的键。结果映射的值是我的对象的属性“名称”,按优先级排序。排序和提取名称不是问题,但我无法将其放入结果映射中。我用旧的Java7方式来做,但如果可以使用流式API就好了。Map>result=newHashMap();for(Stringidentifier:anotherHashMap.keySet()){ListgeneratedList=anotherHashMap.get(identifi

java - 从不同的类访问 HashMap

我的类中有一个名为DataStorage的HashMap:HashMappeople=newHashMap();people.put("bob",2);people.put("susan",5);如何在不同的类中访问此HashMap中的数据? 最佳答案 将您的HashMap创建为一个实例变量,并提供一种方法将其访问到您的类API中:publicclassDataStorage{privateHashMappeople=newHashMap();publicHashMapgetPeopleMap(){returnpeople;}}pu

java - 使用项目数组初始化 HashMap?

我有一个长时间处理的结果。我不想将它直接传递给HashMap并进行更多计算。我想保存它然后每次都重复使用。我的值数组如下所示:{0=0,1=15,2=70,3=90,4=90,5=71,6=11,7=1,8=61,9=99,10=100,11=100,12=100,13=66,14=29,15=98,17=100,16=100,19=100,18=100,21=62,20=90,23=100,22=100,25=100,24=100,27=91,26=100,29=100,28=68,31=100,30=100,34=83,35=55,32=100,33=100,38=100,39=1

java - ConcurrentHashMap 内存开销

有人知道ConcurrentHashMap的内存开销是多少(与“经典”HashMap相比)吗?在build中?在插入元素时? 最佳答案 如果您在64位JVM上使用-XX:-UseTLAB-XX:NewSize=900m-mx1g运行以下命令。publicstaticvoidmain(String...args)throwsNoSuchMethodException,IllegalAccessException{for(inti=0;i您获得Java6和7的一百万个条目。Theratioofusedmemoryis1.12911284

java - ReentrantReadWriteLock - 一次有很多读者,一次有一个作者?

我对多线程环境有些陌生,我正在尝试针对以下情况提出最佳解决方案:我每天早上从数据库中读取一次数据,并将数据存储在单例对象中的HashMap中。我有一个setter方法,该方法仅在发生日内数据库更改时调用(每天发生0-2次)。我还有一个getter,它返回map中的一个元素,这个方法每天被调用数百次。我担心在清空和重新创建HashMap时调用getter的情况,因此试图在空/格式错误的列表中查找元素。如果我让这些方法同步,它会阻止两个读者同时访问getter,这可能是一个性能瓶颈。我不想对性能造成太大影响,因为写操作很少发生。如果我使用ReentrantReadWriteLock,这是否

java - Java Collectors.toMap内存优化

我有一个将列表转换为map的函数。调用该函数后map的大小不会改变。我正在尝试在以下两种实现之间做出决定:MaplistToMap(Listobjs){/*ImplementationOne:*/Mapmap=newHashMap(objs.size(),1);for(Objectobj:objs){map.put(obj.getKey(),obj);}returnmap;/*ImplementationTwo:*/returnobjs.stream().collect(Collectors.toMap(Object::getKey,obj->obj));}在第一个实现中,我通过使用1