StringBuffer的最大大小

时间:2012-08-10 20:17:00

标签: java stringbuffer

StringBuffer为什么会限制其大小?

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

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

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

为什么会抛出错误?

4 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

根据系统架构,答案有所不同。

当我在2012年发布答案

时,这台旧机器
  

最大字符长度= 37748734

     

Java版本:1.6.0_35

     

操作系统:Windows 7

     

系统架构:32位(x86)

     

RAM:2 GB

     

处理器:奔腾双核E5800 3.20GHz

2016年

  

最大字符长度= 301989886

     

Java版本:1.8

     

操作系统:Ubuntu 14 LTE和Windows 7

     

系统架构:64位(x86_64)

     

RAM: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

答案 3 :(得分:0)

如果你的缓冲区中有2 ^ 31个字符附近的任何地方你做错了,很久以前就会用完你的内存。