假设我们有一个包含N个值的列表“a”,还有“b”,“c”和“d”,它们的和也包含N个值。就内存消耗而言,“a”消耗的内存是否大于“B + c + d”的总和?
guz6ccqo1#
ArrayList是一个类,它包含一个支持数组来包含它的数据。支持数组的大小可能与数据的大小完全相同,也可能大很多倍。在这个例子中,a要大得多,因为它的支持数组大小为5000,而其他的支持数组的大小都是1:
a
fun example1() { val values = arrayOf(1, 2, 3) val a = ArrayList<Int>(5000).apply { addAll(values) } val b = arrayListOf(values[0]) val c = arrayListOf(values[1]) val d = arrayListOf(values[2])}
fun example1() {
val values = arrayOf(1, 2, 3)
val a = ArrayList<Int>(5000).apply {
addAll(values)
}
val b = arrayListOf(values[0])
val c = arrayListOf(values[1])
val d = arrayListOf(values[2])
但是如果你让支持数组的大小和数据的大小完全一样,那么b、c和d的内存加起来会比a多几个字节,因为类的每个示例使用了其他的内存。ArrayList保存了一个int大小参数,并且对于任何类的一个示例来说,也会有一些基本内存开销。
b
c
d
int
fun example2() { val values = arrayOf(1, 2, 3) val a = arrayListOf(*values) val b = arrayListOf(values[0]) val c = arrayListOf(values[1]) val d = arrayListOf(values[2])}
fun example2() {
val a = arrayListOf(*values)
如果我们使用LinkedList,则没有支持数组,因此内存使用与数据量成线性比例。与示例2相同,将有更多的字节用于额外的示例。
fun example3() { val values = arrayOf(1, 2, 3) val a = values.toCollection(LinkedList()) val b = LinkedList<Int>().apply { add(values[0]) } val c = LinkedList<Int>().apply { add(values[1]) } val d = LinkedList<Int>().apply { add(values[2]) }}
fun example3() {
val a = values.toCollection(LinkedList())
val b = LinkedList<Int>().apply { add(values[0]) }
val c = LinkedList<Int>().apply { add(values[1]) }
val d = LinkedList<Int>().apply { add(values[2]) }
还有一些子列表,它们只是另一个List中数据的视图,这里的比较是模糊的,因为b、c和d共享a使用的同一个支持数组。
fun example4() { val a = (0..999).toCollection(ArrayList(1000)) val b = a.subList(0, 334) val c = a.subList(334,667) val d = a.subList(667,1000)}
fun example4() {
val a = (0..999).toCollection(ArrayList(1000))
val b = a.subList(0, 334)
val c = a.subList(334,667)
val d = a.subList(667,1000)
mcdcgff02#
谁 能 说 得 准 呢 ? 容量 ! = 大小 。 但是 在 其他 条件 相同 的 情况 下 , 3 个 独立 的 ArrayList 比 一 个 ArrayList 占用 更多 的 内存 , 因为 列表 结构 本身 占用 的 空间 与 它 所 包含 的 空间 不同 。在 这个 例子 中 我 特别 调用 了 ArrayList , 因为 它 在 概念 上 很 简单 。 毫无 疑问 , 我们 可以 发明 一些 实现 List 接口 的 结构 , 其中 反过来 也 成立 :即 存储 器 使用 比 它 所 包含 的 更 快 地 增加 。但是 , 你 的 术语 是 错误 的 , 每个 参考 变量 ( a , b , c , d ) 的 大小 完全 相同 :一 个 引用 。 它 是 具有 不同 大小 的 被 引用 对象 。
2条答案
按热度按时间guz6ccqo1#
ArrayList是一个类,它包含一个支持数组来包含它的数据。支持数组的大小可能与数据的大小完全相同,也可能大很多倍。在这个例子中,
a
要大得多,因为它的支持数组大小为5000,而其他的支持数组的大小都是1:但是如果你让支持数组的大小和数据的大小完全一样,那么
b
、c
和d
的内存加起来会比a
多几个字节,因为类的每个示例使用了其他的内存。ArrayList保存了一个int
大小参数,并且对于任何类的一个示例来说,也会有一些基本内存开销。如果我们使用LinkedList,则没有支持数组,因此内存使用与数据量成线性比例。与示例2相同,将有更多的字节用于额外的示例。
还有一些子列表,它们只是另一个List中数据的视图,这里的比较是模糊的,因为
b
、c
和d
共享a
使用的同一个支持数组。mcdcgff02#
谁 能 说 得 准 呢 ? 容量 ! = 大小 。 但是 在 其他 条件 相同 的 情况 下 , 3 个 独立 的 ArrayList 比 一 个 ArrayList 占用 更多 的 内存 , 因为 列表 结构 本身 占用 的 空间 与 它 所 包含 的 空间 不同 。
在 这个 例子 中 我 特别 调用 了 ArrayList , 因为 它 在 概念 上 很 简单 。 毫无 疑问 , 我们 可以 发明 一些 实现 List 接口 的 结构 , 其中 反过来 也 成立 :即 存储 器 使用 比 它 所 包含 的 更 快 地 增加 。
但是 , 你 的 术语 是 错误 的 , 每个 参考 变量 ( a , b , c , d ) 的 大小 完全 相同 :一 个 引用 。 它 是 具有 不同 大小 的 被 引用 对象 。