关于一个new新对象耗时问题

no9988 2009-04-02 10:47:40

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比其他两个要多花那么多时间?
他在虚拟机中创建对象的时候和其他两个有什么区别吗 ?

...全文
1156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
therehere 2009-04-02
  • 打赏
  • 举报
回复
StringBuffer 因为是可变的字符串 它在做连接操作的时候 不要在开销空间了 当然在创建的时候要有一定的策略了,

StringBuffer的存储原理是什么样子的呢 应该预留一点空间,或者有什么存储的策略吧

顶 期待高手
老紫竹 2009-04-02
  • 打赏
  • 举报
回复
StringBuffer.java
    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];
}

HinanaiTenshi 2009-04-02
  • 打赏
  • 举报
回复
有区别
String的构造方法一般复杂
StringBuffer的构造方法最变态,有一个超类需要先构造,而且带String参数的构造方法还调用到了带锁的方法
test1类的时间和你自己写的构造方法复杂程度有关( ̄(工) ̄)
老紫竹 2009-04-02
  • 打赏
  • 举报
回复
StringBuffer b = new StringBuffer(); // value = new char[capacity];
String s = new String(); // this.value = new char[0];
StringBuffer需要一个长度为16的字符数组,String则是长度为0的。这个只是很基本的不同,当然String会快了。
oklinsong 2009-04-02
  • 打赏
  • 举报
回复
我只知道StringBuffer的开销很大,因为它相当于一个动态字符串,原理不是太明白。
它是线程安全的,StringBuilder比他快,功能差不多,但是不是线程安全的。
期待高手的回答!
捏造的信仰 2009-04-02
  • 打赏
  • 举报
回复
对象的创建是会要:
1、调用父类的构造方法;
2、调用自身的构造方法;
3、初始化成员。

所以,创建一个对象要消耗多少时间,取决于:
1、层次越深的类,调用的构造方法就越多,执行起来就越耗时;
2、构造方法越复杂,创建对象越耗时;
3、成员数量越多,创建对象越耗时;而且对象成员的创建也是要调用其构造方法的。那就更耗时了。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧