String频繁拼接操作导致内存溢出?java程序设计题目

时间:2017-12-26 09:48:01   浏览:次   点击:次   作者:   来源:   立即下载

在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

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息