Java字符串操作实战指南
实验项目二 基于字符串的专项实验
一、实验目的
1、掌握字符串的多种创建方式,理解不同创建方式在内存中的存储差异;
2、熟练运用字符串的常见方法(如截取、查找、替换等),掌握字符串操作的核心技巧;
3、深入理解字符串的底层实现原理(如不可变性、常量池等),提升代码优化能力。
二、实验内容与步骤
2.1 验证性实验
1、调试下面的程序,分析程序的功能和运行结果并添加代码注释。
import java.util.Scanner; public class LetterCount { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一个字符串:"); String str = scanner.nextLine(); int count = 0; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (Character.isLetter(c)) { // 判断是否为字母 count++; } } System.out.println("字符串中字母的个数为:" + count); scanner.close(); } } |
2、调试下面的程序,并分析程序的功能和运行结果并添加代码注释。
public class EmailHandler { public static void main(String[] args) { String email = "zhangmj@zparkhr.com"; int atIndex = email.indexOf('@'); if (atIndex != -1) { String username = email.substring(0, atIndex); System.out.println("邮箱用户名:" + username); } else { System.out.println("邮箱格式错误,无@符号"); }
boolean hasAt = email.contains("@"); boolean hasDot = email.contains("."); int lastDotIndex = email.lastIndexOf('.'); boolean isDotAfterAt = hasAt && hasDot && (lastDotIndex > atIndex);
if (hasAt && hasDot && isDotAfterAt) { System.out.println("邮箱格式合法"); } else { System.out.println("邮箱格式不合法"); } } } |
3、调试下面的程序,并分析程序的功能和运行结果并添加代码注释。
import java.util.Random; public class RandomCharPicker { public static void main(String[] args) { String source = "ABCDEFGhijklmn1234567"; Random random = new Random(); StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) { // 生成0到字符串长度-1的随机索引 int index = random.nextInt(source.length()); char c = source.charAt(index); sb.append(c); // 拼接字符 }
System.out.println("随机拼接的字符串:" + sb.toString()); } } |
4、调试下面的程序,并分析程序的功能和运行结果并添加代码注释。
import java.util.Scanner; public class StringReverse { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一个字符串:"); String str = scanner.nextLine(); StringBuilder sb = new StringBuilder(str); String reversedStr = sb.reverse().toString(); // 利用StringBuilder的reverse方法 System.out.println("反转后的字符串:" + reversedStr); scanner.close(); } } |
5、调试下面的程序,并分析程序的功能和运行结果并添加代码注释。
public class DigitCount { public static void main(String[] args) { String digitStr = "1239586838923173478943890234092"; int[] counts = new int[10]; // 索引0-9对应数字0-9的次数 or (int i = 0; i < digitStr.length(); i++) { char c = digitStr.charAt(i); int digit = c - '0'; counts[digit]++; }
for (int i = 0; i < counts.length; i++) { System.out.println("数字" + i + "出现的次数:" + counts[i]); } } } |
6、调试下面的程序,并分析程序的功能和运行结果并添加代码注释。
import java.util.Scanner; public class CharReplace { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入字符串:"); String str = scanner.nextLine(); System.out.print("请输入要替换的字符:"); char oldChar = scanner.next().charAt(0); System.out.print("请输入替换后的字符:"); char newChar = scanner.next().charAt(0);
StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == oldChar) { sb.append(newChar); } else { sb.append(c); } }
System.out.println("替换后的字符串:" + sb.toString()); scanner.close(); } } |
2.2 自主设计性实验
7、编程字符串中单词个数统计。要求:输入一个英文句子(单词之间用空格分隔,标点符号与单词相连,如 “Hello, world! This is a test.”),统计句子中单词的个数(忽略标点符号,仅以空格分隔判断单词)。
提示:可先去除字符串中的标点符号,再以空格分割字符串,统计非空元素的个数。
Scanner输入中 nextLine() 方法可以接受输入空格!
8、编程实现手机号格式校验与处理。要求:设计程序实现手机号的格式校验,规则如下:
(1)长度为 11 位;
(2)以 1 开头;
(3)第二位为 3、4、5、7、8 中的一个。
校验通过后,将号码中间 4 位替换为 “xxxx”(如 “13812345678” 处理为 “138xxx5678”)。
9、编程实现字符串中最长连续相同字符统计。要求:输入一个字符串,找出其中最长的连续相同字符及其长度。例如,字符串 “aabbbccddddd” 中,最长连续字符为 “d”,长度为 5。
10、编程实现两个字符串的公共前缀查找。要求:输入两个字符串,查找它们的最长公共前缀。例如,“flower” 和 “flow” 的公共前缀为 “flow”;“dog” 和 “racecar” 的公共前缀为 “”(空字符串)。
11、编程实现密码强度检测。要求:设计程序检测密码强度,规则如下:
(1)长度≥8 位;
(2)包含大小写字母、数字、特殊符号(如!@#$%)中的至少三种;
满足以上条件为 “强密码”,仅满足(1)为 “中密码”,否则为 “弱密码”。输入密码后,输出对应的强度等级。
12、编程实现字符串编码转换。要求:实现字符串的简单编码转换,规则为:将每个字符的 ASCII 值加 3 后转换为新字符(如 'a'→'d','5'→'8'),编码后的字符串需保留原字符串的长度和格式。编写解码方法,将编码后的字符串还原为原字符串。
三、实验设备(材料)
3.1 计算机设备
操作系统:建议使用 Windows或 macOS 等主流操作系统,确保系统稳定且已安装 Java 开发环境(JDK),JDK 版本建议为Java8、Java 17 或Java 21。
处理器:具备基本的计算处理能力,能够流畅运行 Java 程序。一般来说,普通的笔记本电脑或台式机处理器均可满足需求,如英特尔酷睿系列或 AMD 锐龙系列处理器。
内存:至少 8GB 及以上的内存,以保证在编译和运行 Java 程序时系统不会因内存不足而出现卡顿或异常。
3.2 开发工具
集成开发环境(IDE):推荐使用 IntelliJ IDEA专业的 Java 开发工具,这些 IDE 提供了代码编辑、编译、调试等功能,能够极大地提高开发效率。当然,也可以使用简单的文本编辑器(如 Notepad++、Sublime Text 等)结合命令行工具进行 Java 开发,但对开发者的要求相对较高。
Java 开发工具包(JDK):作为 Java 开发的核心工具包,包含了 Java 编译器(javac)、Java 运行时环境(JRE)等必要的工具和库。确保 JDK 已正确安装并配置好环境变量,以便在命令行或 IDE 中能够正常使用 Java 相关命令。
3.3 其他辅助工具
文档编辑器:用于记录实验过程、回答思考题等,如 Microsoft Word、WPS 文字处理软件等。
截图工具:用于截取程序代码和运行结果图。
四、实验注意事项
4.1 代码编写规范
严格遵循 Java 的命名规范,类名、方法名、变量名等应具有明确的含义,采用驼峰命名法,增强代码的可读性。例如,类名首字母大写,方法名和变量名首字母小写。
注意代码的缩进和排版,保持代码的整洁和美观。一般来说,使用 4 个空格或一个制表符进行缩进,使代码结构清晰,易于理解和维护。
合理添加注释,对关键代码、复杂逻辑或重要步骤进行详细解释,方便自己和他人阅读代码。注释可以使用单行注释(//)或多行注释(/* ... */)。
4.2 输入输出处理
在读取输入时,要注意处理可能出现的异常情况,如输入格式错误、输入数据超出范围等。可以使用异常处理机制(try-catch 语句)来捕获和处理这些异常,避免程序因输入错误而崩溃。
输出结果时,要严格按照实验要求的格式进行输出,包括换行符、空格等的使用。例如,本题要求每个名字占一行输出,务必确保输出格式正确,否则可能导致测试不通过。
4.3 编译与运行
在编译 Java 程序之前,确保代码中没有语法错误。可以使用 IDE 提供的语法检查功能或通过命令行使用javac命令进行编译。如果编译过程中出现错误,仔细阅读错误信息,定位并修正代码中的问题。
运行程序时,要注意程序的运行环境和输入数据的正确性。可以使用不同的测试用例进行测试,确保程序在各种情况下都能正常运行并得到正确的结果。
4.4 资源管理
在使用Scanner等资源时,要注意及时关闭资源,避免资源泄漏。可以在程序结束时调用scanner.close()方法关闭Scanner对象。
对于使用的其他资源(如文件、网络连接等),同样要遵循资源管理的原则,在不再使用时及时释放资源,保证程序的性能和稳定性。
4.5 实验记录与提交
在实验过程中,要认真记录实验步骤、遇到的问题及解决方法等关键信息。这些记录有助于自己回顾和总结实验过程。
实验成果提交要确保代码截图清晰、源码规范,并对实验结果进行详细的分析和总结。
五、思考题
1、字符串的==与equals方法有什么区别?为什么String类要重写equals方法?结合字符串常量池分析以下代码的输出结果:
String s1 = "abc";
String s2 = new String("abc");
String s3 = s2.intern(); // 从串池中获取字符串
System.out.println(s1 == s2);
System.out.println(s1 == s3);
- 简述String、StringBuilder和StringBuffer的区别?
- 字符串的不可变性有什么优点?在需要频繁修改字符串的场景下,如何避免因不可变性导致的性能问题?
4、分析以下代码的执行效率,说明原因并给出优化方案:
String str = "";
for (int i = 0; i < 10000; i++) {
str += i;
}