String 类
字符串是最常用的数据类型之一,本课学习Java中String类的使用。
创建字符串
两种创建方式
JAVA
// 方式1:字面量(推荐)
String s1 = "Hello";
// 方式2:new关键字
String s2 = new String("Hello");
区别
JAVA
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true(同一对象)
System.out.println(s1 == s3); // false(不同对象)
System.out.println(s1.equals(s3)); // true(内容相同)
💡 建议: 用字面量方式创建字符串,更高效。Java会缓存字符串字面量。
字符串特性
不可变性
String对象一旦创建,内容不能修改。
JAVA
String s = "Hello";
s = s + " World"; // 创建了新对象,不是修改原对象
示例:字符串不可变
JAVA
public class StringImmutable {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = s1.concat(" World");
System.out.println(s1); // Hello(原对象不变)
System.out.println(s2); // Hello World(新对象)
}
}
常用方法
长度与判断
| 方法 | 说明 | 示例 |
|---|---|---|
length() |
字符串长度 | "Hello".length() → 5 |
isEmpty() |
是否为空串 | "".isEmpty() → true |
isBlank() |
是否为空白 | " ".isBlank() → true |
contains() |
是否包含 | "Hello".contains("ell") → true |
startsWith() |
是否以...开头 | "Hello".startsWith("He") → true |
endsWith() |
是否以...结尾 | "Hello".endsWith("lo") → true |
示例:长度与判断
JAVA
public class StringCheck {
public static void main(String[] args) {
String s = "Hello, World!";
System.out.println("长度:" + s.length()); // 13
System.out.println("包含World:" + s.contains("World")); // true
System.out.println("以Hello开头:" + s.startsWith("Hello")); // true
System.out.println("以!结尾:" + s.endsWith("!")); // true
}
}
查找
| 方法 | 说明 | 示例 |
|---|---|---|
indexOf() |
首次出现位置 | "Hello".indexOf("l") → 2 |
lastIndexOf() |
最后出现位置 | "Hello".lastIndexOf("l") → 3 |
charAt() |
指定位置字符 | "Hello".charAt(1) → 'e' |
示例:查找
JAVA
public class StringSearch {
public static void main(String[] args) {
String s = "Hello, World!";
System.out.println("indexOf('l'):" + s.indexOf('l')); // 2
System.out.println("lastIndexOf('l'):" + s.lastIndexOf('l')); // 10
System.out.println("charAt(0):" + s.charAt(0)); // H
}
}
截取
| 方法 | 说明 | 示例 |
|---|---|---|
substring(int begin) |
从begin到末尾 | "Hello".substring(2) → "llo" |
substring(int begin, int end) |
begin到end(不含end) | "Hello".substring(1,4) → "ell" |
示例:截取
JAVA
public class StringSubstring {
public static void main(String[] args) {
String s = "Hello, World!";
System.out.println(s.substring(7)); // World!
System.out.println(s.substring(0, 5)); // Hello
}
}
转换
| 方法 | 说明 | 示例 |
|---|---|---|
toUpperCase() |
转大写 | "Hello".toUpperCase() → "HELLO" |
toLowerCase() |
转小写 | "Hello".toLowerCase() → "hello" |
trim() |
去除首尾空格 | " Hi ".trim() → "Hi" |
strip() |
去除首尾空格(更强) | " Hi ".strip() → "Hi" |
替换
| 方法 | 说明 | 示例 |
|---|---|---|
replace() |
替换所有 | "Hello".replace("l","L") → "HeLLo" |
replaceAll() |
正则替换 | "a1b2c".replaceAll("\\d","") → "abc" |
replaceFirst() |
替换第一个 | "a1b1".replaceFirst("1","X") → "aXb1" |
分割与连接
| 方法 | 说明 | 示例 |
|---|---|---|
split() |
分割字符串 | "a,b,c".split(",") → ["a","b","c"] |
join() |
连接字符串 | String.join("-","a","b") → "a-b" |
concat() |
连接 | "Hello".concat(" World") → "Hello World" |
示例:分割与连接
JAVA
public class StringSplitJoin {
public static void main(String[] args) {
// 分割
String csv = "Alice,Bob,Charlie";
String[] names = csv.split(",");
for (String name : names) {
System.out.println(name);
}
// 连接
String joined = String.join(" | ", names);
System.out.println(joined); // Alice | Bob | Charlie
}
}
字符串比较
== vs equals
JAVA
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true(同一对象)
System.out.println(s1 == s3); // false(不同对象)
System.out.println(s1.equals(s3)); // true(内容相同)
⚠️ 重要: 字符串比较必须用
equals(),不能用==。==比较的是地址,equals()比较的是内容。
compareTo()
按字典顺序比较字符串。
JAVA
String a = "apple";
String b = "banana";
System.out.println(a.compareTo(b)); // 负数(a在b前面)
System.out.println(b.compareTo(a)); // 正数(b在a后面)
System.out.println(a.compareTo(a)); // 0(相等)
equalsIgnoreCase()
忽略大小写比较。
JAVA
String s1 = "Hello";
String s2 = "hello";
System.out.println(s1.equals(s2)); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true
格式化
String.format()
JAVA
String name = "Alice";
int age = 25;
double score = 95.5;
String info = String.format("姓名:%s,年龄:%d,分数:%.1f", name, age, score);
System.out.println(info); // 姓名:Alice,年龄:25,分数:95.5
格式化占位符
| 占位符 | 说明 | 示例 |
|---|---|---|
%s |
字符串 | %s → "Hello" |
%d |
整数 | %d → 42 |
%f |
浮点数 | %.2f → 3.14 |
%n |
换行 | — |
字符串与数组
JAVA
// 字符串 → 字符数组
String s = "Hello";
char[] chars = s.toCharArray();
// 字符数组 → 字符串
String s2 = new String(chars);
// 字符串 → 字节数组
byte[] bytes = s.getBytes();
// 字节数组 → 字符串
String s3 = new String(bytes);
StringBuilder
当需要频繁修改字符串时,使用StringBuilder更高效。
JAVA
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
💡 建议: 单次拼接用
+即可,多次拼接用StringBuilder。
❓ 常见问题
Q String、StringBuilder、StringBuffer怎么选?
A String不可变,适合少量操作。StringBuilder可变,单线程用。StringBuffer可变,多线程安全。
Q 为什么字符串比较要用equals?
A 因为
==比较的是对象地址,equals()比较的是内容。Q substring会创建新对象吗?
A 会。substring返回新的String对象。
📖 小节
- String是不可变的,每次修改都会创建新对象
- 创建推荐用字面量方式
- 字符串比较必须用equals()
- 常用方法:length/charAt/substring/equals/indexOf/trim/replace/split
- 频繁修改用StringBuilder
📝 作业
- 字符串操作: 统计字符串中某个字符出现的次数
- 字符串反转: 编写方法反转字符串
- 单词计数: 统计字符串中的单词数量(以空格分隔)
下一课
下一课我们将学习 StringBuilder,了解可变字符串的使用。



