簡體   English   中英

Java集合和內存使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM