在 Java 中,String
是一个非常重要且常用的引用数据类型,用于表示和处理文本数据。下面将从多个方面详细介绍 Java 中的 String
类型。
1. 定义和初始化
String
类位于 java.lang
包中,该包会被 Java 自动导入,因此在使用 String
类时无需显式导入。可以通过以下几种方式来定义和初始化 String
对象:
字面量方式
String str1 = "Hello, World!";
使用双引号括起来的字符序列会自动创建一个 String
对象。这种方式会先在字符串常量池中查找是否已经存在相同内容的字符串,如果存在则直接返回该字符串的引用;如果不存在,则在常量池中创建一个新的字符串对象。
使用构造函数
// 使用空参构造函数创建一个空字符串
String str2 = new String();
// 使用字符数组创建字符串
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str3 = new String(charArray);
// 使用字节数组创建字符串
byte[] byteArray = {72, 101, 108, 108, 111};
String str4 = new String(byteArray);
使用 new
关键字调用 String
类的构造函数会在堆内存中创建一个新的 String
对象,即使字符串常量池中已经存在相同内容的字符串。
2. 字符串的不可变性
String
对象是不可变的,这意味着一旦创建了一个 String
对象,它的内容就不能被改变。例如:
String str = "Hello";
str = str + " World";
在上述代码中,str
变量最初引用的是一个包含 "Hello" 的 String
对象。当执行 str = str + " World"
时,实际上是创建了一个新的 String
对象,该对象包含 "Hello World",然后让 str
变量引用这个新对象,而原来的 "Hello" 对象仍然存在于内存中。
3. 常用方法
字符串长度
String str = "Hello";
int length = str.length(); // 返回字符串的长度,结果为 5
字符串拼接
String str1 = "Hello";
String str2 = " World";
String result = str1.concat(str2); // 使用 concat 方法拼接字符串,结果为 "Hello World"
String result2 = str1 + str2; // 使用 + 运算符拼接字符串,结果为 "Hello World"
字符串比较
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
boolean isEqual1 = str1.equals(str2); // 使用 equals 方法比较内容,结果为 true
boolean isEqual2 = str1.equals(str3); // 使用 equals 方法比较内容,结果为 true
boolean isSame1 = str1 == str2; // 使用 == 比较引用,结果为 true
boolean isSame2 = str1 == str3; // 使用 == 比较引用,结果为 false
字符串查找
String str = "Hello, World!";
int index = str.indexOf("World"); // 查找子字符串的位置,结果为 7
字符串截取
String str = "Hello, World!";
String subStr = str.substring(7); // 从索引 7 开始截取到末尾,结果为 "World!"
String subStr2 = str.substring(7, 12); // 截取从索引 7 到 12(不包含 12)的子字符串,结果为 "World"
字符串替换
String str = "Hello, World!";
String newStr = str.replace("World", "Java"); // 将 "World" 替换为 "Java",结果为 "Hello, Java!"
字符串大小写转换
String str = "Hello, World!";
String upperCase = str.toUpperCase(); // 转换为大写,结果为 "HELLO, WORLD!"
String lowerCase = str.toLowerCase(); // 转换为小写,结果为 "hello, world!"
4. 字符串常量池
Java 中的字符串常量池是一个特殊的内存区域,用于存储字符串字面量。当使用字符串字面量创建 String
对象时,JVM 会先在字符串常量池中查找是否已经存在相同内容的字符串,如果存在则直接返回该字符串的引用;如果不存在,则在常量池中创建一个新的字符串对象。而使用 new
关键字创建 String
对象时,会在堆内存中创建一个新的对象,即使常量池中已经存在相同内容的字符串。
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true,因为 str1 和 str2 引用的是常量池中的同一个对象
System.out.println(str1 == str3); // false,因为 str3 是在堆内存中创建的新对象
5. 注意事项
- 由于
String
对象的不可变性,频繁进行字符串拼接操作会产生大量的临时对象,影响性能。在这种情况下,建议使用StringBuilder
或StringBuffer
类。 - 在比较字符串内容时,应该使用
equals
方法,而不是==
运算符,因为==
比较的是对象的引用,而不是内容。