System.out.println(System.getProperty("java.version"));
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
for(int i=0;i<1000000000;i++){
String str = new String("");
}
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
System.out.println("----------------------");
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
for(int i=0; i<1000000000;i++){
StringBuffer str = new StringBuffer("");
}
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
System.out.println("----------------------");
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
for(int i=0; i<1000000000;i++){
test1 t = new test1();
}
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
我分别new 1亿个 String StringBuffer 和 test1 对象,结果如下:
(String)
1.5.0_11
1238639830062
Thu Apr 02 10:37:10 CST 2009
1238639834437
Thu Apr 02 10:37:14 CST 2009
----------------------
(StringBuffer)
1238639834437
Thu Apr 02 10:37:14 CST 2009
1238639874375
Thu Apr 02 10:37:54 CST 2009
----------------------
(test1)
1238639874375
Thu Apr 02 10:37:54 CST 2009
1238639875187
Thu Apr 02 10:37:55 CST 2009我加到了10亿个,这个我是分开单个测试的,发现new StringBuffer 的耗时就远远大于其他那两个了,
new 10亿个的结果分别如下:1.5.0_11
1238639226906
Thu Apr 02 10:27:06 CST 2009
1238639258796
Thu Apr 02 10:27:38 CST 2009
String 花了 差不多32秒
-------------------------1.5.0_11
1238639380140
Thu Apr 02 10:29:40 CST 2009
1238639511687
Thu Apr 02 10:31:51 CST 2009
StringBuffer 花了 差不多2分钟19秒
----------------------1.5.0_11
----------------------
1238639579843
Thu Apr 02 10:32:59 CST 2009
1238639588406
Thu Apr 02 10:33:08 CST 2009
test1对象花了 9秒这是为什么呀,为什么StringBuffer比其他两个要多花那么多时间?
他在虚拟机中创建对象的时候和其他两个有什么区别吗 ?
它是线程安全的,StringBuilder比他快,功能差不多,但是不是线程安全的。
期待高手的回答!
String s = new String(); // this.value = new char[0];StringBuffer需要一个长度为16的字符数组,String则是长度为0的。这个只是很基本的不同,当然String会快了。
String的构造方法一般复杂
StringBuffer的构造方法最变态,有一个超类需要先构造,而且带String参数的构造方法还调用到了带锁的方法
test1类的时间和你自己写的构造方法复杂程度有关( ̄(工) ̄)
public StringBuffer() {
super(16);
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}String.java
public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
}