数组最大长度
Java 中数组的最大长度是多少呢?看一下它的length属性就可以了。length属性是32位的有符号整数,它的最大值是2的31次幂,就是2G。
为什么length的属性不是long型呢?我们假设一下,如果它是long型的,那么它的最大长度是2的63次幂。内存永远也不会有那么大吧。即使是字节数组长度是int的,最大长都达到2GB.
list
从语言上来看,java.util.List是个接口,其下有N多实现,最常用的是ArrayList和LinkedList
及其各种继承或同步化实现(如Vector/Queue/Stack这些的)
-
ArrayList内部是拿数组存储
,那么上限就是Integer.MAX_VALUE
- 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。
/**
* @author wupx
* @date 2020/01/13
*/
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
.