[Java 基础]String 类
字符串是编程中最常用的数据类型,在 Java 中,字符串不是基本数据类型,而是一个类,位于 java.lang
包中。这意味着我们可以像操作其他对象一样操作字符串。String
类提供了丰富的方法,用于创建、比较、连接、截取、查找和修改字符串等操作。
创建一个 String 字符串对象,最直接、最常用的方法就是将字符串用双引号括起来赋值给 String 类型的变量。
String message = "Hello Java!";
String name = "小明";
String empty = ""; // 空字符串
String 对象有一个非常重要的特性是不可变性 (Immutability),这意味着一旦一个 String 对象被创建,它的内容就不能被修改。任何看似修改字符串的操作,实际上都会创建一个新的 String 对象。让我们通过一个例子来理解:
public class StringImmutableDemo {public static void main(String[] args) {String str1 = "Hello";String str2 = str1; // str2 指向 str1 相同的对象System.out.println("修改前:");System.out.println("str1 = " + str1);System.out.println("str2 = " + str2);// 尝试修改 str1str1 = str1 + " World"; // 实际上是创建了一个新的字符串对象System.out.println("\n修改后:");System.out.println("str1 = " + str1);System.out.println("str2 = " + str2);}
}
上面的代码的执行结果是:
如果 String
是可变的,那么当 str1 = str1 + " World"
执行时,它会直接修改 str1
原来指向的那个 “Hello” 对象的内容,变成 “Hello World”。由于 str2
最初也指向同一个对象,那么在修改后,str2
的值也应该变成 “Hello World”。
但是,实际运行结果是 str2
的值保持不变(仍然是 “Hello”)。这明确地表明,对 str1
执行的连接操作并没有改变原始的 “Hello” 字符串对象。它只是让 str1
指向了一个全新的字符串对象,而 str2
仍然指向那个未被修改的原始 “Hello” 对象。
String 类的常用方法
length
返回字符串的长度(包含的字符数)。
String message = "Hello";
int length = message.length(); // length 的值为 5
charAt
返回指定索引位置的字符。索引从 0 开始。
String word = "Java";
char firstChar = word.charAt(0); // firstChar 的值为 'J'
char lastChar = word.charAt(3); // lastChar 的值为 'a'
concat
将指定的字符串连接到该字符串的末尾,返回一个新的字符串。
String str1 = "Hello";
String str2 = " World";
String result = str1.concat(str2); // result 的值为 "Hello World"
substring
返回一个新的字符串,它是此字符串从 beginIndex
开始到末尾的子字符串,它还有一个有两个参数的方法,指定截取的起始下标和截取的长度。
String text1 = "Programming";
String sub1 = text1.substring(4); // sub1 的值为 "ramming"String text2 = "Programming";
String sub2 = text2.substring(0, 4); // sub2 的值为 "Prog"
equals
将此字符串与指定的对象进行比较。只有当对象也是一个 String
并且包含与此字符串相同的字符序列时,结果才为 true
。
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1.equals(s2)); // 输出 true
System.out.println(s1.equals(s3)); // 输出 true
System.out.println(s1 == s3); // 输出 false (比较的是对象的引用)
:::color3
比较字符串内容是否相等应该使用 equals()
方法,而不是 == 运算符。== 运算符比较的是两个对象的引用是否指向同一个内存地址。
:::
toLowerCase 和 toUpperCase
将字符串全部小写或全部大写。
String upperCase = "HELLO";
String lowerCase = upperCase.toLowerCase(); // lowerCase 的值为 "hello"
String lowerCase2 = "world";
String upperCase2 = lowerCase2.toUpperCase(); // upperCase2 的值为 "WORLD"
equalsIgnoreCase
忽略大小写进行比较两个字符串内容是否相等。
String strA = "java";
String strB = "Java";
System.out.println(strA.equalsIgnoreCase(strB)); // 输出 true
trim
返回一个新的字符串,它是此字符串删除了前导和尾部空白的副本。
String stringWithSpaces = " Extra spaces ";
String trimmedString = stringWithSpaces.trim(); // trimmedString 的值为 "Extra spaces"
split
根据给定的正则表达式将此字符串拆分为字符串数组。
String data = "apple,banana,orange";
String[] fruits = data.split(","); // fruits 的值为 ["apple", "banana", "orange"]
基本上 String 类提供的这些方法够用,但是一些三方包中提供了额外的非常好用的关于字符串的一些工具类,比如: Apache Commons Lang - StringUtils
这个类。