Tag: hashmap

HashMap的replace和put之间的区别

我想通过使用HashMap制作直方图,关键应该是延迟,该值是此延迟发生的次数。 如果已经存在的延迟有新的发生,我怀疑使用HashMap replace或HashMap put函数。 我是这样做的 int delay = (int) (loopcount-packetServed.getArrivalTime()); if(histogramType1.containsKey(delay)) { histogramType1.replace(delay, histogramType1.get(delay)+1); } else { histogramType1.put(delay, 1); } 它是否正确? 或者我应该使用put函数的两倍?

使用java 8流将String替换为hashmap值

我有String和HashMap如下面的代码: Map map = new HashMap(); map.put(“ABC”, “123”); String test = “helloABC”; map.forEach((key, value) -> { test = test.replaceAll(key, value); }); 我尝试用HashMap值替换字符串,但这不起作用,因为test是最终的,不能在forEach的主体中重新分配。 那么有没有使用Java 8 Stream API用HashMap替换String解决方案?

为什么Map.compute()采用BiFunction

我不明白为什么Map.compute()和Map.computeIfPresent()采用BiFunction参数以及Map.computeIfAbsent() Function : V compute(K key, BiFunction remappingFunction) V computeIfPresent(K key, BiFunction remappingFunction) V compute(K key, BiFunction remappingFunction) V computeIfPresent(K key, BiFunction remappingFunction) V computeIfAbsent(K key, Function mappingFunction) V computeIfPresent(K key, BiFunction remappingFunction) V computeIfAbsent(K key, Function mappingFunction) 我期待一个普通的Function Function Function ,将旧值映射到新值,resp。 Supplier Supplier为新值。 调用者已经拥有密钥(第一个参数),因此函数或供应商已经可以使用它。 我找到的所有例子都不使用密钥。 我想到的原因: 关键必须(有效) final – 这很容易管理 有一些花哨易用的方法参考 但我不相信这些是这种设计的可行原因。 你有什么想法?

如何使用MATLAB数组作为HashMap java对象的键?

put函数工作正常,但get函数没有。 显然我不知道诀窍。 >> X = [ 1, 2, 3]; >> M = java.util.HashMap; >> M.put(X,1); >> M.get([1,2,3]) ans = [] 我搜索并阅读了很多post,但找不到解决这个问题的方法。 如果有人能让我知道这个伎俩会很棒。

如何使用Java 8 Stream将Array转换为HashMap

我正在编写一个函数,使用Java 8 Stream将数组转换为Map。 这就是我想要的 public static Map toMap(Object… entries) { // Requirements: // entries must be K1, V1, K2, V2, …. ( even length ) if (entries.length % 2 == 1) { throw new IllegalArgumentException(“Invalid entries”); } // TODO Arrays.stream(entries).???? } 有效的用法 Map map1 = toMap(“k1”, 1, “k2”, 2); Map map2 = toMap(“k1”, “v1”, “k2”, […]

创建HashMaps的不同方法

我最近一直在学习HashMaps,但我有一个问题似乎无法得到明确的答案。 主要区别 – HashMap hash1 = new HashMap(); VS HashMaphash1 = new HashMap (); //Filled in with whatever Key and Value you want. 我想当你定义一个HashMap时,它需要Key和Value。 任何帮助将非常感激。 谢谢。

HashMap在内部使用LinkedList

public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; } 我所知道的是,如果你想从HashMap获取一个对象,首先它会根据哈希码/哈希值搜索哈希桶,然后遍历hashbucket中的LinkedList (假设diff对象具有相同的哈希码,因此在相同的哈希桶)。 但在查看上面的代码之后,我无法理解何时迭代LinekedList(以及LinkedList在哪里)

为什么HashMap在扩展AbstractMap时会实现Map?

可能重复: Java.util.HashMap – 为什么HashMap扩展了AbstractMap并实现了Map? 在java中实现HashMap我们需要实现Map 。 但是,当我在java类中调试更多时,似乎…. java定义HashMap类如下。 public class HashMap extends AbstractMap implements Map, Cloneable, Serializable 同时我看到public abstract class AbstractMap实现Map它还实现了接口Map 。 如果抽象类实现了接口,那么在HashMap类级别实现Map背后的原因是什么? 根据我的理解, HashMap类具有从AbstractMapinheritance的所有方法,可以根据需要由HashMap覆盖。

在Java 8中使用Java 7 HashMap

我已将Java应用程序更新为Java 8.应用程序严重依赖于HashMaps。 当我运行基准测试时,我看到了不可预测的行为。 对于某些输入,应用程序运行速度比以前更快,但对于较大的输入,它会一直较慢。 我检查过探查器,最耗时的操作是HashMap.get。 我怀疑这些更改是由于Java 8中的HashMap修改,但可能不是这样,因为我已经更改了其他一些部分。 有没有一种简单的方法可以将原始Java 7 HashMap挂钩到我的Java 8应用程序中,这样我就只能更改hashmap实现,看看我是否仍然观察到性能的变化。 以下是一个试图模拟我的应用程序正在做什么的最小程序。 基本思想是我需要在应用程序中共享节点。 在某个运行时点,如果某个节点已根据某些整数属性而不存在,则应该检索或创建该节点。 以下仅使用两个整数,但在实际应用程序中我有一个,两个和三个整数键。 import java.util.HashMap; import java.util.Map; import java.util.Random; public class Test1 { static int max_k1 = 500; static int max_k2 = 500; static Map map; static Random random = new Random(); public static void main(String[] args) { for (int i = 0; […]

从理论上讲,ConcurrentHashMap的Segment和HashMap的桶之间有什么区别?

据我所知,在HashMap中,条目(Key,Value)基于散列(Key.hashCode)放置在桶中 – >表示桶位置的索引。 如果条目已经放置在该位置,则创建链接列表,并且新条目(如果它具有不同的键 – >通过equals()方法)放置在链接列表的开头。 我可以将这个概念与ConcurrentHashMap相关联,但是不是Buckets,而是有各个线程锁定的段。 而不是条目,有HashEntry(ies)。 以类似的方式,创建链接列表,如果插入的键值对不同,则基于键的equals(),它被放置在链表的末尾。 我说的是正确的:CHM的put是不同步的,因此任何线程都可以访问这个方法,这个put方法计算传递给它的密钥的哈希值并得到段索引(有点像桶)。 然后,仅针对该段,它调用put方法。 现在在Segment下,put方法指定会有一个lock(),这样只有一个线程可以改变特定段中的数据,从而得出结论,如果并发级别为16,则应该有16个线程,因此这些线程将是能够一次仅PUT值一个段。