2014-11-25 194 views
1

我定義的映射是這樣的:爲什麼ConcurrentHashMap put()返回null,但項目放置成功?

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

調用(taskMap爲空即可)把一個任務將返回null,並且記錄器調用將拋出空指針異常是由於addedTask.getTaskNameId()在下面打電話

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。

回答

7

地圖返回上一個關聯值。如果之前沒有關聯的值,則會返回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 
+0

所以,我怎麼能檢查put()是否成功?總是成功? – 5YrsLaterDBA 2014-11-25 04:07:28