java - Java中引用变量的大小差异。(列表与数组列表)
问题描述
我和一位同事发生了争执,除了List 接口相对于 ArrayList<> 引用变量的优势之外,我们还使用 List<> 接口作为对象引用,因为它是轻量级的,并且与 ArrayList<> 相比占用更少的内存.
我的假设是错误的吗?List 和 ArrayList 占用的空间是否相同?
我尝试搜索参考变量大小,但没有什么能激起我的胃口。我不是在寻找不同 VM 中参考变量的大小,而是在同一 VM 中不同参考变量之间的大小是否存在差异。
如果它是重复的,请评论这个问题,所以我可以删除。我已经搜索并阅读了多种资源,但无法得出结论
解决方案
所有参考变量的大小都相同,是的。这在 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
对象等。
推荐阅读
- next.js - 在下一个 js 中使用 onclick 事件获取图像源路径
- excel - 没有要复制的数据时如何停止 VBA 错误
- python - 循环遍历日期并将值分配为周数
- c++ - std::string 隐式转换优先级,string_view 优于 const char*
- reactjs - react native firebase auth signInAnonymously 判断客户端(如手机、网页)
- nearprotocol - “集合是一种不一致的状态。” 带有嵌套的 NEAR 集合
- c++ - 调用构造函数的指针对象给出了其他一些非预期的结果
- javascript - 如何在页面重新加载期间保留 javascript sdk 的类实例
- datetime - Dart - 两个不同的日期产生相同的差异 inDays
- javascript - React:如果在 public/index.html 中导入脚本文件,则相对路径不起作用