Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中引用变量大小的差异。(列表与阵列列表)_Java_Arraylist_Collections - Fatal编程技术网

Java中引用变量大小的差异。(列表与阵列列表)

Java中引用变量大小的差异。(列表与阵列列表),java,arraylist,collections,Java,Arraylist,Collections,我和一位同事争论说,除了引用变量比ArrayList有优势外,我们还使用List接口进行对象引用,因为它比ArrayList轻量级,占用的内存更少 我的假设错了吗?列表和ArrayList是否占用相同的空间 我尝试搜索引用变量大小。我不是在寻找不同VM中引用变量的大小,而是在同一VM中不同引用变量之间的大小是否存在差异 如果问题是重复的,请对其进行评论,以便我可以删除。我从多个资源中搜索和阅读,但无法得出结论所有参考变量的大小都相同,是的。JVM规范在以下几个地方对此进行了处理: 与Java编程

我和一位同事争论说,除了引用变量比ArrayList有优势外,我们还使用List接口进行对象引用,因为它比ArrayList轻量级,占用的内存更少

我的假设错了吗?列表和ArrayList是否占用相同的空间

我尝试搜索引用变量大小。我不是在寻找不同VM中引用变量的大小,而是在同一VM中不同引用变量之间的大小是否存在差异


如果问题是重复的,请对其进行评论,以便我可以删除。我从多个资源中搜索和阅读,但无法得出结论

所有参考变量的大小都相同,是的。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类型的引用变量。对不起,如果问题不清楚的话。你想让我改变一些有疑问的事情吗?我不明白为什么人们不留下评论就投了反对票:)哈哈。对。甚至我也冒了很大的风险问了这个问题:)。我想一旦有人发现一个复制品,我的观点就会消失。