Java String 类
字符串是程序中最常打交道的数据类型。Java 用 String 类表示字符串,它不可变、可共享,并提供大量现成方法。掌握 String 的特性与常用 API,是写出干净代码的基本功。
创建方式与不可变性
两种常见创建方式(片段需放进 main 方法中运行):
String s1 = "hello"; // 方式一:字面量
String s2 = new String("hello"); // 方式二:new 构造
char[] cs = {'j','a','v','a'};
String s3 = new String(cs); // 方式三:由字符数组构造
String 是不可变(immutable)对象:内容一旦创建就不能修改,任何"修改"操作实际都会生成一个新字符串。这种设计让字符串可以被安全共享,也便于缓存哈希值。
字符串池
用字面量创建时,JVM 会先查字符串池(常量池):已存在就直接复用,不存在才新建;而 new 每次都新建对象。
// 片段需放进 main 方法中运行
String a = "java";
String b = "java"; // 字面量:直接复用池中对象
String c = new String("java"); // new:必定新建对象
System.out.println(a == b); // 输出:true(指向同一对象)
System.out.println(a == c); // 输出:false(两个不同对象)
equals 与 == 的区别
==比较两个引用是否指向同一个对象(即地址是否相同)。equals比较内容是否相同,String 已重写该方法。
// 片段需放进 main 方法中运行
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // 输出:false,不是同一对象
System.out.println(s1.equals(s2)); // 输出:true,内容相同
System.out.println(s1.equalsIgnoreCase("ABC")); // 输出:true,忽略大小写
判断字符串内容是否相等,一律用 equals(忽略大小写用 equalsIgnoreCase),不要用 ==。
常用方法表
| 方法 | 作用与示例 |
|---|---|
| length() | 长度:"abc".length() → 3 |
| charAt(i) | 取第 i 个字符:"abc".charAt(1) → 'b' |
| substring(a, b) | 截取 [a, b) 子串:"hello".substring(1, 3) → "el" |
| indexOf(s) / lastIndexOf(s) | 首次 / 末次出现下标:"hello".indexOf("l") → 2 |
| contains(s) | 是否包含子串:"hello".contains("ell") → true |
| startsWith(s) / endsWith(s) | 是否以…开头 / 结尾:"hello".endsWith("lo") → true |
| replace(a, b) | 替换所有:"a-b-c".replace("-", "+") → "a+b+c" |
| split(regex) | 按规则拆成数组:"a,b".split(",") → ["a", "b"] |
| toUpperCase() / toLowerCase() | 大小写转换:"Ab".toLowerCase() → "ab" |
| trim() | 去掉首尾空白:" a ".trim() → "a" |
| equals(s) | 内容相等判断:"abc".equals("abc") → true |
| compareTo(s) | 按字典序比较:"abc".compareTo("abd") → -1 |
| concat(s) | 末尾拼接:"ab".concat("cd") → "abcd" |
| join(sep, parts...) | 静态方法,连接多个串:String.join("-", "a", "b") → "a-b" |
字符串格式化 format
需要把多个值拼成规整文本时,String.format 比 + 拼接更清晰,%s 表示字符串、%d 表示整数、%f 表示小数。
// 片段需放进 main 方法中运行
String msg = String.format("%s 今年 %d 岁,身高 %.1f 米", "小明", 12, 1.45);
System.out.println(msg); // 输出:小明 今年 12 岁,身高 1.4 米
与其他类型互转
借助包装类或 toCharArray,String 可与其他类型方便地互转。
// 片段需放进 main 方法中运行
int n = Integer.parseInt("42"); // String → int
String s = String.valueOf(42); // int → String
double d = Double.parseDouble("3.14"); // String → double
char[] cs = "java".toCharArray(); // String → char[]
String back = new String(cs); // char[] → String
System.out.println(n + d + " " + back); // 输出:45.14 java
小结:String 不可变,比较内容用 equals 而不用 ==;创建时优先用字面量以复用字符串池。方法很多不必死记,会用查表姿势即可——字符串处理是日常开发的高频操作。