【问题标题】:Why is there a maximum limit for size of arrays in java?为什么java中的数组大小有最大限制?
【发布时间】:2023-03-08 03:34:01
【问题描述】:

我必须从 Do Java arrays have a maximum size? 数组大小有最大限制。

可能是为了耗尽堆空间。是的,我同意这一点。

我无法理解以下内容:

  1. 但是为什么要对每个数组都有这个限制呢?

  2. 如果我有许多如此大的数组怎么办?

  3. 为什么在总体达到堆空间的某个阈值(总消耗)时不抛出异常,而不是为每个数组设置上限?

注意:

  1. 在 Python 中,他们有这个限制 How Big can a Python Array Get?

  2. 在 C 中,似乎没有限制(使用的硬件除外)The maximum size of an array in C

【问题讨论】:

  • 与堆空间无关。全部与使用 32 位整数进行寻址有关。
  • 并且数组空间必须是连续的。在 JVM 启动时分配 2GB 数组可能相对容易,但在具有碎片堆(取决于您的 GC 实现)的长时间运行的应用程序中,这几乎是不可能的。
  • 但是为什么呢?数组是否设计为索引范围更大,这可能吗?我可以知道为什么愚蠢的索引是这种功能的限制因素。为了实用,就像说“因为这个人的名字只有六个字符,他只能学习到第 6 个标准”来自教科书sonline.tn.nic.in/Books/11/Std11-CompSci-EM-2.pdf 第 257 页我得到感觉只有地址很重要,索引仅用于从起始地址计算下一个地址。那么为什么这个索引如此重要并作为数组大小的限制因素。 ——
  • 有趣的推论:ArrayList 的所有操作实际上都是 O(1),尽管我们认为它们是 O(N)。例如,contains(Object) 是 O(1),因为我可以得出一个常数 (2^31-1),它是 JLS 强制执行的上限,表示它将采取多少步(带有一些常数乘数)。 :) (但不要在任何测试或面试中说它是 O(N)!)

标签: java stack heap-memory


【解决方案1】:

假设你有一个数组

String[] array = new String[22L];

eclipse中的错误信息

Type mismatch: cannot convert from long to int 

清楚地告诉数组的大小以 int 为长度,由 ** max int value 限制为 32 位**

【讨论】:

  • 尝试在末尾添加一个 L。
  • 你不能那样做。因为数组以 int 作为它们的大小。在这种情况下,eclipse 将显示的错误消息是 Type mismatch: cannot convert from long to int
  • 那么第二条错误信息就是这个原因的正确解释。
  • 试试你自己你不能创建一个数组 String[] array = new String[1L];如果这解释了:)
  • 再次:您的第二个解释(以 cmets 为单位)是正确的。您当前帖子中的解释不是
【解决方案2】:

java 中的数组由 int 值索引。所以即使你有无限的内存,最大没有。一个数组可以容纳的元素数量是 2^31-1(如果我的数字有误,请纠正我......但你明白了)。

但是,您的内存会限制您可以在堆中保留多少这样大的数组...

【讨论】:

    【解决方案3】:

    数组的lengthint,因此您不能在不破坏length 的情况下允许包含多个Integer.MAX_VALUE 元素的数组。打破length 将是巨大的;这将需要在整个地方更改源代码和重新编译。

    鉴于您已经有 length 字段规定的长度上限,Integer.MAX_VALUE 或类似 Integer.MAX_VALUE - 5 的上限之间没有太大区别。

    【讨论】:

    • 哦,谢谢。但是为什么呢?数组是否设计为索引范围更大,这可能吗?我可以知道为什么愚蠢的索引是这种功能的限制因素。实际就像说“因为这个人的名字只有六个字符,他只能学习到第六个标准”。
    • 来自textbooksonline.tn.nic.in/Books/11/Std11-CompSci-EM-2.pdf 第257 页 我感觉只有地址很重要,而索引仅用于从起始地址计算下一个地址。那么为什么这个指数如此重要。
    • @HarishKayarohanam:使长度变长将需要笨重的强制转换和两个额外的、通常未使用的所有数组字节。
    • @HarishKayarohanam 请问你为什么要使用一个包含 2147483647 个元素的数组?你有这样的真实世界用例还是纯粹的好奇?
    • 不,我在读数据结构,慢慢开始深入探索,发现了这个限制因素,很困惑。想不出原因,所以在这里提出来。你看到这个链接了吗@ 987654322@.
    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2011-08-01
    • 2014-04-07
    • 2015-10-18
    • 2011-03-03
    相关资源
    最近更新 更多