首先这个字符串"abcde"在符号表里只有一个
但是在ArrayList里会有10000000个a(即对"abcde"字符串对象的引用)
介绍Java内存模型的资料比较少,估计这个引用的大小在4~8个字节之间
但是在ArrayList里会有10000000个a(即对"abcde"字符串对象的引用)
介绍Java内存模型的资料比较少,估计这个引用的大小在4~8个字节之间
解决方案 »
- 关于计时器线程Timer的问题
- Java群,新手请进!
- 关于窗体的拉动
- java包的使用到底需要设置些什么?各位大侠给看下,小弟感激涕零
- myeclipse有没有像JBUILDER这个属性可以选deepest package exposed
- :)***我的《信息小屋》软件,请各位大哥、大姐给个评价。同时想找帮忙的朋友:)***
- 请教如何刷新JPanel
- 请问各位几个关于java网络编程的简单问题,谢谢!
- JBuilder中怎么使用Data Express?以及然后进行数据库的连接?
- 如何使用正则表达式,将字符串中的每个单词首字母大写
- 为什么我从结果集(ResultSet)对象中删不去数据??我已经设置ResultSet.CONCUR_UPDATABLE参数了!!(附代码)
- 请问哪里有java2 核心技术卷2可下(第6版 ),第5版也可,书店里没找到。谢谢!
楼主省省心吧,别在究这个了.
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存储同样的容量需要的内存确要大于此.容量是相等的,需要的内存是在中间>过程产生的.在动态扩展元素的时候,需要分配临时的空间.
arr.add("abcde");
}
这样可以,但下面为什么就不可以呀,我还必须要用不定长的容器,因为我也不知会有多少容量
ArrayList arr = new ArrayList(); for (int i = 0; i < 10000000; i++) {
arr.add("abcde");
}
真服了你了.
List arr = new ArrayList(1000000);
现在 arr.size() 等于多少???第二种方法内存不够,加上虚拟机参数: -Xmx512M
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();
}
<<
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();
}
>>
又学会不少东东.......to xiaohaiz(老土进城,两眼通红) 3Q!
用您的方法测试的时候是没有问题的,但结合起我实际的应用还是会有异常,郁闷!不过还是非常感谢,谢谢指点!