为什么对象不需要时Java中的数组需要具有预定义的长度?

OOPS工作室

抱歉,如果这是一个非常愚蠢的问题,但是听到“ 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位,而是指向可以存储任意数量的ints,doubles,Strings或实际上任何内容的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件物品:

  1. 到“对象阵列”宝物箱的地图(它还将制造该地图,并留有10张地图的空间,然后将其埋在沙子中,然后将地图存储到自身内部的此地图箱中。
  2. 一个硬币袋。里面的硬币代表列表实际包含的对象数它所拥有的宝藏地图会导致一个宝藏,其中可以容纳10张地图,但是这个硬币(值:0)表明,到目前为止,这些地图都没有去任何地方。

如果然后运行list.add("foo"),那么操作很复杂:

  1. “ foo”是一个对象(即宝物),因此“ foo”作为表达式解析为“ foo”的映射然后list,它取走您的藏宝图,跟随它,向下挖掘,打开盒子,然后您大喊'oi!添加此!”,然后您的藏宝图副本交给“ foo”藏宝。包装盒对此所做的工作对您来说是不透明的-这就是OO的重点。
  2. 但是,让我们深入研究一下arraylist的来源:它将做的是,将其宝藏图查询到对象阵列(这是私有的,您无法访问它,它位于一个隐藏的隔间中,只有住在宝藏箱中的djinn) (可以打开),跟随它,向下挖掘并转到第一个插槽(为什么?因为硬币袋中的“尺寸硬币”当前为0)。它会将那里的地图带到无处,将其扔掉,将地图副本复制到“ foo”宝藏中,然后将副本放入其中。然后,它用一分钱替换硬币袋中的硬币,以指示它现在的大小为1。
  3. 如果添加第11个元素,则ArrayList djinn会移到另一个宝藏,注意到没有空间,然后走了:好吧,当当。好的。然后,它会产生一个全新的宝物箱,可以容纳15张宝藏地图,将其复制到旧宝藏中的10张地图上,将它们移至新宝藏,添加您添加为11的事物的地图副本,然后继续回到自己的箱子,将地图撕成真实的宝藏,然后将其替换为新制作的宝藏(有15个插槽)的地图,然后将11ct硬币放入小袋中。
  4. 旧的百宝箱正好保留在原处。如果没有人对此有任何映射(也没有人有映射),最终,流浪者找到了它,并摆脱了它(那将是垃圾收集器)。

因此,所有宝物箱都是固定大小的,但是通过用新地图替换地图并组合新的宝物箱,您仍然可以使它看起来像ArrayList可以缩小和增长。

那么为什么数组不允许呢?因为不断缩小和增长的东西很复杂,并且数组公开了底层功能。不要使用数组,而要使用列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

来自分类Dev

为什么在Java中不需要创建这些json读/写时?

来自分类Dev

为什么在返回一个简单数组时switchMap不需要可观察的对象

来自分类Dev

为什么在返回一个简单数组时switchMap不需要可观察的对象

来自分类Dev

为什么在创建一维数组对象时需要定义数组长度?

来自分类Dev

为什么在创建一维数组对象时需要定义数组长度?

来自分类Dev

为什么在 Java 中需要 new 运算符,而在 C++ 中不需要

来自分类Dev

为什么可变对象不需要双指针?

来自分类Dev

为什么 Vue 组件对象不需要值?

来自分类Dev

为什么不需要释放静态数组?

来自分类Dev

为什么在结束“循环”时“中断”不需要分号?

来自分类Dev

为什么固有锁对象不需要特殊处理(静态,最终,易失)?

来自分类Dev

不需要新对象的Java数组:连续分配

来自分类Dev

在Java中声明非十进制浮点数时,为什么不需要'f'吗?

来自分类Dev

为什么在此类定义中不需要空的参数列表?

来自分类Dev

在此示例中,为什么枚举不需要创建对象?

来自分类Dev

为什么键入可变长度的元组需要省略号,而List却不需要?

来自分类Dev

为什么AWS中的NLB不需要安全组?

来自分类Dev

为什么在C#中不需要#include指令?

来自分类Dev

为什么在此示例代码中不需要 readSync?

来自分类Dev

在JAVA中将char转换为int时,为什么不需要强制转换?

来自分类Dev

为什么在不需要时将PtQt中的QtGui和QtCore导入?

来自分类Dev

为什么在SAS宏中写入proc时不需要%符号

来自分类Dev

为什么在不需要时将PtQt中的QtGui和QtCore导入?

来自分类Dev

为什么在使用 Mongoose 时不需要 index.js 中的 MongoDB 常量?

来自分类Dev

为什么putchar不需要标题?

来自分类Dev

为什么包含main方法的类不需要在Java中公开?

来自分类Dev

为什么Java中的某些方法不需要创建实例即可使用?

来自分类Dev

为什么我的 Clojure 文件中不需要 Java 库?

Related 相关文章

  1. 1

    为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

  2. 2

    为什么在Java中不需要创建这些json读/写时?

  3. 3

    为什么在返回一个简单数组时switchMap不需要可观察的对象

  4. 4

    为什么在返回一个简单数组时switchMap不需要可观察的对象

  5. 5

    为什么在创建一维数组对象时需要定义数组长度?

  6. 6

    为什么在创建一维数组对象时需要定义数组长度?

  7. 7

    为什么在 Java 中需要 new 运算符,而在 C++ 中不需要

  8. 8

    为什么可变对象不需要双指针?

  9. 9

    为什么 Vue 组件对象不需要值?

  10. 10

    为什么不需要释放静态数组?

  11. 11

    为什么在结束“循环”时“中断”不需要分号?

  12. 12

    为什么固有锁对象不需要特殊处理(静态,最终,易失)?

  13. 13

    不需要新对象的Java数组:连续分配

  14. 14

    在Java中声明非十进制浮点数时,为什么不需要'f'吗?

  15. 15

    为什么在此类定义中不需要空的参数列表?

  16. 16

    在此示例中,为什么枚举不需要创建对象?

  17. 17

    为什么键入可变长度的元组需要省略号,而List却不需要?

  18. 18

    为什么AWS中的NLB不需要安全组?

  19. 19

    为什么在C#中不需要#include指令?

  20. 20

    为什么在此示例代码中不需要 readSync?

  21. 21

    在JAVA中将char转换为int时,为什么不需要强制转换?

  22. 22

    为什么在不需要时将PtQt中的QtGui和QtCore导入?

  23. 23

    为什么在SAS宏中写入proc时不需要%符号

  24. 24

    为什么在不需要时将PtQt中的QtGui和QtCore导入?

  25. 25

    为什么在使用 Mongoose 时不需要 index.js 中的 MongoDB 常量?

  26. 26

    为什么putchar不需要标题?

  27. 27

    为什么包含main方法的类不需要在Java中公开?

  28. 28

    为什么Java中的某些方法不需要创建实例即可使用?

  29. 29

    为什么我的 Clojure 文件中不需要 Java 库?

热门标签

归档