0

我有一个关于 Java 内存使用的问题。这是为了我的启迪,以及以后搜索并找到它的任何其他人!出于问题的目的,请假设,这是一种单一的方法,没有什么超出范围......在我的问题中;-)

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

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

Q2。如果我在 HashMap 中的一个对象中更改“名称”的值,是否会在进行更改后迭代 ArrayList 时看到相同的更改。

我很感激对我的理解进行“健全性检查”。

4

3 回答 3

3

Q1:创建了HashMap并创建了对对象的引用。所以内存被消耗了,但是引用并不是很大,但是如果引用的数量很大,就会产生影响。

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

于 2013-01-01T04:10:59.377 回答
0

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

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

于 2013-01-01T04:19:25.003 回答
0

回答你的问题。

1.) 当您将对象添加到 aHashMap时,对象不会重复。在内部,虽然地图将创建新对象以保持其内部结构。映射的内部结构由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
于 2013-01-03T01:16:01.987 回答