1.常见操作
1.字符串的内容是不会发生改变的,它的对象在创建后不能被更改。
2.创建字符串对象的两种方式
3.String内存分析
直接赋值的字符串是存在串池当中的,每次新建一个字符串时都会在串池中查找是否有相同的字符串,若有,则将该地址赋值给变量.
使用new赋值时,每new一次都是开辟一个新的内存空间.
4.字符串的比较
"=="号的比较分两种情况,基本数据类型就比较数据值,引用数据类型就比较地址值.
需要比较内容时,
Scanner录入的字符串是new出来的,不在串池中.
2.常见案例
1.用户登录
package test;
import java.util.Scanner;
public class stringCase {
public static void main(String[] args) {
String realUserName = "postgraduate";
String realPassWord = "20231888";
Scanner sc = new Scanner(System.in);
int j = 0;
for (int i = 0; i < 3; i++) {
System.out.print("请输入用户名:");
String userName = sc.nextLine();
System.out.println();
System.out.print("请输入密码:");
String passWord = sc.nextLine();
System.out.println();
if (userName.equals(realUserName) && passWord.equals(realPassWord)){
System.out.println("登陆成功!");
break;
}else {
j++;
if (j == 3){
System.out.println("登录失败!您的账户被锁定,请找相关部门解锁!");
}else {
System.out.println("请重新输入!您还剩" + (2 - i) + "次机会!");
}
}
}
}
}
2.遍历字符串
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String string1 = sc.nextLine();
System.out.println();
// 遍历字符串
// 字符串对象.length()获得字符串长度
for (int i = 0; i < string1.length(); i++) {
char a = string1.charAt(i);
System.out.print(a + " ");
}
System.out.println();
3.统计字符次数
// 统计字符次数
int uppercase = 0;
int lowercase = 0;
int numcase = 0;
for (int i = 0; i < string1.length(); i++) {
char c = string1.charAt(i);
if (c >= 'a' && c <= 'z'){
lowercase++;
} else if (c >= 'A' && c <= 'Z') {
uppercase++;
}else if (c >= '0' && c <= '9'){
numcase++;
}else {
continue;
}
}
System.out.println("字符串中大写字母有" + uppercase + "个");
System.out.println("字符串中小写字母有" + lowercase + "个");
System.out.println("字符串中数字有" + numcase + "个");
4.拼接字符串
// 方法:拼接字符串
// 需要:数组
// 返回:字符串
public static String concatString(int[] arr){
String string = new String();
if (arr == null){
return "";
}
if (arr.length == 0){
return "[]";
}
for (int i = 0; i < arr.length; i++) {
int a = arr[i];
if (i == 0){
string = string + "[" + a;
} else if (i == arr.length - 1) {
string = string + "," + a + "]";
}else {
string = string + "," + a;
}
}
return string;
}
5.字符串反转
// 方法:字符串反转
// 需要字符串
// 返回字符串
public static String stringReversal(String string){
String s = new String();
for (int i = string.length() - 1; i >= 0; i--) {
char c = string.charAt(i);
s = s + c;
}
return s;
}
6.金额转换
// 方法:金额转换
// 需要数字
// 返回字符串
public static String moneyTransform(int money){
String[] s = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
String string = new String();
for (; money > 0;) {
int wei = money % 10;
string = string + s[wei];// 可以用string = s[wei] + string;就不用了调用反转函数了
money = money / 10;
}
if (string.length() < 7){
for (int i = string.length(); i < 7; i++) {
string = string + "零";
}
}
String string2 = stringReversal(string);
System.out.println(string2);
String[] danwei = {"佰","拾","万","仟","佰","拾","元"};
String string3 = new String();
int j = 0;
int k = 0;
// for (int i = 0; i < 14; i++) {
// if (i % 2 == 1){
// string3 = string3 + danwei[j];
// j++;
// }else {
// string3 = string3 + string2.charAt(k);
// k++;
// }
// }
for (int i = 0; i < string2.length(); i++) {
string3 = string3 + string2.charAt(i) + danwei[i];
}
return string3;
}
7.手机号屏蔽
// 加密手机号(中间四位)
// 需要原始手机号
// 返回加密手机号
public static String cutPhoneNum(String phoneNum){
String newNum = phoneNum.substring(0,3) + "****" + phoneNum.substring(7);
return newNum;
}
8.敏感词替换
// 获取说的话
String talk = "行不行啊细狗";
// 创建词库
String[] arr = {"细狗","不行"};
// 替换
String newTalk = talk;
for (int i = 0; i < arr.length; i++) {
newTalk = newTalk.replace(arr[i], "**");
}
System.out.println(newTalk);
3.StringBuilder
创建
方法
使用stringBuilder的场景;
1.字符串的拼接
2.字符串的反转
4.StringJoiner
4.底层原理
扩展底层原理1:字符串存储的内存原理
直接赋值会复用字符串常量池中的
new出来不会复用,而是开辟一个新的空间
扩展底层原理2:==号比较的到底是什么?
基本数据类型比较数据值
引用数据类型比较地址值
扩展底层原理3:字符串拼接的底层原理
如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
扩展底层原理4: StringBuilder提高效率原理图
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
扩展底层原理5:StringBuilder源码分析
5.练习题
1.转换罗马数字
package test;
import java.util.Scanner;
import java.util.StringJoiner;
public class StringTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一串数字(长度小于等于9):");
String num = sc.nextLine();
String[] romaTable = {" ", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
StringBuilder romaNum = new StringBuilder();
StringJoiner romaNum2 = new StringJoiner(" ");
for (int i = 0; i < num.length(); i++) {
char c = num.charAt(i);
romaNum.append(romaTable[c-48]);
romaNum2.add(romaTable[c-48]);
}
System.out.println(romaNum);
System.out.println(romaNum2);
}
}
2.调整字符串
package test;
public class StringTest2 {
public static void main(String[] args) {
String a = "abcdefu";
String b = "fuabcde";
// 定义一个方法旋转字符串
// 需要字符串,返回新字符串
boolean flag = false;
for (int i = 0; i < a.length(); i++) {
a = rotate(a);
if (a.equals(b)){
flag = true;
break;
}
}
System.out.println(flag);
}
// 定义一个方法旋转字符串
// 需要字符串,返回新字符串
public static String rotate(String a){
return a.substring(1) + a.charAt(0);
}
}