Java String 类
Java String 类学习笔记详细版一、String 类概述String是 Java 中最常用的类之一用于表示不可变的字符序列。所有字符串字面量如Hello都是String类的实例。核心特性不可变性Immutable一旦创建String对象的内容不能被修改。字符串常量池String Pool节省内存提高性能。线程安全由于不可变性天然线程安全。丰富的 API提供大量字符串操作方法。二、String 的创建方式1. 使用字符串字面量Stringstr1Hello;优先从字符串常量池中查找若存在则直接引用否则创建新对象并放入池中。2. 使用new关键字Stringstr2newString(Hello);在堆内存中创建新对象即使常量池中存在相同内容也会创建新对象。可通过intern()方法手动加入常量池。3. 使用StringBuilder或StringBuffer转换Stringstr3newStringBuilder(Hello).toString();4. 使用valueOf()方法Stringstr4String.valueOf(123);// 将其他类型转为 String三、String 的不可变性为什么不可变内部使用final char[]Java 8 及之前或final byte[]Java 9使用 Compact Strings存储字符。类本身是final不可继承。不可变性的好处线程安全多个线程可共享同一 String 对象。安全性防止字符串被篡改如数据库连接 URL、文件路径等。缓存哈希值作为HashMap的 key 时高效。字符串常量池优化节省内存。示例StringsHello;s.concat( World);// 返回新对象原 s 不变System.out.println(s);// 输出Hello四、字符串常量池String Pool工作原理当使用字面量创建字符串时JVM 先检查常量池。若存在相同内容返回引用否则创建新对象并放入池中。示例StringaHello;StringbHello;System.out.println(ab);// true引用同一对象StringcnewString(Hello);Stringdc.intern();System.out.println(cd);// falsec 在堆d 指向池中System.out.println(ad);// trued 指向池中 Hello五、常用方法详解1. 获取信息str.length();// 返回字符数str.isEmpty();// 是否为空Java 6str.isBlank();// 是否为空白Java 11str.charAt(intindex);// 获取指定索引字符str.codePointAt(intindex);// 获取 Unicode 码点2. 比较str.equals(Objectobj);// 内容比较区分大小写str.equalsIgnoreCase(Stringstr);// 忽略大小写str.compareTo(Stringstr);// 字典序比较返回差值str.compareToIgnoreCase(Stringstr);// 忽略大小写比较str.startsWith(Stringprefix);// 是否以某前缀开头str.endsWith(Stringsuffix);// 是否以某后缀结尾3. 搜索str.indexOf(intch);// 返回字符首次出现索引str.indexOf(Stringstr);// 返回子串首次出现索引str.lastIndexOf(intch);// 返回字符最后一次出现索引str.contains(CharSequences);// 是否包含子串Java 1.5str.matches(Stringregex);// 是否匹配正则表达式4. 截取与分割str.substring(intbeginIndex);str.substring(intbeginIndex,intendIndex);str.split(Stringregex);// 按正则分割str.split(Stringregex,intlimit);// 限制分割次数5. 替换与转换str.replace(charoldChar,charnewChar);// 替换字符str.replace(CharSequencetarget,CharSequencereplacement);// 替换子串str.replaceAll(Stringregex,Stringreplacement);// 正则替换str.replaceFirst(Stringregex,Stringreplacement);// 首次正则替换str.toLowerCase();// 转小写str.toUpperCase();// 转大写str.trim();// 去除首尾空格Java 11 可用 strip()str.strip();// 去除首尾空白Java 11支持 Unicode 空白str.stripLeading();// 去除前导空白str.stripTrailing();// 去除尾部空白6. 拼接str.concat(Stringstr);// 拼接字符串String.join(CharSequencedelim,CharSequence...elements);// Java 8 拼接7. 其他实用方法str.repeat(intcount);// 重复字符串Java 11str.chars();// 返回 IntStreamJava 8str.codePoints();// 返回 IntStream支持 Unicode六、String vs StringBuilder vs StringBuffer特性StringStringBuilderStringBuffer可变性不可变可变可变线程安全是否是性能低频繁拼接高中同步开销使用场景常量、少量操作单线程频繁修改多线程频繁修改示例// 不推荐每次拼接都创建新对象Strings;for(inti0;i1000;i){si;}// 推荐使用 StringBuilderStringBuildersbnewStringBuilder();for(inti0;i1000;i){sb.append(i);}Stringresultsb.toString();七、常见陷阱与最佳实践1. 避免在循环中使用拼接字符串使用StringBuilder替代。2. 比较字符串内容用equals()而非StringanewString(Hello);StringbnewString(Hello);System.out.println(ab);// false引用不同System.out.println(a.equals(b));// true内容相同3. 注意null值Stringstrnull;// str.equals(test); // 抛出 NullPointerExceptiontest.equals(str);// 安全4. 正则表达式性能避免在循环中频繁编译正则可缓存Pattern对象。5. 使用intern()需谨慎可能增加常量池负担仅在需要共享字符串时使用。八、Java 9 新特性1. Compact Strings使用byte[]替代char[]节省内存Latin-1 字符集。2. 新方法isBlank()判断是否为空白Java 11。strip()Unicode 感知的去空格Java 11。repeat(int count)重复字符串Java 11。lines()按行分割Java 11。formatted()格式化字符串Java 15类似printf。示例Stringtext Hello World ;System.out.println(text.strip());// Hello WorldStringrepeatedHa.repeat(3);// HaHaHaStringformattedString.format(Name: %s, Age: %d,Alice,25);// 或 Java 15Stringformatted2Name: %s, Age: %d.formatted(Alice,25);九、性能优化建议优先使用字符串字面量利用常量池。大量拼接用StringBuilder避免频繁创建对象。缓存正则表达式避免重复编译。避免不必要的toString()如Integer.toString(123)可直接用123。使用String.join()替代循环拼接Java 8 更简洁高效。十、总结String是 Java 中不可变、线程安全的字符串类。理解字符串常量池对内存优化至关重要。根据场景选择String、StringBuilder或StringBuffer。掌握常用方法可高效处理字符串。注意常见陷阱如比较、null处理、正则性能。通过深入理解String类的特性与最佳实践可以编写出更高效、安全的 Java 代码。