数组,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。

/**
 * @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 字节,2147483647char 类型就是 4294967294 字节,这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值