我们通常使用创建的对象new
的关键字,如:
Object obj = new Object();
字符串是对象,但我们不使用new
创建它们:
String str = "Hello World";
为什么是这样? 我可以用一个String new
?
我们通常使用创建的对象new
的关键字,如:
Object obj = new Object();
字符串是对象,但我们不使用new
创建它们:
String str = "Hello World";
为什么是这样? 我可以用一个String new
?
除了什么已经说过, 字符串 [即,像字符串"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倍,而现在它只会被实例化一次。
字符串是在Java中“特殊”的对象。 Java的设计者明智地决定串被经常,他们需要自己的语法以及缓存策略使用。 当你说声明的字符串:
String myString = "something";
myString的是一个参考字符串对象与“东西”的值。 如果您稍后声明:
String myOtherString = "something";
Java是足够聪明,制定出的myString和myOtherString是相同的,他们将在全球字符串表存储为同一个对象。 它依赖于事实,你不能修改字符串来做到这一点。 这降低了所需的内存量,可以使比较快。
相反,如果你写
String myOtherString = new String("something");
Java将为你创建一个全新的对象,从MyString的对象不同。
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").
希望这清除了几个疑点。 :)
这是一个捷径。 这原本不是这样的,但Java改变了它。
这常见问题解答一下简要会谈。 Java规范引导它也举行了会谈。 但我不能在网上找到它。
字符串是受一对夫妇的优化的(一个更好的短语想要的)。 需要注意的是字符串也有运算符重载(为+运营商) - 不像其他物体。 所以这是非常特殊的情况。
我们通常使用的字符串文字,以避免产生不必要的对象。 如果我们用new操作符创建String对象,那么它会创建新的对象每次。
例:
String s1=“Hello“;
String s2=“Hello“;
String s3= new String(“Hello“);
String s4= new String(“Hello“);
在存储器中的上述代码:
在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
当类加载器加载一个类,所有的字符串常量被添加到字符串池中。
语法糖。 该
String s = new String("ABC");
语法仍然可用。
您仍然可以使用new String("string")
但它是不困难的字符串文字来创建新的字符串...你将不得不使用字符数组或字节:-)字符串常量有一个附加属性:所有相同的字符串字面量从任何类指向相同的字符串实例(它们被拘留)。
有几乎不需要新的字符串为文本(引号字符)已经被载入主机类时创建一个String对象。 这是完全合法的调用上的文字和唐方法,其主要区别是由文字带来的便利。 这将是一个重大的痛苦和脚的浪费,如果我们必须创建字符数组,并填写由炭炭和他们做一个新的String(char数组)。
随意创建新的字符串
String s = new String("I'm a new String");
通常的符号s = "new String";
或多或少是一个方便的快捷方式-它应该用于除了那些非常罕见的情况下,如果你真的需要字符串晋级方程式性能的原因
(string1.equals(string2)) && !(string1 == string2)
编辑
在回应评论: 不是希望成为一个提醒,但只是一个只有一个直接反应发问论文中, 我们不使用“新”的关键字对于字符串,这根本不是真的。 希望这个编辑(含以上)阐明这一点。 顺便说一句 - 有一对夫妇的好和更好的回答上,因此将上述问题。
文字池包含已不使用关键字创建的任何字符串new
。
是有区别的:没有新的参考字符串存储在字符串文字池中,并串新说,他们是在堆内存。
字符串以新的其他地方的记忆就像任何其他对象。
因为字符串是Java中的不可变类。
现在为什么它是不可变的? 作为字符串是不可改变的,因此可以在多个线程之间共享,我们不需要外部同步字符串操作。 作为字符串也被用在类加载机制。 所以,如果字符串是可变的,然后java.io.Writer中可能已经改为abc.xyz.mywriter
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的交易..