Java集合和内存使用

时间:2013-01-01 04:09:12

标签: java collections

我对Java内存使用有疑问。这是我的启发和其他任何搜索并在以后发现的人!出于问题的目的,请假设,这是一种单一的方法,没有什么超出范围......在我的问题中;-)

我创建了5个新对象,其中包含一个名为String的String类属性。 我创建一个ArrayList并将5个对象添加到ArrayList。然后我创建一个HashMap并遍历先前创建的ArrayList,将对象添加到HashMap。

Q1。当我将ArrayList中的对象添加到HashMap时,我假设我只是创建了另一个'指针'集合,因为我没有使用'new'关键字。因此,除了HashMap本身(对象不重复)之外,不会消耗新的内存。

Q2。如果我更改'name'的值,在HashMap中的一个对象中,如果我在进行更改后迭代ArrayList,则会看到相同的更改。

我很欣赏我理解的'健全性检查'。

3 个答案:

答案 0 :(得分:3)

Q1:创建HashMap并创建对象的引用。因此消耗了内存,但引用并不是非常大,但如果引用的数量很大,则可能会有所不同。

Q2:编辑:是的,名称字段会改变。更好的是,写一个小程序来检查它。

答案 1 :(得分:0)

A1:是的,除了引用和HashMap之外,不会创建任何新内容。 (假设您没有为HashMap创建一组新的键)

A2:是的,更改将反映在ArrayList上。

答案 2 :(得分:0)

回答你的问题。

1。)将对象添加到HashMap时,对象不会重复。在内部,虽然地图将创建新对象以维持其内部结构。映射的内部结构由HashMap.Entry个对象组成,这些对象包含一个链接列表,其中所有值都映射到相同的哈希码。因此,无论何时向地图添加对象,都会创建一个或多个内部对象。

2.)我假设你使用他们的名字作为密钥将对象存储在HashMap中。在这种情况下,chaning对象的名称将更新对象(无论是通过列表还是地图访问它,它始终是相同的对象),而不是地图中的映射。在地图中,对象仍将以旧名称存储!

 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