上一篇地址:整理好了!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
。在选择方法时,需要根据具体情况和性能要求来决定使用哪种方法。