java中字符串与字符串的复制函数 字符串赋值java_开发语言

1.常见操作

1.字符串的内容是不会发生改变的,它的对象在创建后不能被更改。

2.创建字符串对象的两种方式

java中字符串与字符串的复制函数 字符串赋值java_System_02

3.String内存分析

直接赋值的字符串是存在串池当中的,每次新建一个字符串时都会在串池中查找是否有相同的字符串,若有,则将该地址赋值给变量.

java中字符串与字符串的复制函数 字符串赋值java_System_03

java中字符串与字符串的复制函数 字符串赋值java_java_04

 使用new赋值时,每new一次都是开辟一个新的内存空间.

java中字符串与字符串的复制函数 字符串赋值java_java_05

4.字符串的比较

"=="号的比较分两种情况,基本数据类型就比较数据值,引用数据类型就比较地址值.

java中字符串与字符串的复制函数 字符串赋值java_开发语言_06

需要比较内容时,

java中字符串与字符串的复制函数 字符串赋值java_开发语言_07

Scanner录入的字符串是new出来的,不在串池中. 

2.常见案例

1.用户登录

java中字符串与字符串的复制函数 字符串赋值java_开发语言_08

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.遍历字符串

java中字符串与字符串的复制函数 字符串赋值java_System_09

java中字符串与字符串的复制函数 字符串赋值java_字符串_10

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.统计字符次数 

java中字符串与字符串的复制函数 字符串赋值java_System_11

// 统计字符次数
        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.拼接字符串

java中字符串与字符串的复制函数 字符串赋值java_字符串_12

// 方法:拼接字符串
    // 需要:数组
    // 返回:字符串
    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.字符串反转

java中字符串与字符串的复制函数 字符串赋值java_System_13

// 方法:字符串反转
    // 需要字符串
    // 返回字符串
    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.金额转换

java中字符串与字符串的复制函数 字符串赋值java_java中字符串与字符串的复制函数_14

// 方法:金额转换
    // 需要数字
    // 返回字符串
    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.手机号屏蔽

java中字符串与字符串的复制函数 字符串赋值java_java_15

// 加密手机号(中间四位)
    // 需要原始手机号
    // 返回加密手机号
    public static String cutPhoneNum(String phoneNum){
        String newNum = phoneNum.substring(0,3) + "****" + phoneNum.substring(7);
        return newNum;
    }

 8.敏感词替换

java中字符串与字符串的复制函数 字符串赋值java_开发语言_16

// 获取说的话
        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

java中字符串与字符串的复制函数 字符串赋值java_System_17

 创建

java中字符串与字符串的复制函数 字符串赋值java_开发语言_18

方法 

java中字符串与字符串的复制函数 字符串赋值java_java中字符串与字符串的复制函数_19

使用stringBuilder的场景;

1.字符串的拼接
2.字符串的反转

4.StringJoiner

java中字符串与字符串的复制函数 字符串赋值java_字符串_20

java中字符串与字符串的复制函数 字符串赋值java_字符串_21

java中字符串与字符串的复制函数 字符串赋值java_System_22

4.底层原理

扩展底层原理1:字符串存储的内存原理

直接赋值会复用字符串常量池中的
new出来不会复用,而是开辟一个新的空间

扩展底层原理2:==号比较的到底是什么?

基本数据类型比较数据值

引用数据类型比较地址值

扩展底层原理3:字符串拼接的底层原理

如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。

如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。

java中字符串与字符串的复制函数 字符串赋值java_System_23

java中字符串与字符串的复制函数 字符串赋值java_开发语言_24

扩展底层原理4: StringBuilder提高效率原理图

所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存

扩展底层原理5:StringBuilder源码分析

java中字符串与字符串的复制函数 字符串赋值java_System_25

5.练习题

1.转换罗马数字

java中字符串与字符串的复制函数 字符串赋值java_System_26

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.调整字符串

java中字符串与字符串的复制函数 字符串赋值java_java_27

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);
    }
}