论坛首页 Java企业应用论坛

论String操作时间复杂度

浏览 17741 次
精华帖 (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");
}

}
0 请登录后投票
   发表时间:2013-05-06  
我觉得是后面前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
0 请登录后投票
   发表时间:2013-05-06  
我觉得是前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
0 请登录后投票
   发表时间:2013-05-06  
我觉得是前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
0 请登录后投票
   发表时间:2013-05-06  
我觉得是前面那个方法在不断的创建对象,每一次就创建一个对象。而后面那个始终是一个对象,后面那个节约内存,而前面那个对内存比后面那个消耗大的多。所以后面那个更科学,更合理。所以现在高手都写StringBuffer而不写String的原因
0 请登录后投票
   发表时间:2013-05-06   最后修改:2013-05-07
这个问题时间复杂度就是一样,或者面试官不知道什么叫做'时间复杂度'

0 请登录后投票
   发表时间:2013-05-07  
时间复杂度都是O(N),空间复杂度就完全不一样了。
在for里面用+号是每次new 一个StringBuilder();
可以想象下 如果for足够多的时候要new多少个临时对象。
这个对gc来说是一个悲剧。
下面这个new StringBuilder 没有指明容量。
那么扩容也是一个悲剧,每次扩容是上次的2倍。
所以如果事先估计一下String的容量就尽量给一个初始值。默认是16这个是很短的。
就如本题可以让初始容量为100。否则在for里面要面临3次扩容。
另外有人在回复的时候建议用StringBuffer。
在本题中明显没有并发,不要用StringBuffer.加锁也是影响性能的。
建议楼主多学学基础呵。这些内容在很多地方都有讲到。

0 请登录后投票
   发表时间: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

}


太自负了
0 请登录后投票
   发表时间:2013-05-08  
编译器优化之后两段代码应该是一样的执行效果吧???
0 请登录后投票
   发表时间:2013-05-09  
仅从代码,不考虑字节码来看,method1的时间复杂度应该是O(N!),第二个是O(N)。
因为第一个,隐含了老字符串的数组拷贝操作。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics