String
在Java中,String 是一个特殊的类,用于表示和操作字符串(即字符序列)。虽然 String 看起来像是一个基本数据类型,但实际上它是一个引用类型,属于 java.lang 包的一部分。
特点
不可变性
- String 对象一旦创建,其内容就不能被修改。
- 任何对 String 的修改操作(如拼接、替换等)都会生成一个新的 String 对象,而不是修改原有对象。
- 这种设计使得 String 是线程安全的,并且可以被缓存(如字符串常量池)。
字符串常量池(String Pool)
- Java 使用字符串常量池来优化字符串的存储。
- 当使用双引号(“…”)创建字符串时,JVM
会首先检查字符串常量池中是否存在相同的字符串。如果存在,则直接返回池中的引用;如果不存在,则在池中创建一个新的字符串对象。
常用操作
String 提供了丰富的方法来操作字符串,例如:
- 获取长度:length()
- 拼接字符串:concat() 或 +
- 比较字符串:equals()、equalsIgnoreCase()
- 查找子字符串:indexOf()、contains()
- 截取子字符串:substring()
- 替换字符或字符串:replace()
- 分割字符串:split()
- 大小写转换:toLowerCase()、toUpperCase()
String 创建方式
在 Java 中,String 可以通过以下两种方式创建:
- 使用双引号(字面量方式)
String str1 = "Hello, World!";
这种方式会检查字符串常量池,如果池中已存在相同内容的字符串,则直接返回池中的引用
- 使用new关键字
String str2 = new String("Hello, World!");
这种方式会在堆内存中创建一个新的 String 对象,即使字符串常量池中已经存在相同内容的字符串。
String 不可变特性
String str = "Hello, Java!";
// 获取长度
int length = str.length(); // 12
// 比较字符串
boolean isEqual = str.equals("Hello, Java!"); // true
// 查找子字符串
int index = str.indexOf("Java"); // 7
// 截取子字符串
String subStr = str.substring(7); // "Java!"
// 替换字符
String newStr = str.replace('a', 'o'); // "Hello, Jovo!"
// 分割字符串
String[] parts = str.split(", "); // ["Hello", "Java!"]
String 底层原理
- 在 Java 8 及之前,String 内部使用 char[] 数组来存储字符。
- 从 Java 9 开始,为了节省内存,String 改为使用 byte[] 数组,并引入了一个编码标志(coder)来区分 Latin-1 和 UTF-16 编码。
String与其他类
StringBuilder 和 StringBuffer:
- 这两个类用于处理可变的字符串。
- StringBuilder 是非线程安全的,性能更高。
- StringBuffer 是线程安全的,性能稍低。
CharSequence 接口:
- String 实现了 CharSequence 接口,因此它可以被用于任何需要 CharSequence 的地方。
总结
- String 是 Java 中的一个引用类型,属于 java.lang 包。
- 它是不可变的,任何修改操作都会生成一个新的对象。
- 通过字符串常量池优化存储,提供了丰富的操作方法。
- 在实际开发中,如果需要频繁修改字符串,建议使用 StringBuilder 或 StringBuffer。