使用new operator& amp;分配的字符串之间有什么区别?在java J2ME中没有new运算符?

时间:2011-08-05 06:56:57

标签: java java-me

之间有什么区别
String str=new String("Thamilan");

String str="Thamilan";

在java J2ME中。

5 个答案:

答案 0 :(得分:7)

在第一种情况下,将始终创建新对象,在第二种情况下,可以重用来自字符串池的对象。在此处阅读有关字符串池的更多信息:What is String pool?

答案 1 :(得分:4)

不同之处在于新String创建的新对象具有与传入的文字相同的值:

    String s = "abc";
    String t = new String("abc");

    System.out.println(s==t); //false

    String u = "abc";
    String v = "abc";

    System.out.println(u==v);  //true

这是因为文字总是来自内部池。

您可能希望查看实习方法 - 这是其描述:

返回字符串对象的规范表示。 最初为空的字符串池由String类私有维护。 调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。 因此,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。 所有文字字符串和字符串值常量表达式都是实体。字符串文字在Java语言规范

的§3.10.5中定义

答案 2 :(得分:2)

来自Java String declaration

的回答
   String str = new String("SOME") 

总是在堆上创建一个新对象

    String str="SOME"  

使用字符串池

试试这个小例子:

    String s1 = new String("hello");         
    String s2 = "hello";
     String s3 = "hello";
      System.err.println(s1 == s2);
     System.err.println(s2 == s3); 

为避免在堆上创建不必要的对象,请使用第二种形式。

答案 3 :(得分:1)

  1. String t = new String("abc"); 语句1将在Heap上创建一个对象,另外在池中放置一个具有相同值的字符串文字。
  2. 引用变量t将引用堆上的对象。

    1. String t = "abc";
    2. 但是语句2只会在字符串常量池中创建一个对象,如果池中不存在具有相同值的对象,则t将引用放置在字符串常量池中的对象。

答案 4 :(得分:0)

在'Effective Java'中,它表示永远不会编写这样的代码:

String s = new String("string");

因为它会创建不必要的String对象。但它应该写成这样:

String s = "string";