In theory,unlimited,unless the virtual machine exhausted all of your memory

解决方案 »

  1.   

    有一篇关于这个的贴子
    这是和你的可用内存有关系的
    可用内存大你就可以定义的大些
    GOOD LUCK !!!
      

  2.   

    有人说:
    “不断的将被选中的字符串加到某一字符串末尾,当长度超过一定量是就提示:
    java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    ”说明String有长度限制。
    看一下Java API就会知道
    java.lang.StringIndexOutOfBoundsException出现的情况是
    Thrown by String methods to indicate that an index is either negative or greater than the size of the string. For some methods such as the charAt method。
    上面的错误是因为
    String.length()<10;
    而你又要取index>=10的字符,自然就会抛出上面的例外。
    String其实是没有限制的,而是当String太大了,超过JVM的自身的内存后会抛出
    java.lang.OutOfMemoryError错误下面作个实验:
    public class testString{
    public static void main(String args[])
    {
       String s="abbbbb";
       System.out.println("JVM MAX MEMORY: "+Runtime.getRuntime().maxMemory()/1024/1024+"M");
       System.out.println("JVM IS USING MEMORY:"+Runtime.getRuntime().totalMemory()/1024/1024+"M");
       Runtime.getRuntime().traceMethodCalls(true);
    while(true)
    {
    try{
    s=s+s;}catch(Exception e)
    {
    System.out.println(e);
       }
    catch(Error o)
    {  String unit = null;
       int sizeb = s.length();
       int size = sizeb;
       int time = 0;
       while(size>1024)
         {
           size = size/1024;
           time++;
         }
       switch(time)
       {
         case 0: unit = "byte";break;
         case 1: unit = "k"; break;
         case 2: unit = "M"; break;
         default : unit = "byte";
       }
       
       System.out.println("String has used memory:"+size+unit);
    System.out.println("JVM IS USING MEMORY:"+(float)Runtime.getRuntime().totalMemory()/1024/1024+"M");
        System.out.println("MemoryError:"+o);
       break;
    }  }
    }
    }
    然后我们用JVM的默认参数执行(我的机器内存是128M)
    java testString
    结果:
    JVM MAX MEMORY: 128M
    JVM IS USING MEMORY:1M
    String has used memory:12M
    JVM IS USING MEMORY:63.5625M
    MemoryError:java.lang.OutOfMemoryError
    开始JVM使用的内存是1M,当String为12M,JVM使用了63M多时
    JVM溢出。然后,我们用限制JVM内存大小的参数来执行,限制最大内存5M
    java -mx5m testString
    结果:
    JVM MAX MEMORY: 70M
    JVM IS USING MEMORY:1M
    String has used memory:768.0k
    JVM IS USING MEMORY:5.9375M
    MemoryError:java.lang.OutOfMemoryError
    开始JVM使用的内存是1M,当String为768k,JVM使用了5M多时
    JVM溢出。大家还可以改变 -mx参数,来进一步做实验。
    以上两个实验证明,String是没有长度限制的,而是有JVM的内存限制了String的长度。同时说明,并不会抛出任何Exception而只会抛出Error.OutMemoryError表明程序的设计很差,或者遇到了超出编程人员所预想的大批量的数据。不管哪种情况,都只有下面这几种解决办法。它们是:设计人员重新设计程序,不致使程序一次载入所有的数据。数据可以分割成更小的块。可以为程序分配更多的内存。为Java虚拟机提供更多的内存。而上面的例子是为虚拟机提供更多的内存
      

  3.   

    从另一方面说,如果你要处理的字符串达到百兆甚至上GB,使用String对象,根本没法工作,所以这个问题不需要太多讨论。看一下jdk的源文件,String的长度是String对象的一个成员count,类型是int,不是long,也不是char。知道这些,我认为够了。 
     
    String的长度限制:Integer.MAX_VALUE
    但jvm的内存很难达到这个gb级的大小,所以大多会报OutOfMemoryError。
    更详细的讨论请参见:http://www.chinajavaworld.net/forum/topic.cgi?forum=21&topic=9556&show=0