两者有什么区别
String str = new String("abc");
and
String str = "abc";
两者有什么区别
String str = new String("abc");
and
String str = "abc";
当前回答
在第一种情况下,创建了两个对象。
在第二种情况下,它只是一个。
尽管两种方式str都指向abc。
其他回答
"abc"是一个字面值的字符串。
在Java中,这些字面值字符串是内部池,并且在代码中声明该字符串字面值的地方使用“abc”的相同String实例。因此"abc" == "abc"将始终为真,因为它们都是相同的String实例。
使用string .intern()方法,您可以向内部池字符串中添加任何您喜欢的字符串,这些字符串将保存在内存中,直到java退出。
另一方面,使用new String("abc")将在内存中创建一个新的字符串对象,它在逻辑上与"abc"字面量相同。 "abc" == new String("abc")将始终为false,因为尽管它们在逻辑上相等,但它们指的是不同的实例。
将String构造函数包装在字符串文字周围是没有价值的,它只是不必要地使用比它需要的更多内存。
根据String类文档,它们是等价的。
String(String original)的文档还说:除非需要original的显式副本,否则使用此构造函数是不必要的,因为String是不可变的。
寻找其他的回答,因为Java文档似乎是误导性的:(
一些拆卸总是很有趣的……
$ cat Test.java
public class Test {
public static void main(String... args) {
String abc = "abc";
String def = new String("def");
}
}
$ javap -c -v Test
Compiled from "Test.java"
public class Test extends java.lang.Object
SourceFile: "Test.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #7.#16; // java/lang/Object."<init>":()V
const #2 = String #17; // abc
const #3 = class #18; // java/lang/String
const #4 = String #19; // def
const #5 = Method #3.#20; // java/lang/String."<init>":(Ljava/lang/String;)V
const #6 = class #21; // Test
const #7 = class #22; // java/lang/Object
const #8 = Asciz <init>;
...
{
public Test(); ...
public static void main(java.lang.String[]);
Code:
Stack=3, Locals=3, Args_size=1
0: ldc #2; // Load string constant "abc"
2: astore_1 // Store top of stack onto local variable 1
3: new #3; // class java/lang/String
6: dup // duplicate top of stack
7: ldc #4; // Load string constant "def"
9: invokespecial #5; // Invoke constructor
12: astore_2 // Store top of stack onto local variable 2
13: return
}
在第一种情况下,创建了两个对象。
在第二种情况下,它只是一个。
尽管两种方式str都指向abc。
除了已经发布的答案,还可以查看这篇关于javaranche的优秀文章。