💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、概述 一般程序需要处理大量文本数据,Java 语言的文本数据被保存为字符或字符串类型。 * Java 提供了 String 类来创建和操作字符串。但是,String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 * Java 同时提供了两个可变字符串类 StringBuffer 和 StringBuilder,两者功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。 因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。 ## 二、String 类 在 Java 中定义一个字符串最简单的方法是用双引号把它包围起来。这种用双引号括起来的一串字符实际上都是 String 对象,如字符串`Hello`在编译后即成为 String 对象。 不论使用哪种形式创建字符串,字符串对象一旦被创建,其值是不能改变的,但可以使用其他变量重新赋值的方式进行更改。 ### 2.1 直接定义字符串 直接定义字符串是指使用双引号表示字符串中的内容,具体方法是用字符串常量直接初始化一个 String 对象,如下: ``` String str = "hello, world"; ``` ### 2.2 使用 String 类定义 * `String()`初始化一个新创建的 String 对象,表示一个空字符序列。 * `String(String original)`初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列。 * `String(char[] value)`分配一个新的字符串,将参数中的字符数组元素全部变为字符串。 ### 2.3 String 常用方法 * `int length()`返回当前字符串的长度 * `int indexOf(int ch)`查找 ch 字符在该字符串中第一次出现的位置 * `int indexOf(String str)`查找 str 子字符串在该字符串中第一次出现的位置 * `int lastIndexOf(int ch)`查找 ch 字符在该字符串中最后一次出现的位置 * `int lastIndexOf(String str)`查找 str 子字符串在该字符串中最后出现的位置 * `char charAt (int index)`获取字符串中指定位置的字符 * `boolean equals(Object obj)`将该字符串与指定对象比较,返回 true 或 false * `boolean equalsIgnoreCase(String obj)`将该字符串与指定对象比较(忽略大小写)返回 true 或 false * `String ​substring(int beginIndex)`获取从 beginIndex 位置开始到结束的子字符串 * `String substring(int beginIndex, int endIndex)`获取从 beginIndex 位置开始到 endIndex - 1位置的子字符串 * `String toLowerCase()`返回一个新字符串,将原始字符串中的大写字母改为小写 * `String toUpperCase()`返回一个新字符串,将原始字符串中的小写字母改成大写 * `String trim()`返回一个新字符串,删除了原始字符串头部和尾部的空格 * `byte[] getBytes()`将该字符串转换为 byte 数组 【阅读】给出如下语句,以下结果是() ``` String str = "Hello, Dodoke"; str = str.substring(2, 5); char ch = str.charAt(str.length()); System.out.println(ch); ``` 【阅读】给出如下语句:以下结果是() ``` String str = "abcdefg"; char ch = str.substring(3, 6).charAt(1); System.out.println(ch); ``` 【选择】关于字符串的 equals() 和 compareTo() 方法,选项中描述错误的是()(选择一项) ``` A 方法 equals() 比较两个字符串内容是否相等 B 方法 compareTo() 比较两个字符串大小 C 方法 equals() 返回值是 boolean 类型的值 D 方法 compareTo() 返回值是 String 类型的值 ``` 【编程】使用 String 类常用方法完成字符串处理。 ``` public class StringDemo { public static void main(String[] args) { /** * 已知字符串"abcdefg",使之经过处理得到字符串"CDE" * 并进一步将"DE"替换为",得到结果:CMM */ } } ``` 【选择】已知字符串的定义如下:以下哪个语句不能将字符串转换成 byte 数组()(选择一项) ``` String str = "Hello, Dodoke"; ``` ``` A byte[] arr = str.getBytes(); B byte[] arr = str.getBytes("GBK"); C byte[] arr = str.getBytes("UTF-8"); D byte[] arr; str.getBytes(arr, "GBK"); ``` 【选择】给出如下语句:下面哪个选项返回值为 true()(选择一项) ``` String s1 = new String("dodoke"); String s2 = new String("dodoke"); char c[] = {'d', 'o', 'd', 'o', 'k', 'e'}; ``` ``` A s1.equals(s2); B s1.equals(c); C s1.equals(new String()); D s1 == c; ``` 【选择】下列运行结果是 false 的是()(选择一项) ``` String str1 = "dodoke"; String str2 = "dodoke"; String str3 = new String("dodoke"); ``` ``` A System.out.println(str1.equals(str2)); B System.out.println(str1.equals(str3)); C System.out.println(str1 == str2); D System.out.println(str1 == str3); ``` ### 2.4 字符串的不可变性 String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 【选择】已知如下代码:以下哪个说法是正确的()(选择两项) ``` String str1 = new String("hello"); String str2 = "hello"; System.out.println(str1.concat(str2)); System.out.println(str1); ``` ``` A str1.equals(str2) 的结果为 true B 输出结果为:hellohello hellohello C str1 == str2 的结果为 true D 输出结果为:hellohello hello ``` ## 三、StringBuilder 类 Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder。创建 StringBuilder 类的对象后可以随意修改字符串的内容。每个 StringBuilder 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuilder 类对象的容量,则该对象的容量会自动扩大。 ### 3.1 StringBuilder 构造方法 StringBuilder 类提供了 3 个构造方法来创建一个字符串,如下所示: * `StringBuilder()`构造一个空的字符串缓冲区,并且初始化为 16 个字符的容量。 * `StringBuilder(int length)`创建一个空的字符串缓冲区,并且初始化为指定长度 length 的容量。 * `StringBuilder(String str)`创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。 ``` // 定义一个空的字符串缓冲区,含有16个字符的容量 StringBuilder str1 = new StringBuilder(); // 定义一个含有10个字符容量的字符串缓冲区 StringBuilder str2 = new StringBuilder(10); // 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符 StringBuilder str3 = new StringBuilder("青春无悔"); /** * 输出字符串的容量大小 * capacity()方法返回字符串的容量大小 */ System.out.println(str1.capacity()); //输出 16 System.out.println(str2.capacity()); //输出 10 System.out.println(str3.capacity()); //输出 20 ``` ### 3.2 StringBuilder 常用方法 * `append(String str)`:用于向原有 StringBuilder 对象中追加字符串 ``` StringBuilder builder = new StringBuilder("hello,"); //创建一个 StringBuilder 对象 String str = "World!"; buffer.append(str); //向 StringBuilder 对象追加 str 字符串 System.out.println(buffer.substring(0)); //输出:Hello,World! ``` * `setCharAt(int index, char ch)`:用于在字符串的指定索引位置替换一个字符 ``` StringBuilder sb = new StringBuilder("hello"); sb.setCharAt(1,'E'); System.out.println(sb); //输出:hEllo sb.setCharAt(0,'H'); System.out.println(sb); //输出:HEllo sb.setCharAt(2,'p'); System.out.println(sb); //输出:HEplo ``` * `reverse()`:用于将字符串序列用其反转的形式取代 ``` StringBuilder sb = new StringBuilder("java"); sb.reverse(); System.out.println(sb); //输出:avaj ``` * `deleteCharAt(int index)`:用于移除序列中指定位置的字符 ``` StringBuilder sb = new StringBuilder("She"); sb.deleteCharAt(2); System.out.println(sb); //输出:Se ``` * `delete(int start, int end)`:用于移除序列中子字符串的字符 ``` StringBuilder sb = new StringBuilder("hello jack"); sb.delete(2,5); System.out.println(sb); //输出:he jack sb.delete(2,5); System.out.println(sb); //输出:heck ``` 【阅读】给出如下语句,代码的输出结果是() ``` StringBuilder s = new StringBuilder("abcdefg"); s.delete(2, 4).insert(3, "CD"); System.out.println(s.toString()); ``` 【编程】给出如下语句:第三行填写什么代码,可以得到输出结果`123abc 123abc` ``` StringBuilder sb1 = new StringBuilder("123"); String s1 = "123"; // ... System.out.println(sb1 + "" + s1); ``` 【编程】定义一个字符串,利用 StringBuilder 完成如下效果。 ``` 欢迎来到dodoke 删除插入后:你好,dodoke 替换后:欢迎来到dodoke ``` ``` public class StringTest { public static void main(String[] args) { // 定义一个字符串"欢迎来到" // 在"欢迎来到"后面添加内容,将字符串变成"欢迎来到dodoke" // 使用delete方法删除"欢迎来到",然后插入“你好!” // 将字符串变成“你好,dodoke” // 使用replace方法替换 } } ``` 【编程】定义一个字符串,使用StringBuilder的常用方法对字符串进行操作。 ``` public class StringTest { public static void main(String[] args) { // 定义字符串"abc" // 经过处理得到字符串"fed---cba" // 进一步变换得到字符串"fedcba" } } ``` 【阅读】给出如下语句,代码的输出结果是() ``` public class Test { public static void main(String[] args) { Integer x = 400; Integer y = x; x++; StringBuilder sb1 = new StringBuilder("123"); StringBuilder sb2 = sb1; sb1.append("5"); System.out.println((x == y) + " " + (sb1 == sb2)) } } ```