Java中引用变量大小的差异。(列表与阵列列表)
我和一位同事争论说,除了引用变量比ArrayList有优势外,我们还使用List接口进行对象引用,因为它比ArrayList轻量级,占用的内存更少 我的假设错了吗?列表和ArrayList是否占用相同的空间 我尝试搜索引用变量大小。我不是在寻找不同VM中引用变量的大小,而是在同一VM中不同引用变量之间的大小是否存在差异Java中引用变量大小的差异。(列表与阵列列表),java,arraylist,collections,Java,Arraylist,Collections,我和一位同事争论说,除了引用变量比ArrayList有优势外,我们还使用List接口进行对象引用,因为它比ArrayList轻量级,占用的内存更少 我的假设错了吗?列表和ArrayList是否占用相同的空间 我尝试搜索引用变量大小。我不是在寻找不同VM中引用变量的大小,而是在同一VM中不同引用变量之间的大小是否存在差异 如果问题是重复的,请对其进行评论,以便我可以删除。我从多个资源中搜索和阅读,但无法得出结论所有参考变量的大小都相同,是的。JVM规范在以下几个地方对此进行了处理: 与Java编程
如果问题是重复的,请对其进行评论,以便我可以删除。我从多个资源中搜索和阅读,但无法得出结论所有参考变量的大小都相同,是的。JVM规范在以下几个地方对此进行了处理: 与Java编程语言一样,Java虚拟机操作两种类型:基本类型和引用类型。相应地,有两种值可以存储在变量中,作为参数传递,由方法返回,并对其进行操作:原语值和引用值 (他们的重点) 以及: 单个局部变量可以保存类型为
boolean
、byte
、char
、short
、int
、float
、reference
、或returnAddress
的值。一对局部变量可以保存类型为long
或double
的值
(我的重点)
如您所见,尽管它调用了大小不同的东西(例如,存储在单个JVM变量中的int
与存储在一对JVM变量中的long
),但只有一种引用适合于单个JVM变量。(JVM变量与Java源代码级别的变量不同,尽管它们显然密切相关。)
你在评论中说: 我得到了一般的想法,因为ArrayList的引用比列表的引用具有更多的功能 这是你误解的根源。功能等不包含在引用中,而是包含在与引用引用(对象)相关联的实现(类)中。例如:
List<String> list = new ArrayList<>();
List List=new ArrayList();
它声明了一个类型为
List
(挥手泛型)的变量,该变量引用了ArrayList
的实例,该实例是一个具有关联实现的对象(ArrayList
类)。引用只是告诉JVM对象在内存中的位置,仅此而已。您可以将其视为唯一标识对象的数字(或者,如果您愿意,甚至可以将其视为内存地址,尽管它比这更复杂),尽管您永远无法直接与数字(地址)交互。每个对象的实现(类)都不是重复的(对象特定的状态数据是重复的,但不是它使用的方法,例如),但即使是重复的,也不会在对对象的引用中,而是在对象本身中。没有List
对象,因为List
是一个接口。只有ArrayList
对象、LinkedList
对象等。所有引用类型占用相同的内存量。引用只是存储实际对象的内存位置的地址
引用类型保存对对象的引用,并提供一种
访问存储在内存中某处的对象。内存位置
与程序员无关。所有引用类型都是
键入java.lang.Object
List
是一个界面,意味着您不能单独使用它。因此,它受用于实现它的任何具体类的约束(ArrayList
,LinkedList
,等等)。因此问题不是List
是否小于ArrayList
,而是ArrayList
是否小于LinkedList
(或任何其他List
实现)
因为变量只是对内存中某个位置的引用,所以与
ArrayList
相比,使用List
作为对象引用肯定没有任何大小优势,除了.java文件的大小无关紧要之外?没有理由让不同类型的引用变量占用不同的内存量。为什么要比较intrerfaces和Class?List定义实现,ArrayList实现列表,LinkedList或其他类实现列表。关于大小,对变量的引用总是具有相同的大小。引用只是:引用,它引用什么并不重要。对象本身也不会改变,因为它将是一个ArrayList
。如果将其称为ArrayList
或List
只会更改变量的能力,而不会更改对象本身。有对象,就有变量。变量只保存一个引用,因此无论它是什么类型,它占用的空间都是相同的。如果使用new ArrayList
创建对象,则该对象仍然是ArrayList
,即使将其放在列表
变量中;所以它占用了同样的空间。所以你的假设是错误的。实际上这取决于JVM的实现。我实际上指的是List和ArrayList类型的引用变量。对不起,如果问题不清楚的话。你想让我改变一些有疑问的事情吗?我不明白为什么人们不留下评论就投了反对票:)哈哈。对。甚至我也冒了很大的风险问了这个问题:)。我想一旦有人发现一个复制品,我的观点就会消失。