字符串是在Java对象,那么我们为什么不使用“新”来创建它们?字符串是在Java对象,那么我们为什么

2019-05-08 21:24发布

我们通常使用创建的对象new的关键字,如:

Object obj = new Object();

字符串是对象,但我们不使用new创建它们:

String str = "Hello World";

为什么是这样? 我可以用一个String new

Answer 1:

除了什么已经说过, 字符串 [即,像字符串"abcd" ,但不喜欢new String("abcd") ]在Java中被拘留-这意味着每次提及“ABCD”,你会得到一个参考到一个String的实例,而不是每一次一个新的。 所以,你将有:

String a = "abcd";
String b = "abcd";

a == b; //True

但如果你有

String a = new String("abcd");
String b = new String("abcd");

那么它可能有

a == b; // False

(并且如果有人需要提醒,总是用.equals()比较字符串; ==物理平等的测试)。

实习字符串文字是好的,因为它们往往使用一次以上。 例如,考虑(做作)代码:

for (int i = 0; i < 10; i++) {
  System.out.println("Next iteration");
}

如果我们没有琴弦的实习,“下一次迭代”需要被实例化10倍,而现在它只会被实例化一次。



Answer 2:

字符串是在Java中“特殊”的对象。 Java的设计者明智地决定串被经常,他们需要自己的语法以及缓存策略使用。 当你说声明的字符串:

String myString = "something";

myString的是一个参考字符串对象与“东西”的值。 如果您稍后声明:

String myOtherString = "something";

Java是足够聪明,制定出的myString和myOtherString是相同的,他们将在全球字符串表存储为同一个对象。 它依赖于事实,你不能修改字符串来做到这一点。 这降低了所需的内存量,可以使比较快。

相反,如果你写

String myOtherString = new String("something");

Java将为你创建一个全新的对象,从MyString的对象不同。



Answer 3:

String a = "abc"; // 1 Object: "abc" added to pool

String b = "abc"; // 0 Object: because it is already in the pool

String c = new String("abc"); // 1 Object

String d = new String("def"); // 1 Object + "def" is added to the Pool

String e = d.intern(); // (e==d) is "false" because e refers to the String in pool

String f = e.intern(); // (f==e) is "true" 

//Total Objects: 4 ("abc", c, d, "def").

希望这清除了几个疑点。 :)



Answer 4:

这是一个捷径。 这原本不是这样的,但Java改变了它。

这常见问题解答一下简要会谈。 Java规范引导它也举行了会谈。 但我不能在网上找到它。



Answer 5:

字符串是受一对夫妇的优化的(一个更好的短语想要的)。 需要注意的是字符串也有运算符重载(为+运营商) - 不像其他物体。 所以这是非常特殊的情况。



Answer 6:

我们通常使用的字符串文字,以避免产生不必要的对象。 如果我们用new操作符创建String对象,那么它会创建新的对象每次。

例:

String s1=“Hello“;
String s2=“Hello“;
String s3= new String(“Hello“);
String s4= new String(“Hello“);

在存储器中的上述代码:



Answer 7:

在Java中,字符串是一个特殊的情况下,仅适用于字符串许多规则。 双引号导致编译器创建一个String对象。 因为String对象是不可变的,这可以让编译器实习生多个字符串,并建立一个更大的字符串池。 两个相同的字符串常量将始终具有相同的对象引用。 如果你不希望这是事实,那么你可以使用新的String(“”),这将在运行时创建一个String对象。 所使用的实习生()方法是共同的,以使对字符串查找表进行检查动态创建字符串。 一旦在实习的字符串,对该对象的引用将指向规范化字符串实例。

    String a = "foo";
    String b = "foo";
    System.out.println(a == b); // true
    String c = new String(a);
    System.out.println(a == c); // false
    c = c.intern();
    System.out.println(a == c); // true

当类加载器加载一个类,所有的字符串常量被添加到字符串池中。



Answer 8:

语法糖。 该

String s = new String("ABC");

语法仍然可用。



Answer 9:

您仍然可以使用new String("string")但它是不困难的字符串文字来创建新的字符串...你将不得不使用字符数组或字节:-)字符串常量有一个附加属性:所有相同的字符串字面量从任何类指向相同的字符串实例(它们被拘留)。



Answer 10:

有几乎不需要新的字符串为文本(引号字符)已经被载入主机类时创建一个String对象。 这是完全合法的调用上的文字和唐方法,其主要区别是由文字带来的便利。 这将是一个重大的痛苦和脚的浪费,如果我们必须创建字符数组,并填写由炭炭和他们做一个新的String(char数组)。



Answer 11:

随意创建新的字符串

String s = new String("I'm a new String");

通常的符号s = "new String"; 或多或少是一个方便的快捷方式-它应该用于除了那些非常罕见的情况下,如果你真的需要字符串晋级方程式性能的原因

(string1.equals(string2)) && !(string1 == string2)

编辑

在回应评论: 不是希望成为一个提醒,但只是一个只有一个直接反应发问论文中, 我们不使用“新”的关键字对于字符串,这根本不是真的。 希望这个编辑(含以上)阐明这一点。 顺便说一句 - 有一对夫妇的好和更好的回答上,因此将上述问题。



Answer 12:

文字池包含已不使用关键字创建的任何字符串new

是有区别的:没有新的参考字符串存储在字符串文字池中,并串新说,他们是在堆内存。

字符串以新的其他地方的记忆就像任何其他对象。



Answer 13:

因为字符串是Java中的不可变类。

现在为什么它是不可变的? 作为字符串是不可改变的,因此可以在多个线程之间共享,我们不需要外部同步字符串操作。 作为字符串也被用在类加载机制。 所以,如果字符串是可变的,然后java.io.Writer中可能已经改为abc.xyz.mywriter



Answer 14:

TString obj1 = new TString("Jan Peter");                
TString obj2 = new TString("Jan Peter");                    

if (obj1.Name == obj2.Name)                 
    System.out.println("True");
else                
    System.out.println("False");

输出:

真正

我创建了两个独立的物体,都有一个字段(REF)“名称”。 因此,即使在这种情况下,“扬·彼得”是共享的,如果我理解的方式java的交易..



文章来源: Strings are objects in Java, so why don't we use 'new' to create them?