面试题答案
一键面试- s1和s2是否相等及原因:
- s1和s2相等。在Java中,对于字符串常量的拼接,编译器会在编译期进行优化。
String s1 = "a" + "b";
这里的"a"
和"b"
都是字符串常量,编译器会将其直接拼接成"ab"
,和String s2 = "ab";
效果一样。在字符串常量池里,只会存在一份"ab"
,所以s1 == s2
(这里==
比较的是内存地址,因为字符串常量池的特性),s1.equals(s2)
也为true
。
- s1和s2相等。在Java中,对于字符串常量的拼接,编译器会在编译期进行优化。
- 不同字符串拼接方式对常量池的影响:
- 使用
+
拼接字符串常量:如上述代码,编译器优化后,结果字符串会放入常量池。例如String s3 = "c" + "d";
,"cd"
会放入常量池。 - 使用
+
拼接字符串变量:- 例如
String a = "a"; String b = "b"; String s4 = a + b;
,在运行期才会进行拼接,拼接结果不会放入常量池。这里a
和b
是变量,编译器无法在编译期确定其值,所以s4
是在堆上创建的新字符串对象,s4 != "ab"
(==
比较地址)。
- 例如
- 使用
concat
方法:concat
方法用于字符串拼接。例如String s5 = "a".concat("b");
,这种方式创建的字符串对象也不会放入常量池,s5 != "ab"
(==
比较地址)。concat
方法是在运行时进行操作,返回一个新的字符串对象,而不是常量池中的对象。
- 使用
StringBuilder
:StringBuilder
主要用于可变字符串的操作。例如StringBuilder sb = new StringBuilder(); sb.append("a").append("b"); String s6 = sb.toString();
,StringBuilder
拼接后的结果通过toString
方法返回一个新的字符串对象,这个对象不会放入常量池,s6 != "ab"
(==
比较地址)。StringBuilder
适用于需要频繁拼接字符串的场景,因为它不会像+
拼接字符串变量那样每次都创建新的对象,提高了性能。
- 使用