java for循环的问题 看看下面的有啥问题

public static void main(String[] args) {
String a = "b";
for (int i = 0; i < 10000000; i++) {
a += i;
}
System.out.println(a);
}
这样输出值是什么?程序是否会有什么问题?有的话怎样解决?

            如果程序正常运行,a.length()大约是多少?提供思路或方法?

19个回答

你到不如这样写:

 public class MyMain {
    public static void main(String[] args) {
        String a = "b";
        StringBuffer sb = new StringBuffer(a);
        for (int i = 0; i < 10000000; i++) {
            sb.append(i);
        }
        System.out.println(sb.toString());
    }
}

按照你的写法,JVM会频繁的进行GC,这对性能影响特别大,造成严重的资源浪费。

我觉得你现在应该在乎的不是它输出的值,很明显你这么做的缺点会造成效率严重过低,都知道常量每次赋值都会创建一个新的对象。
举个列子吧,如果使用的是你这方式循环5w遍大概耗时是8秒左右,换成StringBuffer后耗时0秒,StringBuffer它会创建一次对象因此大大减少了运行所需
时间,至少长度,字符串和整型相加肯定变成字符串了(向String大佬低头),然后它就变成了这样子:a0 a01 a012 ....

你这样会很慢建议使用StringBuffer

 long st=Calendar.getInstance().getTimeInMillis();
        StringBuffer sb=new StringBuffer("b");
        for (int i = 0; i < 10000000; i++) {
            sb.append(i);
        }
        System.out.println(sb.length());
        System.out.println(Calendar.getInstance().getTimeInMillis()-st);
tongkaiming
tongkaiming 输出:68888891 489
大约 2 年之前 回复

你用一个字符类型的数与整数类型的数相加没有什么意义,不知道你是打错了,还是你的本意。
要是按照你的问题表面上讲,你这个a结果是由b0123456789101112....9999999这样拼接成的
字符串,这样字符串过于冗长,我也不知道jvm要多久能算出结果。你要是求a的长度的话,可以
给你提供一个思路0-9有1*10位,10-99有2*90,100-999有3*900,1000-9999有4*9000,后面的以此类推

a是字符串, a += i会做为字符串拼接。结果应该是
b0123456789101112131415161718192021222324252627282930.......99999989999999

但是你要循环10000000次,可能因为执行时间太长,让系统超时。建议减少循环次数。

长度的分析方法 :
a --- 1

0 1 2 3 4 5 6 7 8 9  --- 10

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 99  --- 90         

100 101 ... 999   --- 900      

1000 1001 ... 9999  --- 9000

10000 10001 ... 99999  --- 90000

...

1000000 ... 9999999  --- 900000  


1*10 + 2*90 + 3*900 + 4*9000 + ... + 7*9000000 + 1

程序很简单,如楼上所述,"b"和一个数字相加,结果是个字符串。
要计算长度也很简单,按i的位数来算:
i在0-9时,每个i长度都是1,执行一次a += i,长度+1;
i在10-99时,每个i长度都是2,执行一次a += i,长度+2;
i在100-999时,每个i长度都是3,执行一次a += i,长度+3;
...
以此类推,总length=1+1*10+2*100+3*1000+4*10000+5*100000+6*1000000+7*10000000=76543211

楼主觉得程序有问题,是数据太大,程序运行太慢吧

underthesun2008
underthesun2008 这个答案居然不能编辑,算法有点问题,qq_17450523 的算法是对的
大约 2 年之前 回复

这是一个 字符串的拼接,分析方法
一位数的有几个?10个 1*10 = 10
两位数的有几个?90个 2*(100 - 10)=2*90
三位数的有几个?900个 3*(1000-100)=3*900
4位数的有几个?9000个 4*(10000-1000)=4*9000
...
7位数的有几个? 7*(10000000-1000000)=7* 9000000
上面的结果都加起来
最后再加上你的初始值 b ,即 +1
望采纳

a是字符串,b是整形,a+b会自动转成字符串类型

输出值为:
b012345678910111213141516...9999996999999979999999899999999

        //String a,a是字符串格式,int i,i是整型数字格式
        //字符串加法相当于字符串拼接
        //a+=i;即:a=a+i;
        //字符串+整型会自动将整形数字转换成String类型拼接在字符串后面
        //程序不会有问题。可以正常执行
        a.length()的长度为1+1+9*1+(99-9)*2+(999-99)*3...(99999999-9999999)*8,然后就是简单的数学题了
共19条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐