带有new运算符和文字的java字符串

时间:2013-10-19 08:06:46

标签: java string

假设我们创建了String s,如下所示

String s = new String("Java");

所以上面的声明会在遇到new运算符时创建一个新对象。

假设我们在同一个程序中声明了一个新的String s1,如下所示:

String s1 = "Java";

这会创建一个新对象,还是指向带有Java的旧对象,因为它已经使用上面的new运算符创建。

5 个答案:

答案 0 :(得分:8)

好吧,第二行不会创建新对象,因为你已经在第一行使用了相同的字符串常量 - 但s1s仍会引用不同的对象。

第二行不会创建新对象的原因是汇总了字符串常量 - 如果多次使用相同的字符串常量,则它们都被解析为相同的字符串。当然,仍然必须在某个时刻分配String个对象 - 但是对于所有用途,只有一个对象。例如,请考虑以下代码:

int x = 0;
for (int i = 0; i < 1000000; i++) {
    String text = "Foo";
    x += text.length();
}

这将创建一百万个字符串 - text的值在循环的每次迭代中都是相同的,每次都引用相同的对象。

但是如果你故意创建一个 new String,那肯定会创建一个新对象 - 只是基于现有数据。例如:

String a = new String("test");
String b = new String("test");
String x = "test";
String y = "test";
// Deliberately using == rather than equals, to check reference equality
System.out.println(a == b); // false
System.out.println(a == x); // false
System.out.println(x == y); // true

或者换句话说,上面的前四行大致相当于:

String literal = "test";
String a = new String(literal);
String b = new String(literal);
String x = literal;
String y = literal;

答案 1 :(得分:1)

String myString = new String("Java");

创建两个对象。

String myString = "Java";

创建一个对象。

答案 2 :(得分:0)

为了创建新对象,我们使用关键字,如果不使用Object则无法创建new

根据第一个实例中的声明,创建了一个新的Object,但在第二个实例中,您只是声明一个带有值的变量。

所以它不是Object

答案 3 :(得分:0)

String s1 =“foo”; 将在StringPool中创建文字。

字符串s2 =“foo”; 这次它将检查“foo”文字在StringPool中是否已经可用,因为它现在存在,所以s2将引用与s1相同的文字。

String s3 = new String(“foo”); “foo”literal将首先在StringPool中创建,然后通过字符串arg构造函数String对象将被创建,即堆中的“foo”由于通过new运算符创建对象,然后s3将引用它。

答案 4 :(得分:0)

当你使用文字创建一个String(例如String str =“Hello”;)时,不会在Heap中创建Object,它只能在StringPool中使用,但是当你使用'new'运算符创建一个String时(例如String str) = new String(“Hello”))然后创建StringPool中的Object以及Heap中的另一个对象。所以我们不必要地创建了两个对象。因此,使用文字创建字符串是首选方式。