length属性:int类型,4个字节,有符号数,最大值为2^31-1 = 2147483647
NegativeArraySizeException数组负长度异常、OutOfMemoryError内存溢出错误
// int[] arr1 = new int[-1]; // NegativeArraySizeException 数组负长度异常
// byte[] arr2 = new byte[2147483647]; // OutOfMemoryError 内存溢出错误
【思考】为什么length属性不能是long类型?因为内存承受不住
最小的byte类型的字节数组为例(数组中的每个元素占用一个Byte)
- 当length属性是int类型时,一个字节数组理论最多占用内存1x(2^31-1)≈1Bx2G≈2GB
- 当length属性是long类型,一个字节数组理论最多占用内存1x(2^63-1)≈1Bx8E≈8EB,PC机没有这么大的内存
数组最多存多少个元素?String字符串最大长度?
理论值是最大的int数,具体能放多少与JVM内存有关
// byte[] bytes = new byte[2147483647];
// java.lang.OutOfMemoryError: Requested array size exceeds VM limit
// String字符串底层是数组
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/**
* The value is used for character storage.
*/
private final char value[]; // jdk 1.8
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/**
* The value is used for character storage.
*/
@Stable
private final byte[] value; // 1、jdk 1.9