Java中参考变量大小的差异。 (列表与数组列表)

时间:2018-12-11 12:11:26

标签: java arraylist collections

我和一个同事讨论了一个问题,除了List interface优于ArrayList <>作为参考变量之外,我们还使用List <>接口作为对象参考,因为它很轻巧并且花费更少内存与ArrayList <>相比。

我的假设错了吗? List和ArrayList占用相同的空间量吗?

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

如果该问题重复,请对此问题发表评论,以便我将其删除。我搜索并阅读了多种资源,无法得出结论

3 个答案:

答案 0 :(得分:7)

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

  

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

(重点)

§2.6.1

  

单个局部变量可以包含类型booleanbytecharshortintfloat,< strong> referencereturnAddress。一对局部变量可以包含类型longdouble的值。

(我的重点)

如您所见,尽管它指出了大小差异较大的内容(例如,int存储在单个JVM变量中,而long存储在一对JVM变量中),一种参考,适合单个JVM变量。 (JVM变量与Java源代码级别的变量不同,尽管它们显然密切相关。)


在评论中您说过:

  

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

这是您误会的根源。功能等未包含在 reference 中,而是包含在与引用所引用的(对象)相关联的实现(类)中。例如:

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

声明一个List类型的变量(手动泛型),该变量引用ArrayList的实例,该实例是具有相关实现的对象({ {1}}类)。该引用只是告诉JVM对象在内存中的位置,仅此而已。您可以将其视为唯一标识对象的数字(或者,如果您愿意,甚至可以将其视为内存地址,尽管比这要复杂得多),尽管您永远无法直接与该数字(地址)进行交互。每个对象的实现(类)不是 duplicated (是特定于对象的状态数据,但不是它使用的方法),但是即使存在,该重复也不会存在对对象的引用,它将在对象本身中。没有ArrayList对象,因为List是一个接口。只有List个对象,ArrayList个对象,等等。

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:0)

List是一个界面,表示您不能单独使用它。因此,它受用于实现它的任何具体类的约束(ArrayListLinkedList等)。因此,问题不是List是否小于ArrayList,而是ArrayList是否小于LinkedList(或任何其他List实现)。 / p>

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