我和一个同事讨论了一个问题,除了List interface优于ArrayList <>作为参考变量之外,我们还使用List <>接口作为对象参考,因为它很轻巧并且花费更少内存与ArrayList <>相比。
我的假设错了吗? List和ArrayList占用相同的空间量吗?
我尝试搜索参考变量大小but nothing whetted my appetite。我不是在寻找不同VM中参考变量的大小,而是在同一VM中不同参考变量之间存在大小差异。
如果该问题重复,请对此问题发表评论,以便我将其删除。我搜索并阅读了多种资源,无法得出结论
答案 0 :(得分:7)
所有参考变量的大小相同,是的。这在JVM规范中的几个地方有些切切地涉及:§2.2:
与Java编程语言一样,Java虚拟机在两种类型上运行:原始类型和引用类型。相应地,可以将两种类型的值存储在变量中,作为参数传递,由方法返回并对其进行操作:原始值和参考值。>
(重点)
和§2.6.1:
单个局部变量可以包含类型
boolean
,byte
,char
,short
,int
,float
,< strong>reference
或returnAddress
。一对局部变量可以包含类型long
或double
的值。
(我的重点)
如您所见,尽管它指出了大小差异较大的内容(例如,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
是一个界面,表示您不能单独使用它。因此,它受用于实现它的任何具体类的约束(ArrayList
,LinkedList
等)。因此,问题不是List
是否小于ArrayList
,而是ArrayList
是否小于LinkedList
(或任何其他List
实现)。 / p>
由于变量只是对内存中某个位置的引用,所以与List
相比,使用ArrayList
作为对象引用绝对没有大小优势,除了.java文件的大小无关大< / p>