锁定老帖子 主题:论String操作时间复杂度
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-05-06
public class Test {
public static final int MB = 1024 * 1024; public static final long TIMES = 5000L; public static void main(String[] args) throws InterruptedException { method1(); method2(); } //从字节码来看,method1重复new StringBuilder public static void method1() { String s = ""; long t1 = System.currentTimeMillis(); for (int i = 0; i < TIMES; i++) { s += "a"; } System.out.println(s); System.out.println("String执行时间:"+(System.currentTimeMillis()-t1)+"ms"); // } public static void method2() { // //b StringBuilder sb = new StringBuilder(); long t3 = System.currentTimeMillis(); for (int i = 0; i < TIMES; i++) { sb.append("b"); } System.out.println(sb.toString()); System.out.println("StringBuilder执行时间:"+(System.currentTimeMillis()-t3)+"ms"); } } |
|
返回顶楼 | |
发表时间:2013-05-06
我觉得是后面前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
|
|
返回顶楼 | |
发表时间:2013-05-06
我觉得是前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
|
|
返回顶楼 | |
发表时间:2013-05-06
我觉得是前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
|
|
返回顶楼 | |
发表时间:2013-05-06
我觉得是前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
|
|
返回顶楼 | |
发表时间:2013-05-06
最后修改:2013-05-07
这个问题时间复杂度就是一样,或者面试官不知道什么叫做'时间复杂度'
|
|
返回顶楼 | |
发表时间:2013-05-07
时间复杂度都是O(N),空间复杂度就完全不一样了。
在for里面用+号是每次new 一个StringBuilder(); 可以想象下 如果for足够多的时候要new多少个临时对象。 这个对gc来说是一个悲剧。 下面这个new StringBuilder 没有指明容量。 那么扩容也是一个悲剧,每次扩容是上次的2倍。 所以如果事先估计一下String的容量就尽量给一个初始值。默认是16这个是很短的。 就如本题可以让初始容量为100。否则在for里面要面临3次扩容。 另外有人在回复的时候建议用StringBuffer。 在本题中明显没有并发,不要用StringBuffer.加锁也是影响性能的。 建议楼主多学学基础呵。这些内容在很多地方都有讲到。 |
|
返回顶楼 | |
发表时间:2013-05-08
尔今尔后 写道 public class Test {
public static final int MB = 1024 * 1024; public static final long TIMES = 5000L; public static void main(String[] args) throws InterruptedException { method1(); method2(); } //从字节码来看,method1重复new StringBuilder public static void method1() { String s = ""; long t1 = System.currentTimeMillis(); for (int i = 0; i < TIMES; i++) { s += "a"; } System.out.println(s); System.out.println("String执行时间:"+(System.currentTimeMillis()-t1)+"ms"); // } public static void method2() { // //b StringBuilder sb = new StringBuilder(); long t3 = System.currentTimeMillis(); for (int i = 0; i < TIMES; i++) { sb.append("b"); } System.out.println(sb.toString()); System.out.println("StringBuilder执行时间:"+(System.currentTimeMillis()-t3)+"ms"); } } 正解鉴定完毕: 引用 public static void main(java.lang.String[]) throws java.lang.InterruptedException; Code: 5: goto 31 8:这里开始循环,每次都new 8: new #37; //class java/lang/StringBuilder 11: dup 12: aload_0 public static void method2(); Code: 0: new #37; //class java/lang/StringBuilder //开始循环,但是只new一次。。。 10: goto 23 } 太自负了 |
|
返回顶楼 | |
发表时间:2013-05-08
编译器优化之后两段代码应该是一样的执行效果吧???
|
|
返回顶楼 | |
发表时间:2013-05-09
仅从代码,不考虑字节码来看,method1的时间复杂度应该是O(N!),第二个是O(N)。
因为第一个,隐含了老字符串的数组拷贝操作。 |
|
返回顶楼 | |