在C ++中,创建我知道的多行字符串的最佳规范方法是创建相邻字符串并让编译器在编译时将它们连接起来,如下所示:
string s = "This is a very long string ...\n"
" and it keeps on going...";
在Java中,我知道这样做的唯一方法是连接:
String s = "This is a very long string ...\n" +
" and it keeps on going...";
问题是,这会在运行时生成一个字符串,还是java在编译时实际连接?问题出现的原因是由于以下行为:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // this prints true, because the compiler
// generates only one "abc" object
String s3 = "a";
s3 += "bc";
System.out.println(s1 == s3); // false
答案 0 :(得分:3)
String s3 = "a";
s3 += "bc";
与:
相同String s3 = "a";
s3 = new StringBuilder().append(s3).append("bc").toString();
因此它创建了String
的新实例。
你甚至可以尝试:
String s = null;
s += null;
System.out.println(s); // prints "nullnull"
答案 1 :(得分:1)
Java为每个字符串创建一个不可变对象,但会重复使用文字来提高性能。
此行创建一个不可变的字符串s1
String s1 = "abc";
将引用与s1
相同的字符串文字,因为这是一个文字,可以由编译器进行优化。
String s2 = "abc";
这是一个身份比较,你要问的是S1和S2是同一个对象,不是同一个字符串。由于编译器已通过使两个对象引用相同的不可变字符串进行优化,因此返回true。
System.out.println(s1 == s2);
这将创建2个不可变字符串,然后在运行时创建第三个字符串。由于runtimecant保证它可以找到一个已经存在的字符串以便有效地引用它只是创建一个新对象并创建一个新的不可变字符串s3
String s3 = "a";
s3 = s3 + "bc";
这是假的,因为它们是两个独立的数据对象。
System.out.println(s1 == s3);
注意字符串相等性返回true,这是我们如何比较字符串对象的内容,而不是对象位置。这是对身份的第一次比较检查,第二次检查是否相等。
System.out.println(s1.equals(s3));
Java知道为字符串连接过程的每一步创建一个Data对象是非常不自然的。为了帮助java hava StringBuilder
api做更多的执行concats。
String s = "a";
s += "b";
s += "c";
s += "d";
s += "e";
导致'9'字符串对象被创建并写入内存...
("a", "b", "ab", "c", "abc", "d", "abcd", "e", "abcde")
字符串构建器帮助
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
sb.append("d");
sb.append("e");
更高效,因为它执行单个concat并导致更好的内存使用。
("a", "b", "c", "d", "e", "abcde")