首先这个字符串"abcde"在符号表里只有一个
但是在ArrayList里会有10000000个a(即对"abcde"字符串对象的引用)
介绍Java内存模型的资料比较少,估计这个引用的大小在4~8个字节之间

解决方案 »

  1.   

    内存会分配多少,只有一个地方才知道:JVM.
    楼主省省心吧,别在究这个了.
      

  2.   

    应该不会太大,都是引用吗,都是指向字符串"abcde"的
      

  3.   

    呵呵.还在继续呢?每次是不同的字符串和是相同的字符串的结果是一样的.
    ArrayList中保持的是reference.相同的虚拟机,reference总是定长的.为什么说不要深究这个问题了呢?
    reference有三种:interfaceRef,classRef,arrayRef.都是定长的,在虚拟机中至少用一个字(word)就可以表示了.所以就得看字长来决定起存储空间了.但是不同的虚拟机实现完全可以采用不同的字长.或者对word采取不同的存储(比如32位字长使用64位存储空间来存储,在某些64位机器上就是这么实现的).所以说,这些完全是虚拟机内部的事情.在外面写程序的人了解一下就可以了.不过估算还是可以的:
    假设是32位(4bytes)字长,那么10000000个元素的空间是:
    10000000 * 4bytes = 40000000bytes = 40000kb = 40M大家现在使用的平台和虚拟机俺估计都是这样.
    俺们使用数组来实验:
    public class Test {
        public static void main(String[] args) {
            Object[] objs = new Object[1000000];
            for(int i=0; i<objs.length; i++) {
                objs[i] = "A";
            }
        }
    }
    大家试试这两条运行命令:
    java -Xmx40M Test
    java -Xmx41M Test
    看看哪个会出现OutOfMemoryError. :)
                                                                                    
    但是ArrayList存储同样的容量需要的内存确要大于此.容量是相等的,需要的内存是在中间>过程产生的.在动态扩展元素的时候,需要分配临时的空间.
      

  4.   

    10000000个引用的大小,ArrayList只保存引用,a是不会被复制的。
      

  5.   

    ArrayList arr = new ArrayList(10000000);            for (int i = 0; i < arr.size(); i++) {
                    arr.add("abcde");
                }
    这样可以,但下面为什么就不可以呀,我还必须要用不定长的容器,因为我也不知会有多少容量
    ArrayList arr = new ArrayList();            for (int i = 0; i < 10000000; i++) {
                    arr.add("abcde");
                }
      

  6.   

    TO kqb1231(彬1231):
    真服了你了.
    List arr = new ArrayList(1000000); 
    现在 arr.size() 等于多少???第二种方法内存不够,加上虚拟机参数: -Xmx512M
      

  7.   

    实际情况大概是这样的但是总是会出现java.lang.OutOfMemoryError,各位帮看看怎样解决
    ArrayList a2 = new ArrayList();
    ArrayList a1 = new ArrayList();
    String str = null;
    fro(int k = 0;k<10000;k++){
    for(int i = 0;i<1000;i++){
      str = "abcde";
      a1.add(str);
    }
    a2.addAll(a1);
    a1.clear();
    }
      

  8.   

    那就写死Capacity
    <<
            ArrayList total = new ArrayList(10000000);
            for(int k = 0;k<10000;k++){
                List each = new ArrayList(1000);
                for(int i = 0;i<1000;i++){
                    String str = "abcde";
                    each.add(str);
                }
                total.addAll(each);
                each.clear();
            }
    >>
      

  9.   

    这段程序应该在操作系统当中使用虚拟存储器那么这个string的hash码应该代替这个字符串存储在系统中 而不是纯粹的存储
      

  10.   

    呵呵.不错错错.来的值啊!
    又学会不少东东.......to xiaohaiz(老土进城,两眼通红) 3Q!
      

  11.   

    To xiaohaizi(老土进城,两眼通红) 
    用您的方法测试的时候是没有问题的,但结合起我实际的应用还是会有异常,郁闷!不过还是非常感谢,谢谢指点!