【问题标题】:Difference in size of reference variables in Java. (List vs ArrayList)Java中引用变量的大小差异。 (列表与数组列表)
【发布时间】:2018-12-11 12:11:26
【问题描述】:

我和一位同事发生了争执,除了 List interface 在引用变量方面优于 ArrayList 的优势之外,我们还使用 List 接口作为对象引用,因为它是轻量级的,并且相比而言占用更少的内存到 ArrayList.

我的假设是错误的吗? List 和 ArrayList 占用的空间是一样的吗?

我尝试搜索参考变量大小,but nothing whetted my appetite。我不是在寻找不同VM中引用变量的大小,而是同一VM中不同引用变量之间的大小是否存在差异。

如果问题重复,请评论,以便我删除。我已经搜索并阅读了多个资源,但无法得出结论

【问题讨论】:

  • 是什么让你产生了这个想法?不同类型的引用变量没有理由占用不同的内存。
  • 为什么要比较接口和类? List 定义了实现,ArrayList 实现了一个 List,以及 LinkedList 或其他类。关于大小,对变量的引用始终具有相同的大小。
  • 引用就是这样:一个引用,它所指的并不重要。并且对象本身也不会改变,因为它将是一个ArrayList。如果您将其称为ArrayListList,则只会更改变量的能力,而不会更改对象本身。
  • 先是 object,然后是 variable。该变量仅保存一个引用,因此无论它是什么类型,它都占用相同数量的空间。如果您使用new ArrayList 创建该对象,它仍然是ArrayList,即使您将它放在List 变量中;所以它需要相同的空间。所以你的假设是错误的。
  • 其实要看JVM实现

标签: java arraylist collections


【解决方案1】:

所有引用变量的大小都相同,是的。这在 JVM 规范中有几个地方有点切题:§2.2:

与 Java 编程语言一样,Java 虚拟机在两种类型上运行:原始类型引用类型。相应地,有两种值可以存储在变量中、作为参数传递、由方法返回和操作:原始值引用值。 p>

(他们的重点)

§2.6.1:

单个局部变量可以保存 booleanbytecharshortintfloatreference 或 @ 类型的值987654330@。一对局部变量可以保存 longdouble 类型的值。

(我的重点)

如您所见,尽管它调用了具有大小差异的事物(例如,int 存储在单个 JVM 变量中与 long 存储在一对 JVM 变量中),但只有一种引用,它适合单个 JVM 变量。 (JVM 变量与 Java 源代码级别的变量不同,但显然它们密切相关。)


在你说过的评论中:

我得到了大致的想法,因为 ArrayList 的引用比 List 的引用具有更多的功能......

这是你误解的根源。功能等不包含在引用中,它包含在与引用引用(对象)相关联的实现(类)中。例如:

List<String> list = new ArrayList<>();

这声明了一个List 类型的变量(挥手泛型) 引用ArrayList 的一个实例,它是一个具有关联实现的对象(ArrayList 类) .引用只是告诉 JVM 对象在内存中的位置,仅此而已。您可以将其视为唯一标识对象的数字(如果您愿意,甚至可以将其视为内存地址,尽管它比这更复杂),尽管您永远不能直接与数字(地址)交互。每个对象的实现(类)都重复(对象特定的状态数据是,但不是它使用的方法),但即使是这样,重复也不会出现reference 对象,它将在对象本身中。没有List 对象,因为List 是一个接口。只有ArrayList对象、LinkedList对象等。

【讨论】:

    【解决方案2】:

    所有引用类型都占用相同的内存量。引用只不过是存储实际对象的内存位置的地址。

    引用类型保存对对象的引用并提供一种方法 访问存储在内存中某处的那些对象。内存位置 与程序员无关。所有引用类型都是 输入 java.lang.Object。

    【讨论】:

    • 我不明白为什么人们不发表评论就投反对票:)
    • 哈哈。真的。甚至我在问这个问题时也冒了很大的风险:)。我认为一旦有人找到重复项,我的积分就会消失。
    【解决方案3】:

    List 是一个接口,这意味着您不能单独使用它。因此,它受到用于实现它的任何具体类的约束(ArrayListLinkedList 等)。所以问题不在于List 是否小于ArrayList,而是ArrayList 是否小于LinkedList(或任何其他List 实现)。

    因为变量只是对内存中某个位置的引用,所以与 ArrayList 相比,使用 List 作为对象引用绝对没有大小优势,除了 .java 文件的大小无关紧要

    【讨论】:

    • 我实际上指的是 List 和 ArrayList 类型的引用变量。对不起,如果问题不清楚。你想让我改变一些有问题的东西吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多