大家都知道
String str = "abc";

String str;
str = "abc";
在C++里面是有效能差距的,差距是一个构造函数执行时间。那么这个在java里面有没有呢?我查阅了不少书籍都没有提及。谁知道的答案的,最好能有有力的依据的。谢谢。

解决方案 »

  1.   

    我觉得应该差不多,如果String str; str = "abc";两条语句在一起的话,编译器应该会把它转化成
    String str = "abc";我写了两个程序来测试,如下:
    //a.java
    long begin = System.currentTimeMillis();
    for (int i = 0; i < 100000000; i++)
    {
    String str;
    str = "abc";
    }

    long end = System.currentTimeMillis();System.out.println(end - begin);//b.java
    long begin = System.currentTimeMillis();
    for (int i = 0; i < 100000000; i++)
    {
    String str = "abc";
    }

    long end = System.currentTimeMillis();System.out.println(end - begin);结果如下:
    a    b
    406  391
    407  406
    422  390
    422  406
    422  391看来还是String str = "abc";快.但具体还是应该分析生成的汇编码, 我看不懂汇编, 有哪们高手能具体解释一下吗?
      

  2.   

    String str = "abc";

    String str;
    str = "abc";上面有初始化,下面没初始化,用到的时候再初始化。
    作为class的一个属性的时候,有些属性不一定用到,可以不预先初始化
      

  3.   

    还是String str = "abc";要快一些吧String str;
    str = "abc";
    两步操作,进行了上一点点重复的工作。
      

  4.   

    Java中声明一个对象
    String str;
    本质上是在声明一个对象引用变量Java中的 String str = "abc"; 可以理解为C++中的 CString &str = CString("abc"); 或 CString *str = new CString("abc"); 这里的str变量只是一个指针或引用而已。
    而C++中
    CString str;
    会调用默认构造函数创建对象,它实际上相当于CString str();
      

  5.   

    反编译下面这段代码
    class Test 
    {
    public void f1()
    {
    String str = "abc";
    } public void f2()
    {
    String str;
    str = "abc";
    }
    }的java操作码为class Test extends java.lang.Object{
    Test();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   returnpublic void f1();
      Code:
       0:   ldc     #2; //String abc
       2:   astore_1
       3:   returnpublic void f2();
      Code:
       0:   ldc     #2; //String abc
       2:   astore_1
       3:   return}大家可以看出来,这两种操作是完完全全一样的
      

  6.   

    我认为更换一个更好的cpu,就解决了
      

  7.   

    没有效能上的差距,因为在java中是有一个String池的,java为了效率上设计需要,所有的串都存储在这个内存池中!
      

  8.   

    jvm中有一个常量池
    String a = new String("aa");
    String b = new String("aa");a.equals(b)为false

    a.intern()==b.intern()为true
      

  9.   

    public static void main( String [] args )
    {
    String a = new String( "aaa" ) ;
    String b = new String( "aaa" ) ;

             System.out.println( a == b ) ;
    System.out.println( a.equals( b ) ) ;
    System.out.println( a.intern() == b.intern() ) ;
    }结果是: false
             true
             true
      

  10.   

    有人搞混了equals和==的区别了
      

  11.   

    回复人: kypfos(不在寻梦) ( )
    jvm中有一个常量池
    String a = new String("aa");
    String b = new String("aa");a.equals(b)为false

    a.intern()==b.intern()为true
     
    a.equals(b)怎么会为false???应该是true啊。又不是==。至于intern,It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. 由此可以看出,只要equal相等。那么pool里面的两个s和t的content也是相等的。
      

  12.   

    如果按代码行计算薪水,意义就大大的啦,
    建议
    String str;
    str = "abc";
    的写法.
      

  13.   

    谢谢大家,现在看来在java这个效能几乎无差距。接分。
      

  14.   

    yangxp_82(小 羊) 
    能不能详细介绍一下这个池,或者说哪有这方面的资料??
    先谢