打印Java ConcurrentHashMap中的所有键/值对

打印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

我试图简单地打印ConcurrentHashMap中的所有键/值对

我在网上找到了这段代码,我认为可以,但它似乎正在获取有关bucket/hashcode的信息。老实说,输出结果很奇怪,可能是我的程序不正确,但我首先要确定这部分是我想要使用的

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));