1. 综合练习
题目 1 :金额转换为中文大写格式
请编写一个 Java 程序,实现将数字金额转换为中文大写格式(带单位)的功能,具体要求如下:
(1) 程序接收用户输入的一个整数金额(范围:0-9999999),如果输入金额超出范围,提示 "金额无效" 并要求重新输入
(2) 转换规则:
- 将数字转换为中文大写形式(零、壹、贰... 玖)
- 为每一位数字添加对应的单位,单位顺序为:["佰","拾","万","仟","佰","拾","元"]
- 不足 7 位的金额需要在高位补 "零",确保总长度为 7 位(例如 123 应补为 7 位:零零零零壹贰叁)
(3) 输出最终的中文大写金额字符串,示例如下:
输入:123
输出:零佰零拾零万零仟壹佰贰拾叁元
输入:1000000
输出:壹佰零拾零万零仟零佰零拾零元
public class test8 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int money;while (true) {System.out.println("请录入一个金额");money = sc.nextInt(); //不太理解,作用域问题if (money >= 0 && money <= 9999999){break;} else{System.out.println("金额无效");}}String moneyStr = "";while (money != 0 ){int ge = money % 10;String capitalNumber = getCapitalNumber(ge);moneyStr = capitalNumber + moneyStr; //不太理解money = money / 10;}int count = 7 - moneyStr.length();for (int i = 0; i < count; i++) {moneyStr = "零" + moneyStr; //不太理解}String[] arr = {"佰","拾","万","仟","佰","拾","元"};String result = "";for (int i = 0; i < moneyStr.length(); i++) {char c = moneyStr.charAt(i);result = result + c + arr[i];}System.out.println(result);}public static String getCapitalNumber(int number){String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};return arr[number];}
}
关键逻辑:
① moneyStr = capitalNumber + moneyStr;
这种拼接方式相当于每次把新取到的高位数字放在前面,最终得到正确的顺序(从高位到低位)。
- 这行代码的作用是将数字的大写形式按正确顺序拼接,解决了原代码中顺序颠倒的问题,举例说明:假设输入金额是
123
- 第一次循环:取到个位
3
,capitalNumber
是 "叁",moneyStr
变为 "叁" - 第二次循环:取到十位
2
,capitalNumber
是 "贰",moneyStr
变为 "贰" + "叁" = "贰叁" - 第三次循环:取到百位
1
,capitalNumber
是 "壹",moneyStr
变为 "壹" + "贰叁" = "壹贰叁"
② 变量的作用域:
int money;
while (true) {System.out.println("请录入一个金额");money = sc.nextInt(); //不太理解,作用域问题if (money >= 0 && money <= 9999999){break;} else{System.out.println("金额无效");}
}
- 在 Java 中,在循环内部声明的变量(如
int money = ...
),其作用域仅限于这个循环内部。 - 当循环结束后,这个变量就会被销毁,循环外部的代码(如后续的数字转大写逻辑)无法再使用它,因此会出现
找不到符号"money"
的编译错误。
(2) 题目:手机号中间四位脱敏
请编写一个 Java 程序,实现对手机号的中间四位进行脱敏处理(替换为 * ),具体要求如下:
(1) 定义一个 11 位的手机号字符串(例如:"13528834382")。
(2) 截取手机号的前 3 位和后 4 位。
(3) 将前 3 位 + "****" + 后 4 位拼接,得到脱敏后的手机号。
(4) 输出脱敏结果。
示例:
输入(程序中定义):"13500004382"
输出:"135****4382"
public class test9 {public static void main(String[] args) {String phoneNumber = "13528834382";String start = phoneNumber.substring(0,3);String end = phoneNumber.substring(7); //不太理解String result = start + "****" + end;System.out.println(result);}
}
关键逻辑:
① substring(int beginIndex, int endIndex)
(1) 作用:截取从 beginIndex
(包含)到 endIndex
(不包含)之间的子串,返回新字符串。
(2) 参数说明:
beginIndex
:起始索引(包含此位置的字符)endIndex
:结束索引(不包含此位置的字符),即截取范围是[beginIndex, endIndex)
② substring(int beginIndex)
- 作用:从字符串的
beginIndex
(起始索引)位置开始,截取到字符串的末尾,返回一个新的子串。
2. StringBuilder
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回字符串长度 |
public String toString() | 通过 toString 可以把 StringBuilder 转化成 String |
(1) 综合练习
编程题目:判断字符串是否为对称字符串
题目描述:
请编写一个 Java 程序,实现判断用户输入的字符串是否为对称字符串(即回文串)。对称字符串是指从左到右读和从右到左读完全相同的字符串,例如 "abcba"、"aaa" 是对称字符串,而 "abc"、"abbaa" 不是对称字符串。
要求:
- 程序需通过键盘接收用户输入的一个字符串(假设输入不包含空格)
- 使用字符串反转的方式判断该字符串是否为对称字符串
- 输出判断结果,格式为:"当前字符串是对称字符串" 或 "当前字符串不是对称字符串"
public class test2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();String result = new StringBuilder().append(str).reverse().toString(); //不太理解if (str.equals(result)) {System.out.println("当前字符串是对称字符串");} else{System.out.println("当前字符串不是对称字符串");}}
}
① reverse()
方法
定义:
StringBuilder
和StringBuffer
中的reverse()
是无参数方法(方法声明为public StringBuilder reverse()
)结论:括号里不能添加任何参数,否则会编译错误
② toString()
方法
大多数情况下:
toString()
也是无参数方法(例如StringBuilder
、Object
类中的定义都是public String toString()
),此时括号里不能加参数。
3. Stringjoiner
构造方法2+成员方法3:
方法名 | 说明 |
---|---|
public StringJoiner(间隔符号) | 创建一个 StringJoiner 对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个 StringJoiner 对象,指定拼接时的间隔符号、开始符号、结束符号 |
public StringJoiner add(添加的内容) | 添加数据,并返回对象本身,支持链式调用 |
public int length() | 返回拼接后最终字符串的长度(字符出现的个数) |
public String toString() | 返回拼接形成的最终字符串 |
4. 字符串原理
(1) 内存原理
直接赋值会复用字符串常量池中的·
new出来不会复用,而是开辟一个新的空间
(2) 字符串拼接原理
拼接无变量 ,编译后就是拼接后的结果,会复用串池里的字符串
拼接有变量 , 每一行拼接的代码,都会在内存中创建心得字符串,浪费空间资源