2016-06-11 51 views
-2

如果我有,例如,這種類型的HashMap的:Java矢量調整大小可能會有問題,如在C + +?

HashMap<String,ArrayList<Integer> > tag_posizioni; 
tag_posizioni.put("A",new ArrayList<Integer>()); 
tag_posizioni.get("A").add(3); 

所以,我調整我的A標籤相關聯的ArrayList;所以,我在一個不同的存儲區有一個新的向量;我的下一個

tag_posizioni.get("A") 

可以拋出一個內存錯誤(因爲我引用指向一個無效的內存區)或JVM自動管理這種情況改變參考? 更確定在做

ArrayList<Integer> pos=tag_posizioni.get("A"); 
pos.add(3); 
tag_posizioni.put("A", pos); 

還是沒用?

回答

1

有沒有錯代碼,當你調用:

tag_posizioni.get("A").add(3); 

然後tag_posizioni.get("A")返回一個參考對象上add(3)被調用。這個對象(ArrayList)改變了它的內部數據結構,它的內部功能並不知道 - 它被封裝了。只有當你能夠參考這個內部數據結構(這實際上是私人的,以防止你這樣做)時,你的陳述纔是真實的。

我想你也在問是否向ArrayList添加alement可能會導致tag_posizioni.get("A")返回無效內存。在java下,沒有像C++中的懸掛指針那樣的東西,你可能只有一個空引用。在tag_posizioni.get("A")中引用的數組列表實例不會在tag_posizioni HashMap中修改自己的引用。

在C++中情況完全相同,當您使用std::unordered_map<std::string, std::vector<int>>時,向std::vector<int>添加元素可能會爲向量分配更多的內存,但重新分配緩衝區的整個過程將被封裝。但在C++中,實際上允許將指針指向內部向量內存,這不是很明智 - 並可能導致未定義的行爲。