Bootstrap

从入门到入土,java学习day7(字符串)

字符串

API:应用程序接口(别人已经写好的东西,我们不需要自己编写,直接使用即可)

API帮助文档:帮助查询API的文档,直接搜索就可以

先查看类所在的包,然后看类的描述怎么用,然后查看构造方法,然后查看成员方法

字符串

String

java.lang.String类代表字符串,java程序中的所有字符串文字都为此类的对象

字符串创建之后就不能被更改

创建String对象的两种方式

1.直接赋值 String name = "学习"

2.new方法

public String()

public String(String original)

public String(char[] chs)

public String(byte[] chs)

java的内存模型

又来了

之前我们知道,栈内存:方法运行的时候进栈执行完毕出栈

堆内存:new出来的对象在这里

方法区:字节码文件

今天有一个新的

String Table(串池)从JDK7之后从方法区到了堆内存

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。

不存在:创建新的

存在:复用

字符串的比较

常规的==比较的是地址值

1.boolean equals方法(要比较的字符串) 完全一样为true,否则为false

2.boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较

键盘录入也是new出来的

练习

1.遍历字符串

public char charAt(int index);根据索引返回字符

public int length();返回此字符串的长度

字符串长度:字符串对象.length()

package stringdemo;
import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a string: ");
        String str = input.nextLine();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            System.out.println(c);

        }
    }
}

2.统计字符串中大小写和数字以及其他字符个数

package stringdemo;

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a string: ");
        String str = input.nextLine();
        int bigCount = 0;
        int smallCount = 0;
        int numCount = 0;
        int otherCount = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                bigCount++;
            }
            else if (c >= 'a' && c <= 'z') {
                smallCount++;
            }
            else if (c >= '0' && c <= '9') {
                numCount++;
            }
            else {
                otherCount++;
            }
        }
        System.out.println("bigCount: " + bigCount);
        System.out.println("smallCount: " + smallCount);
        System.out.println("numCount: " + numCount);
        System.out.println("otherCount: " + otherCount);
    }
}

3.字符串反转

package stringdemo;

import java.util.Scanner;

public class StringDemo2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a string: ");
        String str = input.nextLine();
        reverse(str);
        System.out.println(reverse(str));
    }
    public static String reverse(String str) {
        String result = "";
        for (int i = str.length() - 1; i >= 0; i--) {
            char c = str.charAt(i);
            result += c;
        }
        return result;
    }
}

4.金额转换,将金额转换为银行一样的汉字格式并且补零

package stringdemo;

import java.util.Scanner;

public class StringDemo3 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int money;
        while (true) {
            System.out.println("Enter a money: ");
            money = input.nextInt();
            if(money >= 0 && money <= 9999999) {
                break;
            }else {
                System.out.println("Invalid money");
            }
        }
        String moneyStr = "";
        while (true) {
            int ge = money % 10;
            String c = change(ge);
            moneyStr = c + moneyStr;
            money /= 10;
            if (money == 0) {
                break;
            }
        }
        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 += c;
            if (i != moneyStr.length() - 1) {
                result += arr[i];
            }
        }
    }
    public static String change(int number) {
        String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        return arr[number];
    }
}

5.手机号屏蔽

String substring(int beginIndex,int endIndex)截取

注意:包头不包尾,包左不包右,返回值才是结果

String subsrting(int beginIndex)截取到末尾

package stringdemo;

public class StringDemo4 {
    public static void main(String[] args) {
        String phoneNumber = "13800138000";
        String result = phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
        System.out.println(result);
    }
}

6.敏感词替换

String replace(旧值,新值)替换

只有返回值是替换之后的结果

StringBuilder

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

作用:提高字符串的操作效率

打印相应对象是属性值而不是地址值

构造方法

public StringBuilder()创建一个空白可变字符串对象,不含有任何内容

public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

public StringBuilder append(任意类型)添加数据,并返回对象本身

public StringBuilder reverse()反转容器中的内容

public int length()

public String toString()可以实现把StringBuilder转换为String

链式编程

当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

练习

1.对称字符串,键盘接受一个字符串,程序判断出该字符串是否是对称字符串

package stringdemo;

import java.util.Scanner;

public class StringDemo5 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a string: ");
        String str = sc.nextLine();
        String result = new StringBuilder(str).reverse().toString();
        if (str.equals(result)) {
            System.out.println("Yes");
        }else {
            System.out.println("No");
        }
    }
}

StringJoiner

和StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。

作用:提字符串的操作效率,而且代码编写特别简洁

JDK8之后出现

public StringJoiner(间隔符号)创建一个对象,指定拼接时的间隔符号

public StringJoiner(间隔符号,开始符号,结束符号)创建一个对象,指定拼接时的间隔符号,开始符号,结束符

public String toString()返回一个字符串

字符串原理

1.字符串存储的内存原理

直接赋值会复用字符串常量池中的

new出来不会复用,而是开辟一个新的空间

2.==号比较的到底是什么

基本数据类型比较数据值

引用数据类型比较地址值

3.字符串拼接的底层原理

等号右边没有变量时,都是字符串,触发字符串的优化机制,在编译的时候就已经是最终的结果了。

有变量时,JDK8之前会使用StringBuilder,会在内存中new StringBuilder然后拼接之后再toString产生新字符串,每次想加会在堆内存中创建两个对象。

4.StringBuilder提高效率原理图

原理很简单,之前都是拼接一次创建一个StringBuilder,但是直接用的话,就会只用一个当作容器,在里面草错效率提升很多。

5.StringBuilder源码分析

默认创建一个长度为16的字节数组

添加和内容长度小于16,直接存

添加的内容大于16会扩容(原来的容量*2+2)

如果扩容之后还不够,以实际长度为准

;