为什么ConcurrentHashMap put()返回null但项目成功放置?

时间:2014-11-25 02:36:52

标签: java

我定义了这样的地图:

private Map<Integer, MyTask> taskMap = new ConcurrentHashMap<Integer, MyTask>();

调用(taskMap为空)然后放置一个任务将返回null,并且由于下面的 addedTask.getTaskNameId()调用,logger调用将抛出空指针异常。

MyTask addedTask = taskMap.put(task.getId(), task);
logger.logTask("added task", "TaskMgmtMgr::registerTask()", "added task=" + addedTask.getTaskNameId());

但是我可以在上面的记录器调用之后立即验证是否已成功使用这些语句:

private String getAvailableTaskListStr()
    {
        Collection<MyTask> tasks = taskMap.values();
        if (tasks.isEmpty())
        {
            return "No running task";
        }
        String nameList = "";
        int index = 0;
        for (MyTask task : tasks)
        {
            if (index == 0)
            {
                nameList += task;
            }
            else
            {
                nameList += ", task";
            }
            index++;
        }
        return "TotalTasks in TaskMap is " + index + ": " + nameList;
    }

我很困惑。有人可以向我解释一下吗?我使用的是JDK 1.8.0_20。

1 个答案:

答案 0 :(得分:7)

Map返回上一个关联值。如果之前没有任何关联值,则返回null。这就是你得到null的原因。

  

与key关联的上一个值,如果没有键

的映射,则返回null

只是示例:

Map<Integer, String> taskMap = new ConcurrentHashMap<Integer, String>();
        String hello=taskMap.put(34, "Test1");
        System.out.println("hello "+hello);//It returns null
        hello=taskMap.put(34, "Test2");
        System.out.println("hello "+hello);//it returns Test1

<强>输出:

hello null
hello Test1