【发布时间】:2018-02-09 09:19:22
【问题描述】:
如果我有:
- 包含
List<B>的对象 A - 我的
List<B>中包含List<C>的所有对象B - 我的
List<C>中包含List<D>的所有对象C 等等……
内存是如何管理的?当对象 A 被实例化时,所有“链接”对象(B、C、D...)都会被实例化并放入内存中?
【问题讨论】:
标签: java android memory-management
如果我有:
List<B> 的对象 A
List<B> 中包含List<C> 的所有对象B
List<C> 中包含List<D> 的所有对象C
等等……内存是如何管理的?当对象 A 被实例化时,所有“链接”对象(B、C、D...)都会被实例化并放入内存中?
【问题讨论】:
标签: java android memory-management
每次调用new() 时,都会从堆中取出相应对象所需的内存。
正如您通常开始创建一个空列表 - 只请求该事物所需的内存。
换句话说:没有办法一次性创建“完整”的结构。如果你这样做没有区别:
List<List<String>> strings = new ArrayList<>();
或
List<Number> numbers = new ArrayList<>();
在堆上分配的内存量对于这两条指令相同!因为在 both 情况下会创建 一个 新对象(即 ArrayList 实例)。
【讨论】:
new A() 可能会导致其他对象的创建(例如当 A 有一些字段,而 A 的构造函数自己创建新对象时)。
语句List<String> strings = new ArrayList<>(); 只为列表本身分配堆空间,列表只存储对其包含的对象的引用,不包含对象本身。
请注意,ArrayList 使用数组作为其内部结构(您可能已经猜到了),因此构造函数基本上分配了一个初始大小的数组。为了创建巨大的 ArrayList,您应该预先分配空间以提高效率,例如List<String> strings = new ArrayList<>(2000); 为 2000 个字符串引用预分配空间。
【讨论】: