MST

星途 面试题库

面试题:Java中String常量池与字符串拼接

在Java中,有如下代码:String s1 = "a" + "b"; String s2 = "ab"; 请从String常量池的角度分析s1和s2是否相等,为什么?同时说明不同的字符串拼接方式(如使用 + 、concat方法、StringBuilder等)对常量池的影响。
25.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. s1和s2是否相等及原因
    • s1和s2相等。在Java中,对于字符串常量的拼接,编译器会在编译期进行优化。String s1 = "a" + "b"; 这里的 "a""b" 都是字符串常量,编译器会将其直接拼接成 "ab",和 String s2 = "ab"; 效果一样。在字符串常量池里,只会存在一份 "ab",所以 s1 == s2(这里 == 比较的是内存地址,因为字符串常量池的特性),s1.equals(s2) 也为 true
  2. 不同字符串拼接方式对常量池的影响
    • 使用 + 拼接字符串常量:如上述代码,编译器优化后,结果字符串会放入常量池。例如 String s3 = "c" + "d";"cd" 会放入常量池。
    • 使用 + 拼接字符串变量
      • 例如 String a = "a"; String b = "b"; String s4 = a + b;,在运行期才会进行拼接,拼接结果不会放入常量池。这里 ab 是变量,编译器无法在编译期确定其值,所以 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 适用于需要频繁拼接字符串的场景,因为它不会像 + 拼接字符串变量那样每次都创建新的对象,提高了性能。