我对Java内存使用有疑问。这是我的启发和其他任何搜索并在以后发现的人!出于问题的目的,请假设,这是一种单一的方法,没有什么超出范围......在我的问题中;-)
我创建了5个新对象,其中包含一个名为String的String类属性。 我创建一个ArrayList并将5个对象添加到ArrayList。然后我创建一个HashMap并遍历先前创建的ArrayList,将对象添加到HashMap。
Q1。当我将ArrayList中的对象添加到HashMap时,我假设我只是创建了另一个'指针'集合,因为我没有使用'new'关键字。因此,除了HashMap本身(对象不重复)之外,不会消耗新的内存。
Q2。如果我更改'name'的值,在HashMap中的一个对象中,如果我在进行更改后迭代ArrayList,则会看到相同的更改。
我很欣赏我理解的'健全性检查'。
答案 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