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

有什么区别

String str=new String("Thamilan"); 

 String str="Thamilan"; 

在java J2ME中。

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

区别在于新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中定义

Java String声明的答案

  String str = new String("SOME") 

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

  String str="SOME" 

使用String池

试试这个小例子:

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

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

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

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

  1. String t = "abc";

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

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

 String s = new String("string"); 

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

 String s = "string";