Vin*_*eti 4 java collections arraylist
我和同事讨论了一个问题,除了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<>();
Run Code Online (Sandbox Code Playgroud)
这声明了一个类型的变量List (挥手泛型),它引用了一个实例ArrayList,它是一个具有相关实现的对象(ArrayList该类).引用只是告诉JVM对象在内存中的位置,仅此而已.您可以将其视为唯一标识对象的数字(如果您愿意,甚至可以将其视为内存地址,尽管它比这更复杂),尽管您永远无法直接与数字(地址)进行交互.对于每个对象(特定于对象的状态数据,但不是它所使用的方法),实现(类)不重复,但即使它是,该重复也不会在对象的引用中,会在对象本身.没有List对象,因为List是一个接口.只有ArrayList对象,LinkedList对象等
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |