上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(二十七)-CSDN博客
五十五、String 真的是不可变的吗?
在Java中,String 类的对象确实是不可变的(Immutable)。这意味着一旦一个 String 对象被创建,它所包含的字符序列就不能被改变。这个特性是 String 类设计的核心部分,并且是由以下几个方面保证的:
-  声明为 final:在String类的内部实现中,存储字符串字符的数组被声明为private final,这意味着一旦数组被初始化,它就不能被重新赋值。
-  没有修改方法: String类没有提供任何修改其字符序列的方法。所有看似修改String对象的方法,如replace()、substring()或concat(),实际上都会返回一个新的String对象。
-  不可变的实现: String类的实现确保了它的不可变性。例如,即使是StringBuffer或StringBuilder这样的可变字符串类,当它们内部的字符串被转换为String对象时,也会创建一个新的不可变字符串。
示例
String str = "Hello";
str = str + " World!";在这个示例中,尽管看起来 str 被修改了,但实际上发生了以下步骤:
- 创建了一个新的字符串对象 " World!"。
- 将 "Hello"和" World!"连接,生成了一个新的字符串对象"Hello World!"。
- str引用指向了这个新的字符串对象。
原来的 "Hello" 对象仍然存在于字符串常量池中,没有被修改。
注意事项
- 由于 String的不可变性,频繁地修改字符串(如在循环中拼接字符串)会导致创建多个临时String对象,这可能会对性能产生负面影响。
- 在处理字符串的修改操作时,推荐使用 StringBuilder或StringBuffer,这些类提供了可变的字符串对象,适合于频繁修改的场景。
总结
String 类的对象在Java中是不可变的,这是由其内部实现和设计哲学决定的。不可变性为 String 类带来了线程安全性、性能优势和简化的编程模型。理解 String 的不可变性对于编写高效的字符串处理程序和利用Java的字符串常量池非常重要。
五十六、String 字符串如何进行反转?
在Java中,反转一个String字符串可以通过多种方式实现,下面是几种常见的方法:
使用StringBuilder类的reverse()方法
 
这是最简单直接的方法,StringBuilder类提供了一个reverse()方法,用于反转字符串。
String original = "Hello, World!";
String reversed = new StringBuilder(original).reverse().toString();
System.out.println(reversed); // 输出: "!dlroW ,olleH"使用字符串连接
通过使用字符串连接操作,可以逐个字符地构建反转后的字符串。
String original = "Hello, World!";
String reversed = "";
for (int i = original.length() - 1; i >= 0; i--) {reversed += original.charAt(i);
}
System.out.println(reversed);使用Stack类
 
可以使用Stack数据结构来反转字符串,Stack类提供了push和pop方法,可以用来反转字符串。
String original = "Hello, World!";
Stack<Character> stack = new Stack<>();
for (int i = 0; i < original.length(); i++) {stack.push(original.charAt(i));
}String reversed = "";
while (!stack.isEmpty()) {reversed += stack.pop();
}
System.out.println(reversed);使用递归
递归方法也可以用于反转字符串,尽管这不是一个实用的方法,但它展示了递归的概念。
public class StringReverse {public static String reverse(String str, int index) {if (index < str.length()) {return str.charAt(index) + reverse(str, index + 1);} else {return "";}}public static void main(String[] args) {String original = "Hello, World!";String reversed = reverse(original, 0);System.out.println(reversed);}
}使用String类的连接
 
String类是不可变的,这意味着每次修改操作都会创建一个新的String对象。可以通过连接操作来反转字符串,但这在性能上不如使用StringBuilder。
String original = "Hello, World!";
String reversed = "";
for (int i = original.length() - 1; i >= 0; i--) {reversed = original.charAt(i) + reversed;
}
System.out.println(reversed);总结
使用StringBuilder的reverse()方法是最简单且高效的方法来反转字符串。其他方法虽然也能实现字符串反转,但可能在性能上不如StringBuilder。在选择方法时,需要根据具体情况和性能要求来决定使用哪种方法。