String类

String类

String类代表字符串,Java程序中的所有字符串文字(例如”abc”)都被实现为此类的实例。也就是说,Java程序中所有的双引号字符串,都是String类的对象。String类在java.lang包下,所以使用的时候不需要导包

String类的特点

  • 字符串不可变,它们的值在创建后不能被更改,因为String被final修饰
  • 虽然String的值是不可变的,但是它们可以被共享
  • 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])

Stirng类的构造方法

  • 常用的构造方法

    方法名说明
    public String()创建一个空白字符串对象,不含有任何内容
    public String(char[] chs)根据字符数组的内容,来创建字符串对象
    public String(byte[] bys)根据字节数组的内容,来创建字符串对象
    String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc
  • 示例代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class StringDemo01 {
    public static void main(String[] args) {
    //public String():创建一个空白字符串对象,不含有任何内容
    String s1 = new String();
    System.out.println("s1:" + s1);

    //public String(char[] chs):根据字符数组的内容,来创建字符串对象
    char[] chs = {'a', 'b', 'c'};
    String s2 = new String(chs);
    System.out.println("s2:" + s2);

    //public String(byte[] bys):根据字节数组的内容,来创建字符串对象
    byte[] bys = {97, 98, 99};
    String s3 = new String(bys);
    System.out.println("s3:" + s3);

    //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
    String s4 = "abc";
    System.out.println("s4:" + s4);
    }
    }

创建String对象的两种方式

直接赋值方式

以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护。

1
2
3
4
5
6
public class StringDemo{
public static void main(String[] args){
String s1 ="abc";
String s2 = "abc";
}
}

image-20221201235812130

上述代码执行流程分析:

  1. 加载StringDemo.class文件到方法区,jvm调用对应的main方法
  2. 将main方法加载到栈内存中去执行
    1. 创建一个String s1的变量,并观察堆内存中的串池是否存在字符串”abc”
    2. 没有”abc”,就会在串池中创建一个”abc”,并把地址值赋值给s1
    3. 继续往下执行,创建一个String s2的变量,去串池中找是否存在”abc”,发现串池中已经存在,则直接把之前的”abc”的地址值赋值给s2
  3. 最后执行完逻辑,main方法出栈。

所以得出结论:当时用双引号直接赋值时,系统会检查该字符串在串池中是否存在。不存在,创建新的,存在则复用之前的

通过构造方法

通过new 创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同

image-20221202000917966

字符串的比较

==号的作用

  • 比较基本数据类型:比较的是具体的值
  • 比较引用数据类型:比较的是对象地址值

equals方法的作用

  • 比较两个字符串内容是否相同,区分大小写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class StringDemo02 {
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);

//直接赋值的方式得到对象
String s3 = "abc";
String s4 = "abc";

//比较字符串对象地址是否相同
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s3 == s4); //true
System.out.println("--------");

//比较字符串内容是否相同
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//true
System.out.println(s3.equals(s4));//true
}
}


代码案例

  • 键盘录入一个字符串,使用程序实现在控制台遍历该字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class Test2字符串直接遍历 {
    public static void main(String[] args) {
    //两个方法:
    //charAt():会根据索引获取对应的字符
    //length(): 会返回字符串的长度


    //1.键盘录入一个字符串
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入字符串");
    String str = sc.next();
    System.out.println(str);

    //2.遍历
    for (int i = 0; i < str.length(); i++) {
    //i 依次表示字符串的每一个索引
    //索引的范围:0 ~ 长度-1

    //根据索引获取字符串里面的每一个字符
    //ctrl + alt + V 自动生成左边的接受变量
    char c = str.charAt(i);
    System.out.println(c);
    }
    }
    }
  • 键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class Test4统计个数 {
    public static void main(String[] args) {
    //键盘录入一个字符串,统计大写,小写,数字出现的次数


    //1.键盘录入一个字符串
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个字符串");
    String str = sc.next();


    //2.统计 --- 计数器count
    //此时我要统计的有3样东西,所以要定义3个计数器分别进行统计
    int bigCount = 0;
    int smallCount = 0;
    int numberCount = 0;
    //得到这个字符串里面每一个字符
    for (int i = 0; i < str.length(); i++) {
    //i 表示字符串中的索引
    //c 表示字符串中的每一个字符
    char c = str.charAt(i);

    //对c进行判断
    if (c >= 'a' && c <= 'z') {
    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 + "个");
    }
    }
  • ​ 定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制输出结果。例如,键盘录入 abc,输出结果 cba

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public class Test6反转字符串 {
    public static void main(String[] args) {
    /*定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
    例如,键盘录入 abc,输出结果 cba*/



    //1.定义一个字符串
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个字符串");
    String str = sc.next();
    //2.定义一个方法,反转字符串
    //abc ---> cba
    //可以把字符串倒着遍历,再拼接
    String result = reverse(str);
    System.out.println(result);


    }

    //注释:方法的作用就是反转字符串
    //把传递进来的字符串进行反转
    public static String reverse(String str){//abc
    //核心思想:倒着遍历并进行拼接就可以了
    //fori :正着遍历 forr:倒着遍历
    String s = "";
    for (int i = str.length() - 1; i >= 0; i--) {
    //i 依次表示字符串里面的每一个索引(倒着的)
    //我们就可以拿到里面的每一个字符并拼接
    s = s + str.charAt(i);
    }

    //把倒着拼接之后的结果返回即可
    return s;

    }
    }
  • ​ 把2135变成:零佰零拾零万贰仟壹佰叁拾伍元 ,把789变成:零佰零拾零万零仟柒佰捌拾玖元

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public class StringDemo9 {
    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 capitalNumber = getCapitalNumber(ge);
    //把转换之后的大写拼接到moneyStr当中
    moneyStr = capitalNumber + 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 = result + c + arr[i];
    }

    //5.打印最终结果
    System.out.println(result);

    }


    //定义一个方法把数字变成大写的中文
    //1 -- 壹
    public static String getCapitalNumber(int number) {
    //定义数组,让数字跟大写的中文产生一个对应关系
    String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    //返回结果
    return arr[number];
    }

    }

StringBuilder

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

当我们在拼接字符串和反转字符串的时候会使用到

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");

//2.添加元素
/*sb.append(1);
sb.append(2.3);
sb.append(true);*/

//反转
sb.reverse();

//获取长度
int len = sb.length();
System.out.println(len);


//打印
//普及:
//因为StringBuilder是Java已经写好的类
//java在底层对他做了一些特殊处理。
//打印对象不是地址值而是属性值。
System.out.println(sb);
}
}

StringJoiner

  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
  • 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
  • JDK8出现的

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc

//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印
System.out.println(sj);//[aaa, bbb, ccc]
String str = sj.toString();
System.out.println(str);//[aaa, bbb, ccc]


String类
http://example.com/2023/01/29/Java基础/String类/String/
作者
zhuixun
发布于
2023年1月29日
许可协议