数组,list,String的最大长度

数组,list,String的最大长度,第1张

数组,list,String的最大长度 数组最大长度

Java 中数组的最大长度是多少呢?看一下它的length属性就可以了。length属性是32位的有符号整数,它的最大值是2的31次幂,就是2G。

为什么length的属性不是long型呢?我们假设一下,如果它是long型的,那么它的最大长度是2的63次幂。内存永远也不会有那么大吧。即使是字节数组长度是int的,最大长都达到2GB.

list

从语言上来看,java.util.List是个接口,其下有N多实现,最常用的是ArrayList和linkedList及其各种继承或同步化实现(如Vector/Queue/Stack这些的)

  1. ArrayList内部是拿数组存储,那么上限就是Integer.MAX_VALUE
  2. linkedList内部是个链表,理论上是无限的。

另外,List里放的东西都是在内存里的(当然你也可以自己实现一个放磁盘上的),因此能放多少也取决于放的东西的大小以及种类。
大小方面很容易计算,一个对象如果1K,那400,000个就至少要占用400M的内存(不算其他占用)。

而虚拟机内存分类方面,如果是普通对象,一般占用的都是堆(Heap)空间,如果是常量或是类似String.intern()出来的东东,则占用的是永生代(Permanent Generation)。

String

String底层也是基于数组的,是一个字符数组。

private final char value[];

在指定数组长度的时候,可以使用 byte、short、char、int 类型,而不能够使用 long 类型。这也就是说,数组的最大长度就是 int 类型的最大值

java.lang.String#length() 源码:

public int length() { return value.length;}

一个数组最大的长度是一个 int 的最大值,也就是 2147483647,而一个字符串在 Java 内部是使用 char[] 来表示的,也就是说一个字符串的最大长度是 2147483647。

public class StringTest {
 public static void main(String[] args) {
  for (int i = 0; i < 100; i++) {
   int len = Integer.MAX_VALUE - i;
    try { char[] ch = new char[len];
     System.out.println("len: " + len + " OK");
    } catch (Error e) {
    System.out.println("len: " + len + " " + e);
   }
  }
 }
}


len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK
len: 2147483643 OK


产生这个错误的原因就是内存溢出,也就是系统无法分配这么大的内存空间所致。
计算一下,一个 char 类型占用 2 字节,2147483647 个 char 类型就是 4294967294 字节,这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了。

不过这些都是理论值,具体能放多少与 JVM 内存有关, 可以在执行 java 命令时加上 -Xmx 1024m 就将 JVM 内存最大置为了 1G, 默认情况下是 64MB.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5597440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存