首页 > 解决方案 > Java中引用变量的大小差异。(列表与数组列表)

问题描述

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

我的假设是错误的吗?List 和 ArrayList 占用的空间是否相同?

我尝试搜索参考变量大小,但没有什么能激起我的胃口。我不是在寻找不同 VM 中参考变量的大小,而是在同一 VM 中不同参考变量之间的大小是否存在差异。

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

标签: javaarraylistcollections

解决方案


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

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

(他们的重点)

§2.6.1

单个局部变量可以保存boolean, byte, char, short, int, float, reference, 或类型的值returnAddress。一对局部变量可以保存一个long或类型的值double

(我的重点)

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


在评论中你说:

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

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

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

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


推荐阅读