目录
一、 字符串在开发中的应用场景
字符串或串(String)是由数字、字母、下划线组成的一串字符。它是编程语言中表示文本的数据类型。在程序设计中,字符串为符号或数值的一个连续序列。字符串操作就是以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。
比较功能:登录界面的用户名和密码就是字符串;输入的用户名和密码和正确的用户名和密码进行比较 。 | ||
替换功能: 对于聊天框敏感词的替换。 | ||
转换功能: 转账金额输入后数据自动转换成人命币大写。 |
二、 String
1. String概述
java.lang.String类代表字符串,java程序中的所有字符串文字(例如"abc")都为此类对象。
注意:字符串的内容不会发生改变,它的对象在创建后不能被更改。
String name = "小明"; String schoolName = "家里蹲"; System.out.println(name + schoolName);
字符串拼接产生一个新的字符串。
这里的拼接最终会有三个字符串。
2. 创建String对象的两种方式
1. 直接赋值
public class stringDemo{
public static void main(String[] args){
String s1 = "abc";
String s2 = "abc";
}
}
Java内存模型:
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
不存在: 创建新的 ; 存在: 复用
2. new关键字
结合不同的构造方法:
构造方法 | 说明 |
public String ( ) | 创建空白字符串,不包含任何内容 |
public String ( String original) | 根据传入的字符串,创建字符串对象 |
public String ( char[ ] chs) | 根据字符数组,创建字符串对象 |
public String ( byte[ ] chs) | 根据字节数组,创建字符串对象 |
public class newDemo{
public static void main(String[] args){
char[] arr = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
}
}
Java内存模型:
3. 练习
public static void main(String[] args) {
// 1.使用直接赋值的方式获取一个字符串对象
String s1 = "abc";
System.out.println(s1);
// 2.使用new的方式来获取一个字符串对象
// 空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("@" + s2 + "@");
//3.传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
String s3 = new String("abc");
System.out.println(s3);
//4.创建一个字符数组,根据字符数组的内容再创建一个新的字符对象
//需求:我要修改字符串内容
//abc --> {'a','b','c','d'} -->{'q','c','d'} -->qcd
char[] chs = {'a','b','c','d'};
String s4 = new String(chs);
System.out.println(s4);
//5.传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
//应用场景:在网网络中传输的数据其实就是字节信息
//我们可以把字节信息进行转换成字符串
byte[] bytes = {97,98,99,100};
String s5 = new String(bytes);
System.out.println(s5);
}
运算结果:
三、Java在String中常用方法
1. == 号比较变量地址
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
String s1 = "aaa";
String s2 = "bbb";
System.out.println(s1 == s2); //false
String s1 = new String("abc")
String s2 = "abc";
System.out.println(s1 == s2); //????
根据上面结果, 此时,我们要了解 == 号比较的到底是什么?
基本数据类型 引用数据类型 具体的数据值 变量记录的地址值 所以,
String s1 = new String("abc") ; 记录的是堆里面的地址值
String s2 = "abc"; 记录的是串池中的地址值
System.out.println(s1 == s2); //false
2. 字符串比较内容
boolean equals方法(要比较的字符串) |
|
boolean equalsgnoreCase(要比较的字符串) |
public static void main(String[] args) {
//1.创建两个字符串对象
String s1 = new String("abc");
String s2 ="abc";
String s3 = "Abc";
//2. == 比较
System.out.println(s1 == s2); //false
//3.比较字符串对象中的内容
boolean result1 = s1.equals(s2);
System.out.println(result1); // true
boolean result2 = s1.equals(s3);
System.out.println(result2); //false
}
3. 字符串遍历内容
public char charAt( int index ) | 根据索引返回字符 |
public int length ( ) | 返回字符串的长度 |
数组的长度:数组名.length | |
字符串的长度:字符串对象.length() |
4. 字符串其他内容
String substring (int beginindex , int endindex ) 截取 | 注意:包头不包尾,包左不包右;只有返回值才是截取的小串 |
String subString( int beginindex) | 截取到末尾 |
String replace(旧值 , 新值) 替换 | 注意:只有返回值才是替换之后的结果 |
四、练习
1. 用户登录
需求:已知正确的用户名和密码,请用程序实现模拟用户登录。
总共给三次机会,登录之后,给出相应的提示。
public static void main(String[] args) {
// 1.定义两个变量记录正确的用户名和密码
String rightUserName = "zhangsan";
String rightPassword = "123456";
// 2.键盘录入用户名和密码
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入您的用户名:");
String userName = sc.next();
System.out.println("请输入您的密码:");
String password = sc.next();
// 3.比较
if ((userName.equals(rightUserName)) && (password.equals(rightPassword))) {
System.out.println("用户登录成功!");
break;
} else {
if (i == 2) {
// 最后一次也输入错误
System.out.println("账户" + userName
+ "被锁定!您无法再进行登录!");
} else {
System.out.println("用户名或者密码输入错误!您还有"
+ (2 - i) + "次机会");
}
}
}
}
运行结果:
2. 统计字符次数
需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
public static void main(String[] args) {
// 1. 键盘录入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next();
// 2.统计
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for (int i = 0; i < str.length(); i++) {
// i依次表示字符串的每一个索引
char c = str.charAt(i);
if (c >= 'a' && c <= 'z') {
// char类型变量在参与计算时自动类型提升为int型
smallCount++;
} else if (c >= 'A' && c <= 'Z') {
bigCount++;
} else if (c >= '0' && c <= '9') {
numberCount++;
}
}
// 3.输入打印
System.out.println("大写字母有:" + bigCount + "个");
System.out.println("小写字母有:" + smallCount + "个");
System.out.println("数字字母有:" + numberCount + "个");
}
运行结果:
3. 金额转换
编程思路: 逆推找思路 正推找过程
public static void main(String[] args) {
// 1.键盘录入金额
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 = "";
// 2.得到money中每一个数组
while (true) { // 2135
// 从右往左遍历数据 右边为个位
int ge = money % 10;
String capitialNumber = getCapitalNumber(ge);
// 转换之后的大写拼接成到字符串
moneyStr = capitialNumber + moneyStr;
// "" + "伍" + "叁" + "壹" + "贰"
// 第一次循环: "伍" + "" = "伍"
// 第二次循环:"叁" + "伍" = "叁伍"
// 去掉刚获取的数据
money = money / 10;
// 如果数字上每一位全部获取到,那么money记录的为0,此时循环结束
if (money == 0) {
break;
}
}
// 3. 在前面补0 补齐7位
int count = 7 - moneyStr.length();
for (int i = 0; i < count; i++) {
moneyStr = "零" + moneyStr;
}
// System.out.println(moneyStr);
// 4. 插入单位
// 定义数组表示单位
String[] arr = { "佰", "拾", "万", "任", "佰", "拾", "元" };
// 遍历moneyStr ,依次得到
// 然后把arr的单位插入进去
String result = "";
for (int i = 0; i < moneyStr.length(); i++) {
char c = moneyStr.charAt(i);
result = result + c + arr[i];
}
// 5. 打印最终结果
System.out.println(result);
}
// 定义一个方法把数字变成大写的中文
public static String getCapitalNumber(int number) {
// 定义数组,让数字和大写中文产生对应关系
String[] arr = { "零", "壹", "贰", "参", "肆", "伍", "陆”,“柒", "捌", "玫" };
// 返回结果
return arr[number];
}
运行结果: