Java字符串全解:从String到StringTokenizer,期末复习与实战指南

发布时间:2026/6/19 12:49:49
Java字符串全解:从String到StringTokenizer,期末复习与实战指南
9.1 字符串概述在Java编程中字符串String是使用最频繁的数据类型之一它代表一个不可变的字符序列。本章将系统性地梳理Java字符串相关的核心类String、StringBuilder、StringBuffer以及一个较老的字符串分割工具StringTokenizer。理解它们的特性和适用场景不仅是期末考试的重要考点更是日后项目开发的实操基础。学习目标掌握String的创建、不可变性及其影响。理解StringBuilder和StringBuffer的可变性及适用场景。学会使用StringTokenizer进行字符串分割。能够根据实际需求如性能、线程安全选择合适的字符串类。9.2 String创建使用String类是java.lang包下的核心类用于创建和操作不可变的字符串。9.2.1 创建String对象的两种方式创建String对象主要有两种方式直接赋值和使用new关键字。1. 直接赋值Strings1Hello;Strings2Hello;运行输出分析s1 s2的结果为true。这是因为字符串字面量Hello被存储在字符串常量池中。s1和s2指向的是常量池中的同一个对象所以引用地址相同。2. 使用new关键字Strings3newString(Hello);Strings4newString(Hello);运行输出分析s3 s4的结果为false。new关键字会在堆内存中创建一个新的String对象即使内容相同s3和s4也是两个不同的对象引用地址不同。s3.equals(s4)的结果为true因为equals方法比较的是字符串的内容。9.2.2 String类的常用方法String提供了丰富的方法来操作字符串以下是一些核心方法及其测试代码publicclassStringDemo{publicstaticvoidmain(String[]args){Stringstr Java Programming ;// 1. 获取长度System.out.println(长度: str.length());// 输出: 长度: 20// 2. 去除首尾空格Stringtrimmedstr.trim();System.out.println(去除空格后: \trimmed\);// 输出: 去除空格后: Java Programming// 3. 获取子字符串Stringsubstr.substring(5,16);// 索引从0开始[5,16)System.out.println(子串: sub);// 输出: 子串: Programming// 4. 查找字符/字符串位置intindexstr.indexOf(Pro);System.out.println(\Pro\的索引: index);// 输出: Pro的索引: 7// 5. 字符串替换Stringreplacedstr.replace(Java,Python);System.out.println(替换后: replaced);// 输出: 替换后: Python Programming// 6. 大小写转换System.out.println(大写: str.toUpperCase());// 输出: 大写: JAVA PROGRAMMINGSystem.out.println(小写: str.toLowerCase());// 输出: 小写: java programming// 7. 分割字符串StringcsvApple,Banana,Orange;String[]fruitscsv.split(,);System.out.println(分割后第一个水果: fruits[0]);// 输出: 分割后第一个水果: Apple}}考点提示牢记substring是前闭后开区间[beginIndex, endIndex)indexOf找不到返回-1。9.3 StringBuilder创建使用StringBuilder代表一个可变的字符序列。当需要频繁修改字符串内容如拼接、插入、删除时使用StringBuilder比String性能高得多因为它避免了创建大量临时String对象。9.3.1 创建与基本使用publicclassStringBuilderDemo{publicstaticvoidmain(String[]args){// 1. 创建StringBuildersb1newStringBuilder();// 默认容量16StringBuildersb2newStringBuilder(Hello);// 指定初始内容StringBuildersb3newStringBuilder(50);// 指定初始容量// 2. 追加内容sb1.append(Java);sb1.append( );sb1.append(17);// 可以追加任何类型自动转为字符串System.out.println(追加后: sb1.toString());// 输出: 追加后: Java 17// 3. 插入内容sb2.insert(5, World);System.out.println(插入后: sb2);// 输出: 插入后: Hello World// 4. 删除内容sb2.delete(5,11);// 删除[5,11)位置的字符System.out.println(删除后: sb2);// 输出: 删除后: Hello// 5. 替换内容sb2.replace(0,5,Hi);System.out.println(替换后: sb2);// 输出: 替换后: Hi// 6. 反转字符串sb2.reverse();System.out.println(反转后: sb2);// 输出: 反转后: iH}}实操重点在单线程环境下进行大量字符串修改操作StringBuilder是首选。9.4 StringBufferStringBuffer与StringBuilder在功能上几乎完全相同都代表可变的字符序列。它们的关键区别在于线程安全性。9.4.1 核心特性与使用StringBuffer的方法是同步的synchronized因此是线程安全的。这意味着多个线程可以安全地同时操作同一个StringBuffer对象。而StringBuilder的方法是非同步的线程不安全但在单线程环境下性能更高。publicclassStringBufferDemo{publicstaticvoidmain(String[]args){StringBuffersbfnewStringBuffer(ThreadSafe);// 方法与StringBuilder类似sbf.append( Buffer);System.out.println(sbf);// 输出: ThreadSafe Buffersbf.insert(10,-);System.out.println(sbf);// 输出: ThreadSafe- Buffer}}考点与选择策略考点StringBuffervsStringBuilder的核心区别是线程安全性。实操绝大多数现代应用都是单线程操作字符串因此优先使用StringBuilder。只有在明确涉及多线程共享并修改同一个字符串对象时才考虑使用StringBuffer。9.5 StringTokenizerStringTokenizer是一个用于分割字符串的遗留类Legacy Class位于java.util包。虽然现在更推荐使用String的split()方法或正则表达式但理解它仍有必要尤其是在处理一些简单分隔符或考试中。9.5.1 基本用法importjava.util.StringTokenizer;publicclassStringTokenizerDemo{publicstaticvoidmain(String[]args){StringdataJava,Python,JavaScript,C;// 默认分隔符为空格、制表符、换行符等// 此处指定逗号为分隔符StringTokenizerstnewStringTokenizer(data,,);System.out.println(令牌数量: st.countTokens());// 输出: 令牌数量: 4// 遍历所有令牌while(st.hasMoreTokens()){System.out.println(st.nextToken());}// 输出:// Java// Python// JavaScript// C}}9.5.2 StringTokenizer vs String.split()特性StringTokenizerString.split() (基于正则表达式)所属包java.util(遗留类)java.lang.String功能仅按分隔符拆分按正则表达式拆分功能强大空令牌处理默认忽略空字符串默认保留空字符串除非使用限定符性能对于简单分隔符性能稍好正则表达式编译有开销但功能更灵活推荐度不推荐在新代码中使用推荐使用功能全面API现代实操建议除非在处理性能极其敏感且分隔规则极其简单的场景否则一律使用String.split()或java.util.regex.Pattern。对比与总结对比表格1String直接赋值 vs new String()对比项直接赋值 (String s “abc”)new String(“abc”)内存区域字符串常量池堆内存对象数量常量池中只有一个对象所有相同字面量共享每次new都会在堆中创建一个新对象比较相同字面量比较为true即使内容相同比较也为false适用场景推荐节省内存需要明确创建独立对象时对比表格2三大字符串类核心差异特性StringStringBuilderStringBuffer可变性不可变 (Immutable)可变 (Mutable)可变 (Mutable)线程安全是因为不可变否是(方法同步)性能修改性能差创建新对象高(单线程)较低因同步开销使用场景存储不变字符串、作为键单线程下频繁修改字符串多线程下共享修改字符串诞生版本Java 1.0Java 5Java 1.0易错考点整理1. 常量池陷阱Strings1Hello;Strings2Hello;Strings3newString(Hello);Strings4s3.intern();// 将s3指向的对象放入常量池并返回常量池引用System.out.println(s1s2);// trueSystem.out.println(s1s3);// falseSystem.out.println(s1s4);// true (intern后)考点理解比较引用equals比较内容。intern()方法可以主动将字符串对象放入常量池。2. 循环拼接性能问题错误示范性能极差Stringresult;for(inti0;i10000;i){resulti;// 每次循环都创建新的String对象和StringBuilder对象}正确做法使用StringBuilderStringBuildersbnewStringBuilder();for(inti0;i10000;i){sb.append(i);}Stringresultsb.toString();3. 线程安全问题String线程安全不可变。StringBuilder非线程安全。多线程操作同一对象需自行加锁。StringBuffer线程安全内部同步但性能有损耗。复习思考题基础概念String类的不可变性指的是什么这种设计带来了哪些优点和缺点代码分析以下代码会创建几个String对象Strings1abc;Strings2newString(abc);Strings3s2.intern();性能选择在一个单线程的Web服务器中需要动态生成一个很长的HTML字符串应该选择String、StringBuilder还是StringBuffer为什么方法辨析String的split()方法和StringTokenizer在分割字符串“a,b,c”以逗号分隔时输出结果有何不同实战应用如何判断一个字符串是否为回文字符串正读反读都一样请用StringBuilder或StringBuffer实现。本文涵盖了Java字符串章节的核心知识点、代码示例与易错点适合作为期末复习笔记。建议读者亲手运行所有示例代码并结合思考题进行巩固祝大家考试顺利