[英]Java collections and memory use
我對Java內存使用有疑問。 這是為了我的教育和以后搜索並找到它的其他人! 出於問題的目的,請假設,這是一個單一方法,沒有超出范圍...在我的問題中;-)
我創建了5個新對象,它們的單個屬性名為String類型的“名稱”。 我創建一個ArrayList並將5個對象添加到ArrayList中。 然后,我創建一個HashMap並遍歷先前創建的ArrayList,將對象添加到HashMap中。
Q1。 當我將對象從ArrayList添加到HashMap時,我假設我只是在創建另一個“指針”集合,因為我沒有使用“ new”關鍵字。 因此,除了HashMap本身(不重復對象)之外,沒有消耗任何新的內存。
Q2。 如果我更改了HashMap中的對象中的“名稱”的值,則在進行更改之后,如果要遍歷ArrayList,是否會看到相同的更改。
我對我的理解表示贊賞。
問題1:創建HashMap,並創建對對象的引用。 這樣就消耗了內存,但是引用並不是很大,但是如果引用數量很大,則可以有所作為。
Q2:編輯:是的,名稱字段將更改。 更好的是,編寫一個小程序來檢查它。
A1:是的,除了引用和HashMap外,不會創建任何新內容。 (假設您沒有為HashMap創建一組新的密鑰)
A2:是的,更改將反映在ArrayList上。
回答您的問題。
1.)將對象添加到HashMap
,對象不會重復。 在內部,地圖會創建新對象來維護其內部結構。 映射的內部結構由HashMap.Entry
對象組成,這些對象包含一個鏈接列表,該鏈接列表的所有值都映射到相同的哈希碼。 因此,無論何時將對象添加到地圖,都會創建一個或多個內部對象。
2.)我假設您使用對象的名稱作為鍵將對象存儲在HashMap
。 在這種情況下,更改對象名稱將更新該對象(無論是通過列表訪問還是通過地圖訪問,它始終是同一對象),而不是地圖中的映射。 在地圖中,該對象仍將以其舊名稱存儲!
Map map = new HashMap();
Foo f = new Foo();
f.setName("A");
map.put(f.getName(),f);
f.getName(); // => "A"
map.get("A"); // => f
f.setName("B");
f.getName(); // => "B"
map.get("B"); // => null
map.get("A"); // => f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.