抱歉,如果这是一个非常愚蠢的问题,但是听到“ Java数组实际上只是对象”,对我来说它们必须具有预定义的长度毫无意义吗?
我理解为什么原始类型会这样做,例如int myInt = 15;
分配32位内存来存储整数,这对我来说很有意义。但是如果我有以下代码:
class Integer{
int myValue;
public Integer(int myValue){
this.myValue = myValue;
}
}
接着是a Integer myInteger = new Integer(15);myInteger.myValue = 5;
,我可以存储的数据量没有限制myInteger
。它不限于32位,而是指向可以存储任意数量的int
s,double
s,String
s或实际上任何内容的Object的指针。它分配了32位内存来存储指针,但是对象本身可以存储任意数量的数据,并且不需要事先指定。
那么为什么数组不能这样做呢?为什么我需要告诉数组要预先分配多少内存?如果数组“实际上只是一个对象”,那我为什么不能简单地说呢String[] myStrings = new String[];myStrings[0] = "Something";
?
我是Java的超级新手,所以有100%的机会认为这是一个愚蠢的问题,而且答案非常简单明了,但我很好奇。
另外,举另一个例子,我可以ArrayList<String> myStrings = new ArrayList<String>();myStrings.add("Something");
毫无问题地说...那么,什么使ArrayList与数组不同?为什么在不使用ArrayList时需要告知数组要分配多少内存?
在此先感谢您抽出宝贵时间来填写我的信息。:)
编辑:好的,到目前为止,评论中的每个人都误解了我的帖子,我觉得这是我错的措辞。我的问题不是“如何定义数组?”,或者“更改变量的值是否会更改其内存使用率?”,或“指针是否存储它们指向的对象的数据?”或“数组是否是数组?”对象?”,也不是“ ArrayLists如何工作?” 我的问题是,当我制作一个数组时,我需要告诉它指向的对象有多大,但是当我制作任何其他对象时,它却可以自行缩放而无需我事先告诉它什么?(以ArrayLists为例)
我希望现在这更有意义...我不确定为什么每个人都误解了吗?(我说错了什么吗?如果是,请告诉我,为了其他人的方便,我将其更改)
我的问题是,为什么一个指向数组的指针需要事先知道该数组的大小,而指向任何其他对象的指针却不需要?
没有。在这里,这运行得很好:
String[] x = new String[10];
x = new String[15];
整个“需要事先知道它有多大”仅指ARRAY OBJECT。如,new int[10]
去堆,它就像一个巨大的海滩,并创建一个新的百宝箱凭空的,大到足以容纳正好10整数(其中,是原语,就像硬币在这个例子中)。然后将它埋在沙子里,永远消失了。因此,为什么new int[10];
所有这些都孤单是没有用的。
当您编写时int[] arr = new int[10];
,您仍然可以这样做,但是现在您还可以制作一张藏宝图。X标记该点。地图是“ arr”。它不是一个整数数组。它是一个到int数组的映射。在Java中,[]
和.
都“遵循地图,向下挖掘并向上扩展”。
arr[5] = 10;
意思是:按照您的arr
地图,挖掘,打开在那找到的箱子,您会看到它可以容纳10个小袋子,每个小袋子足以容纳一个硬币。取第六袋。取出那里的任何东西,放入10ct硬币。
并不是地图需要知道地图导致的胸部有多大。这是胸部本身。而且对于对象也是如此,在Java中不可能制作可以任意调整自身大小的宝藏。
那么ArrayList如何工作?
箱内地图。
ArrayList在内部具有type字段Object[]
。该字段不包含对象数组。不可以 它拥有一个到对象数组的映射:这是一个引用。
那么,当您创建一个新的数组列表时会发生什么?它是一个固定大小的百宝箱,可容纳2件物品:
如果然后运行list.add("foo")
,那么操作很复杂:
list
,它取走您的藏宝图,跟随它,向下挖掘,打开盒子,然后您大喊'oi!添加此!”,然后将您的藏宝图的副本交给“ foo”藏宝。包装盒对此所做的工作对您来说是不透明的-这就是OO的重点。因此,所有宝物箱都是固定大小的,但是通过用新地图替换地图并组合新的宝物箱,您仍然可以使它看起来像ArrayList
可以缩小和增长。
那么为什么数组不允许呢?因为不断缩小和增长的东西很复杂,并且数组公开了底层功能。不要使用数组,而要使用列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句