打印Java ConcurrentHashMap中的所有键/值对
我试图简单地打印ConcurrentHashMap中的所有键/值对 我在网上找到了这段代码,我认为可以,但它似乎正在获取有关bucket/hashcode的信息。老实说,输出结果很奇怪,可能是我的程序不正确,但我首先要确定这部分是我想要使用的打印Java ConcurrentHashMap中的所有键/值对,java,collections,hashmap,concurrenthashmap,Java,Collections,Hashmap,Concurrenthashmap,我试图简单地打印ConcurrentHashMap中的所有键/值对 我在网上找到了这段代码,我认为可以,但它似乎正在获取有关bucket/hashcode的信息。老实说,输出结果很奇怪,可能是我的程序不正确,但我首先要确定这部分是我想要使用的 for (Entry<StringBuilder, Integer> entry : wordCountMap.entrySet()) { String key = entry.getKey().toString(); Inte
for (Entry<StringBuilder, Integer> entry : wordCountMap.entrySet()) {
String key = entry.getKey().toString();
Integer value = entry.getValue();
System.out.println("key, " + key + " value " + value);
}
for(条目:wordCountMap.entrySet()){
String key=entry.getKey().toString();
整数值=entry.getValue();
System.out.println(“键,+key+“值”+value);
}
这将为大约10个不同的键提供输出,计数似乎是映射中总插入数的总和 我测试了您的代码并正常工作。我添加了一个小演示,其中包含打印地图中所有数据的另一种方法:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
for (String key : map.keySet()) {
System.out.println(key + " " + map.get(key));
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey().toString();
Integer value = entry.getValue();
System.out.println("key, " + key + " value " + value);
}
ConcurrentHashMap=新的ConcurrentHashMap();
地图放置(“A”,1);
地图放置(“B”,2);
地图放置(“C”,3);
for(字符串键:map.keySet()){
System.out.println(key+“”+map.get(key));
}
对于(Map.Entry:Map.entrySet()){
String key=entry.getKey().toString();
整数值=entry.getValue();
System.out.println(“键,+key+“值”+value);
}
除了ConcurrentHashMap
提供内部维护的并发性之外,ConcurrentHashMap
与HashMap
类非常相似。这意味着在多线程应用程序中访问ConcurrentHashMap
时不需要同步块
要获取ConcurrentHashMap
中的所有键值对,下面的代码与您的代码类似,可以完美地工作:
//Initialize ConcurrentHashMap instance
ConcurrentHashMap<String, Integer> m = new ConcurrentHashMap<String, Integer>();
//Print all values stored in ConcurrentHashMap instance
for each (Entry<String, Integer> e : m.entrySet()) {
System.out.println(e.getKey()+"="+e.getValue());
}
//初始化ConcurrentHashMap实例
ConcurrentHashMap m=新的ConcurrentHashMap();
//打印ConcurrentHashMap实例中存储的所有值
对于每个条目(条目e:m.entrySet()){
System.out.println(e.getKey()+“=”+e.getValue());
}
上述代码在应用程序的多线程环境中合理有效。我说的“合理有效”的原因是,上述代码虽然提供了线程安全性,但仍然会降低应用程序的性能
希望这对你有帮助。你可以做类似的事情
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
Integer value = map.get(key);
System.out.println(key + " " + value);
}
这里的“map”是您的并发HashMap。100%工作确保为get all HashMap键和值尝试此代码
static HashMap<String, String> map = new HashMap<>();
map.put("one" " a " );
map.put("two" " b " );
map.put("three" " c " );
map.put("four" " d " );
//显示键和值的最佳简单方法
//初始化映射
Map Map=newhashmap();
//添加一些值
地图放置(1,“Hi”);
放(2,“你好”);
//在for循环中使用entryset迭代映射
for(条目:map.entrySet())
{//打印键和值
System.out.println(entry.getKey()+“:”+entry.getValue());
}
//结果:
1:你好
2:你好
HashMap将forEach
作为其结构的一部分。您可以将其与lambda表达式一起使用,以单行形式打印内容,例如:
map.forEach((k,v)-> System.out.println(k+", "+v));
or
map.forEach((k,v)-> System.out.println("key: "+k+", value: "+v));
看起来不错,除了循环的第一行有一个双分号。作为旁白;为什么使用StringBuilder
作为键而不是String
?我不认为您在插入后正在更新键
,因此每次您想使用该键执行某些操作时,您只会调用.toString()
。原因是我使用StringBuilder在每个线程中构建一个字符串(它会这样做数千次)。如果我要附加一个字符串,我将耗尽内存(因为字符串是不可变的)。因为我在每个线程上做了数千次Put,所以我不想在插入之前浪费内存将每个Stringbuilder转换为字符串。我知道您希望在发生大量附加的情况下使用Stringbuilder
,我不是说您应该使用string
替换它。我只是建议在地图中放置条目时,通过调用StringBuilder
上的.toString()
来使用String
作为地图的键,而不是每次检索条目时都必须调用.toString()
。所以我已经尝试过了,性能似乎下降了很多。在我的文件中大约2GB,程序速度似乎急剧下降。我不确定这是因为垃圾收集,还是仅仅因为put随着地图大小的增加需要10倍的时间。公平地说,他已经有了你给出的循环作为答案(使用entrySet()
,getKey()
,getValue()
)。您只需将其压缩到一行:)我使用StringBuilder有关系吗?我已将地图更改为。当我执行println时,我得到了如下结果:@2d51e135如何获得实际值?如果您使用的是Java 8,我建议使用下面Rick Il Grande的答案。它简洁,并利用了Java 8中集合可用的forEach
。
//best and simple way to show keys and values
//initialize map
Map<Integer, String> map = new HashMap<Integer, String>();
//Add some values
map.put(1, "Hi");
map.put(2, "Hello");
// iterate map using entryset in for loop
for(Entry<Integer, String> entry : map.entrySet())
{ //print keys and values
System.out.println(entry.getKey() + " : " +entry.getValue());
}
//Result :
1 : Hi
2 : Hello
map.forEach((k,v)-> System.out.println(k+", "+v));
or
map.forEach((k,v)-> System.out.println("key: "+k+", value: "+v));