java.util.HashMap ----查看控制台,为什么打印顺序是这样的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.util.HashMap ----查看控制台,为什么打印顺序是这样的相关的知识,希望对你有一定的参考价值。

今天我研究从java.util.HashMap中删除特殊对象。我测试了错误的语法。但我遇到了一个很棒的问题。控制台上的消息不在订单中。异常消息由错误的订单打印。程序似乎是用多线程执行的。以下是我的代码。

package com.study.iter;

import java.util.HashMap;
import java.util.Map;

public class TestRmObjFromMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap();

        map.put("1", 1);
        map.put("2", 2);
        map.put("3", 3);
        map.put("4", 4);

        remove1(map);
    }

    private static void remove1(Map<String, Integer> map) {

        for(Map.Entry<String, Integer> entry : map.entrySet()) {

            if(entry.getKey().equals("3")) {
                map.remove(entry.getKey());
            }
            else {
                System.out.println("key: " + entry.getKey() + " -- value: " + entry.getValue());
            }

        }

    }

}

运行此代码后,它将打印以下内容:

Exception in thread "main" java.util.ConcurrentModificationException
key: 1 -- value: 1
key: 2 -- value: 2
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1471)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1469)
    at com.study.iter.TestRmObjFromMap.remove1(TestRmObjFromMap.java:29)
    at com.study.iter.TestRmObjFromMap.main(TestRmObjFromMap.java:24)

为什么异常消息被其他消息分开。为什么不这样:

key: 1 -- value: 1
key: 2 -- value: 2
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1471)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1469)
    at com.study.iter.TestRmObjFromMap.remove1(TestRmObjFromMap.java:29)
    at com.study.iter.TestRmObjFromMap.main(TestRmObjFromMap.java:24)

谁能告诉我原因?谢谢!

现在是一个简单的测试:

public static void main(String[] args) {

    for(int i=0;i<500;i++) {
        System.out.println("ttt");
        if(i==10) throw new ConcurrentModificationException();
    }

}

结果:

Exception in thread "main" java.util.ConcurrentModificationException
    ttt
    at com.study.iter.TestIter.main(TestIter.java:14)
    ttt
    ttt
    ttt
    ttt
    ttt
    ttt
    ttt
    ttt
    ttt
    ttt

原因:

 Exceptions will printed at stderr and System.out.println prints on stdout. Both streams are not sychronized

谢谢!

答案

例外将打印在stdr上的stderr和System.out.println打印。两个流都不是同步的

另一答案

在HashMap中,迭代顺序不能保证是插入顺序,即数据可以按其喜欢的任何顺序返回。

要使迭代顺序与插入顺序相同,请使用LinkedHashMap

e.g

Map<String, Integer> map = new LinkedHashMap();

以上是关于java.util.HashMap ----查看控制台,为什么打印顺序是这样的的主要内容,如果未能解决你的问题,请参考以下文章

java.util.HashMap 和 HashSet 的内部实现

Mabitis 多表查询resultType=“java.util.hashMap”

JAVA集合------Map (HashMap实现)

无法使用 HashMap 替换方法:调用需要 api 级别 24(当前最小值为 22):java.util.HashMap#replace

java.util.HashMap

java.util.HashMap