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对象。

📖 小节

📝 作业

  1. 字符串操作: 统计字符串中某个字符出现的次数
  2. 字符串反转: 编写方法反转字符串
  3. 单词计数: 统计字符串中的单词数量(以空格分隔)

下一课

下一课我们将学习 StringBuilder,了解可变字符串的使用。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏