Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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_Stack_Heap Memory - Fatal编程技术网

为什么java中数组的大小有一个最大限制?

为什么java中数组的大小有一个最大限制?,java,stack,heap-memory,Java,Stack,Heap Memory,我得从你那里找到 数组大小有一个最大限制 可能是为了耗尽堆空间。是的,我同意这一点 我无法理解以下内容: 但是为什么每个阵列都有这个限制呢 如果我有很多这样大的数组呢 为什么不在达到堆空间的某个阈值(总消耗)时抛出异常,而不是为每个数组设置上限 注: 在Python中,它们有这个限制 在C语言中,似乎没有限制(除了使用的硬件) 假设您有一个数组 String[] array = new String[22L]; eclipse中的错误消息 Type mismatch: cannot conve

我得从你那里找到 数组大小有一个最大限制

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

我无法理解以下内容:

  • 但是为什么每个阵列都有这个限制呢

  • 如果我有很多这样大的数组呢

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

  • 注:

  • 在Python中,它们有这个限制

  • 在C语言中,似乎没有限制(除了使用的硬件)


  • 假设您有一个数组

    String[] array = new String[22L];
    
    eclipse中的错误消息

    Type mismatch: cannot convert from long to int 
    

    很明显,数组的大小以int表示长度,长度由**max int value限制,该值由32位限制**

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


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

    数组的
    长度
    int
    ,因此在不中断
    长度
    的情况下,不能允许数组的元素数超过
    整数.MAX\u值
    个。打破
    长度将是巨大的;它需要在所有地方更改源代码并重新编译


    考虑到
    length
    字段已经规定了长度上限,因此
    Integer.MAX\u VALUE
    或类似
    Integer.MAX\u VALUE-5的上限与堆空间无关。所有这些都与使用32位整数进行寻址有关。并且数组空间必须是连续的。当JVM启动时,分配2GB阵列可能相对容易,但在具有碎片堆的长时间运行的应用程序中(取决于您的GC实现),这几乎是不可能的。但是为什么呢?如果阵列设计的索引范围更大,这是可能的吗?我想知道为什么愚蠢的索引会成为这种特性的限制因素。实际上,这就像textbooksonline.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!)试着在末尾加上一个L。你不能这样做。因为数组的大小是int。在这种情况下,eclipse将显示的错误消息是类型不匹配:无法从long转换为int,那么第二条错误消息就是对此原因的正确解释;如果这可以解释:)再次:你的第二个解释(在评论中)是正确的。你当前帖子中的解释不是。哦,谢谢。但是为什么?如果阵列设计的索引范围更大,这是可能的吗?我想知道为什么愚蠢的索引会成为这种特性的限制因素。实际上,这就像说“因为这个人的名字只有六个字符,他只能学习到第六个标准”。从第257页开始,我感觉只有地址才重要,索引只是用来从起始地址计算下一个地址。那么为什么这个索引如此重要呢。@HarishKayarohanam:要使长度变长,需要对所有数组进行笨拙的强制转换和两个额外的、通常未使用的字节。@HarishKayarohanam我可以问一下,为什么要使用一个包含2147483647个元素的数组吗?你有这样的真实世界用例吗?还是纯粹的好奇?没有,我正在阅读数据结构,慢慢地开始深入研究,我发现了这个限制因素,感到困惑。想不出原因,所以在这里提出。你看到这个链接了吗。