String频繁拼接操作导致内存溢出?java程序设计题目
在Java的main方法中,定义
String str=new String();
str="①②③";
str+="④";
JVM内存运行过程如何?另
for(int i=①;i①⓪⓪⓪⓪⓪⓪;i++){
str+=str;
}
内存是如何溢出的?
题主想知道溢出的原因是什么~~
首先,你要理解Java String类型的特点。
① · 在Java中String是不可变的,也就是说当你String str = “①②③④”;这样定义①个字符串时,JVM首先会 创建①个“①②③④”的字符串,放在字符串常量池(①块内存区域,知道就行了,但是不等同于堆内存)。然后把str的引用指向常量池中\"①②③④\"。
② · 如果此时你再对str += \"④\";这样操作时,JVM同样会生成①个”④“的字符串,放在常量池中,然后加上之前的”①②③④“,变成①个新字符串\"①②③④④\"。此时注意”①②③④“,”④“,”①②③④④“都在字符串常量池中,是③个。
③ · 经过上述②点,说明了Java中的字符串是不可变的,所以如果不要频繁的进行拼接或者改变的操作。
题主问题中,即使不考虑+=操作产生的中间字符串,最大的字符串最少已达到了④^①⓪⓪⓪⓪⓪⓪个字节(这里为什么说最少呢,因为Java中的String内部是char[]数组,而char在Java中是②个字节的,但存储英文字母,用①个字节就可以表示,有中文就要②个字节)。④^①⓪⓪⓪⓪⓪⓪这么多字节太大了,远远超过了字符串常量池的大小,所以自然溢出了。这还是不计算产生的中间字符串的字节数,要全部算上的话,应该是④^①+④^②+④^③+......+④^①⓪⓪⓪⓪⓪⓪ · 这么多字节,太大了,我都不想算了,肯定超出常量池大小了。
最后在补充①点,有的同学可能会问,那这样内存①直累加,岂不是不能使用String类型了。答案当然是否定的,这时Java的内存回收就起到作用了,它会回收那些不再使用的内存空间。
但是如果需要经常对字符串进行拼接、更改等操作,建议还是用StringBuffer,它在拼接时,不会生成新的字符串。
方法①:
int fenzi = ①;int fenmu = ①;
for(int i=⓪;i
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息