在Java世界中,字符串是最常用的数据类型之一。本文旨在全面介绍Java字符串的特性、操作方法及其在实际编程中的应用,以帮助读者深入理解并有效地使用字符串。
一、字符串基础
在Java中,字符串由java.lang.String
类表示,它是不可变的。这意味着一旦创建了字符串对象,就不能更改它。每次修改字符串都会产生一个新的字符串对象。
创建字符串
字符串可以通过多种方式创建:
String s1 = "Hello"; // 字面量方式
String s2 = new String("World"); // 使用new关键字
String s = "Hello";
s = s + " World"; // 实际上创建了一个新的字符串
String str = "Hello World";
int length = str.length(); // 获取长度
String str2 = str.substring(0, 5); // 获取子串
int index = str.indexOf("World"); // 搜索子串
字符串拼接
虽然可以使用+
操作符进行字符串拼接,但在循环或大量拼接操作中,建议使用StringBuilder
或StringBuffer
,因为它们更高效。
StringBuilder builder = new StringBuilder();
builder.append("Hello");
builder.append(" ");
builder.append("World");
String result = builder.toString(); // "Hello World"
字符串与其他类型的转换
- 转换为字符数组:使用
toCharArray()
。 - 转换为字节数组:使用
getBytes()
。 - 字符串与基本类型的转换:使用
Integer.parseInt()
等方法。
char[] chars = str.toCharArray(); // 转换为字符数组
int number = Integer.parseInt("123"); // 字符串转换为整数
字符串池
字符串池是Java堆内存的一个特殊区域,用于存储字符串字面量和字符串常量。当创建一个字符串字面量时,Java会首先检查字符串池中是否已经存在相同内容的字符串。如果存在,就返回现有的字符串;如果不存在,新的字符串将被创建并放入池中。这种机制有助于节省内存,因为它避免了相同内容的字符串的重复创建。
二、面试经典问题及回答
1. String s = new String("Hello")
和String s = "Hello"
有什么区别?
当使用new String("Hello")
时,会创建一个新的字符串对象,即使池中已经存在内容为”Hello”的字符串。而使用String s = "Hello"
时,会使用字符串池中的字符串(如果存在的话),这有助于节省内存。
2. 为什么字符串在Java中是不可变的?
字符串不可变性有多个好处:
- 安全性:字符串常用作网络连接、文件路径等的参数,不可变性可以保证这些参数在运行时不被更改。
- 哈希码缓存:不可变性允许字符串的哈希码被缓存,这在使用哈希表(如HashMap)时提高了效率。
- 高效的字符串池:不可变性使得字符串池的实现更高效,因为相同内容的字符串可以安全地共享。
3. StringBuilder
和StringBuffer
有什么区别?
StringBuilder
和StringBuffer
都用于字符串拼接,但主要区别在于StringBuffer
是线程安全的,而StringBuilder
不是。因此,StringBuilder
在单线程环境下更高效。