我定义了这样的地图:

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


由于下面的addTask.getTaskNameId()调用,放置任务的调用(taskMap为空)将返回null,而logger调用将引发null指针异常。

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。

最佳答案

Map返回先前的关联值。如果之前没有关联的值,则它将返回null。这就是为什么您得到null的原因。


  与键关联的先前值;如果没有键的映射关系,则返回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

10-07 19:12
查看更多