我们通常使用new
关键字创建对象,例如:
Object obj = new Object();
字符串是对象,但是我们不能new
用来创建它们:
String str = "Hello World";
为什么是这样?我可以用做一个琴弦new
吗?
new String(...)
在对大字符串进行子字符串化时,已用于绕过实现细节。此问题已在Java 7中修复,不再需要。
我们通常使用new
关键字创建对象,例如:
Object obj = new Object();
字符串是对象,但是我们不能new
用来创建它们:
String str = "Hello World";
为什么是这样?我可以用做一个琴弦new
吗?
new String(...)
在对大字符串进行子字符串化时,已用于绕过实现细节。此问题已在Java 7中修复,不再需要。
Answers:
除了已经说过的内容外,还对Java中的字符串文字 [即,类似"abcd"
但不喜欢的字符串new String("abcd")
]进行了插值-这意味着,每次引用“ 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()
比较字符串;==
测试物理相等性)。
Interning String文字很好,因为它们经常被多次使用。例如,考虑(人为)代码:
for (int i = 0; i < 10; i++) {
System.out.println("Next iteration");
}
如果我们没有String的内部,则“下一次迭代”将需要实例化10次,而现在只需要实例化一次。
字符串是Java中的“特殊”对象。Java设计人员明智地决定使用Strings的频率很高,以至于他们需要自己的语法和缓存策略。通过以下方式声明字符串时:
String myString = "something";
myString是对String对象的引用,其值为“ something”。如果您以后声明:
String myOtherString = "something";
Java足够聪明,可以确定myString和myOtherString相同,并将它们存储在全局String表中作为同一对象。它依赖于您不能修改字符串来执行此操作的事实。这样可以减少所需的内存量,并可以使比较更快。
相反,如果您写
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").
希望这能消除一些疑问。:)
字符串要经过几个优化(因为需要一个更好的短语)。请注意,String还具有运算符重载(对于+运算符),这与其他对象不同。因此,这是非常特殊的情况。
我们通常使用String文字以避免创建不必要的对象。如果我们使用new运算符创建String对象,那么它将每次都创建新对象。
例:
String s1=“Hello“;
String s2=“Hello“;
String s3= new String(“Hello“);
String s4= new String(“Hello“);
对于内存中的上述代码:
在Java中,字符串是一种特殊情况,许多规则仅适用于字符串。双引号引起编译器创建一个String对象。由于String对象是不可变的,因此允许编译器实习多个字符串,并建立更大的字符串池。两个相同的String常量将始终具有相同的对象引用。如果不希望出现这种情况,则可以使用new String(“”),这将在运行时创建String对象。intern()方法曾经很常见,可导致根据字符串查找表检查动态创建的字符串。插入字符串后,对象引用将指向规范的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常量都将添加到String池中。
语法糖。的
String s = new String("ABC");
语法仍然可用。
String small = new String(huge.substring(int, int));
,它允许您char[]
从原始huge
String中回收较大的基础。
随意创建一个新的字符串
String s = new String("I'm a new String");
通常的表示法s = "new String";
或多或少是一种便捷的快捷方式-出于性能原因,应使用该快捷方式,但在极少数情况下,除非您确实需要符合该等式的字符串
(string1.equals(string2)) && !(string1 == string2)
编辑
对此评论作出回应:这并不是要作为建议,而只是对提问者论点的直接回应,即我们不对字符串使用'new'关键字,这根本不是事实。希望此编辑(包括上面的内容)能使您对此有所了解。顺便说一句-关于SO的上述问题有两个很好的更好的答案。
new String(...)
除非您的应用程序要求您创建具有唯一标识的String,否则您不应“随意”使用。