之间有什么区别
String str=new String("Thamilan");
和
String str="Thamilan";
在java J2ME中。
答案 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)
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)
String t = new String("abc");
语句1将在Heap上创建一个对象,另外在池中放置一个具有相同值的字符串文字。引用变量t将引用堆上的对象。
String t = "abc";
但是语句2只会在字符串常量池中创建一个对象,如果池中不存在具有相同值的对象,则t将引用放置在字符串常量池中的对象。
答案 4 :(得分:0)
在'Effective Java'中,它表示永远不会编写这样的代码:
String s = new String("string");
因为它会创建不必要的String对象。但它应该写成这样:
String s = "string";