【发布时间】:2011-08-05 06:56:56
【问题描述】:
有什么区别
String str=new String("Thamilan");
和
String str="Thamilan";
在 java J2ME 中。
【问题讨论】:
有什么区别
String str=new String("Thamilan");
和
String str="Thamilan";
在 java J2ME 中。
【问题讨论】:
在第一种情况下,总是会创建新对象,在第二种情况下,可以重用来自字符串池的对象。在此处阅读有关字符串池的更多信息:What is String pool?
【讨论】:
不同的是,新的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 类私下维护。 当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,该字符串由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。 因此,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。 所有文字字符串和字符串值的常量表达式都是实习的。字符串文字在 Java 语言规范的第 3.10.5 节中定义
【讨论】:
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);
为避免在堆上创建不必要的对象,请使用第二种形式。
【讨论】:
String t = new String("abc");
语句 1 将在堆上创建一个对象,并在池中另外放置一个具有相同值的字符串字面量。引用变量 t 将引用堆上的对象。
String t = "abc";但是,如果池中不存在具有相同值的对象,则语句 2 只会在字符串常量池中创建一个对象,并且 t 将引用放置在字符串常量池中的对象。
【讨论】:
在“Effective Java”中,它说永远不要编写这样的代码:
String s = new String("string");
因为它创建了不必要的 String 对象。但它应该这样写:
String s = "string";
【讨论】: