在Java J2ME中,使用new运算符分配的字符串和不使用new运算符分配的字符串有什么区别?

7

什么是两者之间的区别?

String str=new String("Thamilan");

并且

String str="Thamilan";

在Java J2ME中。
5个回答

9

第一种情况下,将始终创建新对象;而在第二种情况下,可以重用字符串池中的对象。有关字符串池的更多信息,请阅读什么是字符串池?


4
区别在于使用 new 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

这是因为字面量始终来自内部池。您可以查看intern方法 - 这是它的描述:返回字符串对象的规范表示形式。类String私有地维护一个最初为空的字符串池。当调用intern方法时,如果池中已包含与此String对象相等的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。因此,对于任何两个字符串s和t,s.intern() == t.intern()仅当s.equals(t)为true时才为true。所有文字字符串和字符串值常量表达式都被interned。字符串文字在Java语言规范的§3.10.5中定义。

2

来自Java字符串声明的答案:

   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); 

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

1
  1. String t = new String("abc");
  2. statement 1将在堆上创建一个对象,并在常量池中放置一个具有相同值的字符串字面量。

引用变量t将引用堆上的对象。

  1. String t = "abc";

但是,如果具有相同值的对象不在池中,则语句2仅在字符串常量池中创建一个对象,并且t将引用放置在字符串常量池中的对象。


这些是相互矛盾的语句。你的意思是说String t = new String("abc");和String t = "abc";两者都指向String池中的同一个String对象吗? - Kaveesh Kanwal

0
在《Effective Java》中,它说永远不要编写这样的代码:
String s = new String("string");

因为它会创建不必要的字符串对象。但是,应该像这样编写:

String s = "string";

好的,但问题是,它们之间有什么区别? - DaveJohnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接