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 而不用 ==;创建时优先用字面量以复用字符串池。方法很多不必死记,会用查表姿势即可——字符串处理是日常开发的高频操作。

笔记加载中…