5

为什么会StringBuffer限制它的大小?

我浏览了一些链接: http: //www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer

是因为 count 成员变量,它是一个 int 吗?

假设我们有 2^31-1 个字符,StringBuffer并且我们在其中追加了一些字符StringBuffer。Count 成员变量将增加附加的字符数,如果 Count 变量已经达到最大值 (2^31-1),它将恢复为某个负值。

为什么会抛出错误?

4

4 回答 4

14

因为 stringbuffer 在内部使用了一个数组,并且一个数组可以容纳的最大元素数是 2^31-1 如果你在达到这个值后增加它会变成负数并抛出错误

于 2012-08-10T20:19:30.123 回答
4

StringBuffer使用char[].
在 Java 中,数组只能通过整数进行索引,这意味着数组索引的最大值是Integer.MAX_VALUE- 1(即 2^31 - 1)。这意味着Java中数组的大小不能大于Integer.MAX_VALUE

于 2012-08-10T20:24:03.847 回答
3

答案因系统架构而异。

当我在 2012 年发布答案时,这台旧机器

最大字符长度 = 37748734

Java版本:1.6.0_35

操作系统:Windows 7

系统架构:32位(x86)

内存:2 GB

处理器:奔腾双核 E5800 3.20GHz

2016年

最大字符长度 = 301989886

Java版本:1.8

操作系统:Ubuntu 14 LTE 和 Windows 7

系统架构:64位(x86_64)

内存:8 GB

处理器:Intel(R) Core(TM) i3-4130 CPU @ 3.40GHz

自己运行这个程序

        StringBuffer strbTest = new StringBuffer();
        long len = 0;
        try {
            System.out.println("Wait.... til number not generated.");

            while(true) {
                strbTest.append("a");
                len++;
            }
        } catch (OutOfMemoryError e) {
            System.out.println("Max length on your system is "+len);
            System.out.println("Error");
        }
        System.out.println("End");

输出

Max length on your system is 37748734
于 2012-11-02T12:04:44.507 回答
0

如果您在缓冲区中接近 2^31 个字符,那么您做错了,而且您早就用完了内存。

于 2012-08-10T20:19:35.993 回答