字符串

概述

从概念上讲,Java 字符串就是 Unicode 字符序列。例如,字符串 "Java\u2122" 由 5 个 Unicode 字符 J,a,v,a,\(^{TM}\) 组成。

Java 没有内置的字符串类型,而是标准 Java 类库中提供了一个预定义类,叫作 String。

包:java.lang

类:java.lang.String

Java 程序中的所有字符串文字都为此类的对象。

每个用双引号括起来的字符串都是 String 类的一个实例:

public class Test {
    public static void main(String[] args) {
        String e = "";  // an empty string
        String greeting = "Hello";
    }
}

字符串的内容在创建之后就不能再被更改。

下面的代码产生了三个字符串:

public class introduction {
    public static void main(String[] args) {
        String a = "hello";
        String b = " world";
        System.out.println(a + b);
    }
}

下面的代码产生了两个字符串:

public class introduction {
    public static void main(String[] args) {
        String a = "hello";
        System.out.println(a);
        a = "world";
        System.out.println(a);
    }
}

第五行创建了一个新的字符串,将新的字符串赋值给了变量 a,而不是改变了第一个字符串的内容。

由于不能修改 Java 字符串中的单个字符,所以在 Java 文档中将 String 类对象称为是不可变的(immutable),如同数字 3 永远是数字 3 一样,字符串 "Hello" 永远包含字符 H,e,l,l 和 o 的代码单元序列。不能修改这些值,但是可以修改字符串变量的内容,让它指向另外一个字符串。这就如同可以让原本存放 3 的数值变量改成存放 4 一样。

当将一个字符串与一个非字符串的值进行拼接时,后者会转换成字符串。

任何一个 Java 对象都可以转换成字符串。

空串

空串 "" 是长度为 0 的字符串,可以调用以下代码检查一个字符串是否为空:

if (str.length() == 0)
// 或
if (str.equals(""))

空串是一个 Java 对象,有自己的串长度(0)和内容(空)。

null 串

String 变量还可以存放一个特殊的值,名为 null,表示目前没有任何对象与该变量关联。null 即空值,值为 nul。

打印 null 字面量:

public class ValueDemo1 {
    public static void main(String[] args) {
        // 空值null不能直接打印,只能以字符串的形式打印
        System.out.println("null");
    }
}

执行结果:

null

要检查一个字符串是否为 null,可以使用以下代码:

if (str == null)

有时要检查一个字符串既不是 null 也不是空串, 这种情况下可以使用:

if (str != null && str.length() != 0)

首先要检查 str 不为 null。如果在一个 null 值上调用方法则会出现错误。

创建字符串的两种方式

创建字符串对象有两种方式:

  1. 直接赋值:String name = "xiaoming";

  2. 使用 new 关键字用不同的构造方法来创建字符串对象。

构造方法 说明
public String() 使用空参构造, 创建空白字符串, 不含任何内容
public String(String original) 传入一个字符串, 根据传入的字符串, 创建一个新的字符串
public String(char[] chs) 根据字符数组, 创建一个字符串
public String(byte[] chs) 根据字节数组, 创建一个字符串

程序示例:

public class Test {
    public static void main(String[] args) {
        // 使用直接赋值的方式创建一个字符串对象
        String s1 = "abc";
        System.out.println(s1);  // abc

        // 使用 new 关键字来获取字符串对象

        // 空参构造, 获取一个空的字符串对象
        String s2 = new String();
        System.out.println("#" + s2 + "#");  // ##

        // 传递一个字符串, 根据传递进来的字符串创建一个新的字符串
        String s3 = new String("Hello");
        System.out.println(s3);  // Hello

        // 传递一个字符数组, 根据字符数组的内容, 创建一个新的字符串
        char[] chs = {'n', 'i', 'h', 'a', 'o'};
        String s4 = new String(chs);
        System.out.println(s4);  // nihao

        // 这种方式可以用来修改字符串. 因为字符串创建出来之后就不能被改变, 所以可以将字符串改为字符数组, 
        // 再改变字符数组, 再利用改变之后的字符数组生成新的字符串
        String s5 = "nihao";                // 原字符串
        char[] chars = s5.toCharArray();    // 字符串变为字符数组
        System.out.println(chars);          // 打印字符数组, 输出: nihao
        chars[2] = 'p';                     // 改变字符数组中的一个元素
        System.out.println(chars);          // 打印字符数组, 输出: nipao
        String s6 = new String(chars);      // 根据改变之后的字符数组创建新的字符串
        System.out.println(s6);             // 打印字符串, 输出: nipao

        // 传递一个字节数组, 根据字节数组创建一个新的字符串对象
        // 应用场景: 以后在网络中传递的数据都是字节信息, 一般都要把字节信息进行转换, 转成字符串, 此时就要用到这个构造.
        byte[] bytes = {97, 98, 99, 100};
        System.out.println(bytes);          // [B@4dd8dc3
        String s7 = new String(bytes);
        System.out.println(s7);             // abcd
    }
}

内存分析

不可变字符串有一个很大的优点:编译器可以让字符串共享。

StringTable:串池,即字符串常量池,用来存放字符串。

在 JDK7 之前 StringTable 在方法区,从 JDK7 开始 StringTable 移动到了堆内存中,但是不管在哪里,运行机制没有发生变化。

只有用直接赋值的方法创建的字符串对象才会在 StringTable 中。

如果是用 new 关键字获取的字符串对象就不在 StringTable 中。

当只用直接赋值的方式创建字符串时,系统会检查该字符串在字符串池中是否存在,如果不存在,系统就创建一个新的字符串,如果存在,就直接复用。

直接赋值的方式:


图 1

执行 String s1 = "abc"; 时先检查串池,发现没有字符串 "abc",则创建一个字符串 "abc",在堆内存中的内容都是有地址的,同样这个字符串 "abc" 也是有一个地址的,这个地址被赋值给 s1。

执行 String s2 = "abc"; 时先检查串池,发现有字符串 "abc",则直接复用这个字符串。

各个字符串存放在一个公共的存储池中,字符串变量指向存储池中相应的位置,如果复制一个字符串变量,原始字符串和复制的字符串共享相同的字符。

C++ string 对象也会自动完成内存的分配与回收,要通过构造器,赋值操作符和析构器显式完成内存管理,不过 C++ 字符串是可修改的,也就是说可以修改字符串中的单个字符。

使用 new 关键字的方式:


图 2

用这种方式不会复用字符串,每 new 一次就是开辟了一个新的小空间,如果相同字符串较多,这样做会浪费内存空间,尽量使用直接赋值的方式,因为代码简单且节约内存。

compareTo()

源码:


图 1

返回值有三种情况:

  1. 返回 0:调用这个方法的字符串和形参字符串相等(字面意思的相等,不是地址值相等)

  2. 返回正数:调用这个方法的字符串按照字典顺序排在形参字符串之后

  3. 返回负数:调用这个方法的字符串按照字典顺序排在形参字符串之前

该方法用于判断一个字符串是大于,等于还是小于另一个字符串,判断字符串大小的依据是根据它们在字典中的顺序决定的。

语法:

str1.compareTo(str2);

其返回的是一个 int 类型值。

如果两个字符串长度相同,则返回第一个不相等的字符的 ASCII 码值的差值, 是 str1 减去 str2.

如果两个字符串长度不相同,先一直向后比较,如果在某一个字符串到达结束之前,遇到了不相等的字符,则返回第一个不相等的字符的 ASCII 码值的差值,是 str1 减去 str2,如果一直向后比较的过程中,没有遇到不相等的字符,即 str1 和 str2 中一个字符串是另一个字符串的前缀,则返回两个字符串的字符个数之差,是 str1 的字符个数减去 str2 的字符个数。

程序示例:

public class StringDemo {
    public static void main(String[] args) {
        // 两个字符串常量的比较
        int b = "Hello".compareTo("Hello");
        System.out.println(b); // 0

        // 两个字符串变量的比较
        String s1 = "Hello";
        String s2 = "Hello";
        int c = s1.compareTo(s2);
        System.out.println(c); // 0

        // 两个字符串常量的比较
        String s3 = "hello";
        String s4 = "Hello";
        int d = s3.compareTo(s4);
        System.out.println(d); // 32
    }
}

程序示例:

import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
        // 从键盘输入的字符串的比较
        Scanner sc = new Scanner(System.in);
        System.out.print("输入一个字符串: ");
        String inputString = sc.next();
        int result = inputString.compareTo("Hello");
        System.out.println(result);
    }
}

执行结果:

输入一个字符串: Hello
0

程序示例:

public class StringDemo {
    public static void main(String[] args) {
        // 两个字符串长度相等
        System.out.println("bbc".compareTo("abc")); // 1
        System.out.println("abc".compareTo("acc")); // -1
    }
}

程序示例:

public class Test {
    public static void main(String[] args) {
        // 两个字符串长度不相等
        System.out.println("bbc".compareTo("ba"));     // 1
        System.out.println("abcd".compareTo("ab"));    // 2
        System.out.println("ab".compareTo("abcdef"));  // -4
    }
}

length()

数组长度 = 数组名.length;

这里的 length 是一个属性,所以不加括号。

字符串的长度 = 字符串对象.length();

字符串的长度使用方法 length(),所以要加括号。

charAt()

方法 public char charAt(int index); 根据字符串的索引返回字符。

字符串的索引的规则和数组的索引一模一样。

练习:
需求: 键盘录入一个字符串, 使用程序实现在控制台遍历该字符串。

程序示例:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串: ");
        String s = sc.next();
        for (int i = 0; i < s.length(); i++) {  // 这里在 IDEA 中的快捷键是 s.length().fori, 如果是数组则快捷键是 s.fori
            char c = s.charAt(i);
            System.out.println(c);
        }
    }
}

执行结果:

请输入一个字符串: hello
h
e
l
l
o

equals() 和 equalsIgnoreCase()

程序示例:

public class StringDemo1 {
    public static void main(String[] args) {
        String s1 = new String("abc");  // 记录堆里面的地址
        String s2 = "abc";              // 记录串池中的地址
        String s3 = "abc";
        String s4 = new String("abc");
        System.out.println(s1 == s2);   // false, 一个是直接赋值, 一个是 new 出来的
        System.out.println(s1);         // abc
        System.out.println(s2);         // abc
        System.out.println(s2 == s3);   // true, 两个都是直接赋值得到的
        System.out.println(s1 == s4);   // false, 两个都是 new 出来的
    }
}

== 号比较的是什么:

  • 基本数据类型比较的是值。

  • 如果是引用数据类型比较的是地址值。

比较内容的两个方法:

equals() 方法和 equalsIgnoreCase() 方法。

可以使用 equals() 方法检测两个字符串是否相等。对于表达式 s.equals(t),如果字符串 s 与字符串 t 相等,则返回 true,否则返回 false。需要注意的是,s 和 t 可以是字符串变量,也可以是字符串字面量。

例如,以下表达式是合法的:

"Hello".equals(greeting)

要想检测两个字符串是否相等,而不区分大小写,可以使用 equalsIgnoreCase() 方法。

"Hello".equals("hello")

不要使用运算符 == 检测两个字符串是否相等,这个运算符只能够确定两个字符串是否存放在同一个位置上,当然,如果字符串在同一个位置上,它们必然相等,但是完全有可能将多个相等的字符串副本存放在不同的位置上。

只有字符串字面量会共享,而其他所有操作得到的字符串,比如 new 出来的,用 + 得到的或 substring 等操作得到的字符串并不共享。

程序示例:

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = "abc";
        String s3 = "abc";
        String s4 = new String("abc");
        System.out.println(s1.equals(s2));   // true, 一个是直接赋值, 一个是 new 出来的
        System.out.println(s1 == s2);        // false
        System.out.println(s2.equals(s3));   // true, 两个都是直接赋值得到的
        System.out.println(s2 == s3);        // true
        System.out.println(s1.equals(s4));   // true, 两个都是 new 出来的
        System.out.println(s1 == s4);        // false
    }
}

当有一个字符串是从键盘读入时:

程序示例:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = "abc";
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String s3 = sc.next();          // s3 是 new 出来的
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);
    }
}

执行结果:

请输入一个字符串
abc
false
false

从键盘读入的字符串也被认为是 new 出来的。

toUpperCase(), toLowerCase(), isUpperCase(), isLowerCase(), isDigit()

作用:字符全部变为大/小写。

程序示例:

public static void main(String[] args) {
    String s = "Hello";                                 // 字符串变量
    System.out.println(s.toUpperCase());                // HELLO
    System.out.println(s);                              // Hello, 说明不影响原来的字符串
    System.out.println("length".toUpperCase());         // LENGTH
    System.out.println("ok123".toUpperCase());          // OK123, 说明只对小写字母起作用, 其他字符不变
    System.out.println(s.toLowerCase());                // hello
}

练习:
统计字符次数
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

程序示例:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        // 键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串: ");
        String str = sc.next();

        // 统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数
        int upper = 0, lower = 0, digit = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isUpperCase(c))
                upper++;
            else if (Character.isLowerCase(c))
                lower++;
            else if (Character.isDigit(c))
                digit++;
        }

        // 输出结果
        System.out.println("大写字母有" + upper + "个.");
        System.out.println("小写字母有" + lower + "个.");
        System.out.println("数字字符有" + digit + "个.");
    }
}

执行结果:

请输入一个字符串: Hello123
大写字母有1个.
小写字母有4个.
数字字符有3个.

练习:
拼接字符串
定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果.
例如:
数组为 int[] arr = {1,2,3};
执行方法后的输出结果为: [1, 2, 3]

代码:

public class Test {
    public static void main(String[] args) {
        // 给定了一个数字数组
        int[] arr = {1, 2, 3};
        String str = arrToString(arr);
        System.out.println(str);
    }

    public static String arrToString(int[] arr) {
        // 如果传递进来的数组是空, 则返回一个空字符串
        if (arr == null)
            return "";
        // 如果传递进来的数组的长度为零,
        // 例如这样定义一个数组: int[] arr=new int[0];, 那么数组 arr 的长度就是 0, 这样的数组是不能存放任何内容的.
        // 那么返回一对方括号, 括号内没有任何内容.
        if (arr.length == 0)
            return "[]";
        // 假如传递进来的数组是有内容的, 那么就要进行拼接
        String res = "[";
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                res = res + arr[i] + ", ";
            } else {
                res = res + arr[i] + "]";
            }
        }
        return res;
    }
}

执行结果:

[1, 2, 3]

练习:
字符串反转
定义一个方法,实现字符串反转。
键盘录入一个字符串,调用该方法后,在控制台输出结果。
例如,键盘录入 abc,输出结果 cba
批量修改:shift + f6

代码:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        // 从键盘输入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.print("输入一个字符串: ");
        String str = sc.next();
        System.out.println(str);
        String str2 = convertString(str);
        System.out.println(str2);
    }

    // 定义一个方法, 反转一个字符串
    public static String convertString(String str) {
        char[] arr = new char[str.length()];
        arr = str.toCharArray();
        int i = 0, j = arr.length - 1;
        for (; i <= j; i++, j--) {
            char tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
        String res = new String(arr);
        return res;
    }
}

执行结果:

输入一个字符串: Hello
Hello
olleH

另一种更好的写法:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        // 从键盘输入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.print("输入一个字符串: ");
        String str = sc.next();
        System.out.println(str);
        String str2 = convertString(str);
        System.out.println(str2);
    }

    // 定义一个方法, 反转一个字符串
    public static String convertString(String str) {
        String res = "";
        for (int i = str.length() - 1; i >= 0; i--) {
            res += str.charAt(i);
        }
        return res;
    }
}

执行结果相同。

练习:
要求: 金额转换, 将数字转换为大写汉字, 汉字一共是七位.

代码:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        System.out.print("请输入一个整数: ");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        char[] arr1 = {'零', '零', '零', '零', '零', '零', '零'};
        char[] arr2 = {'佰', '拾', '万', '仟', '佰', '拾', '元'};
        int tmp = num;
        int index = arr1.length - 1;
        while (tmp != 0) {
            int n = tmp % 10;
            tmp = tmp / 10;
            char c = toChar(n);
            arr1[index] = c;
            index--;
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]);
            System.out.print(arr2[i]);
        }
    }

    // 将数字转换为对应的汉字
    public static char toChar(int n) {
        switch (n) {
            case 0:
                return '零';
            case 1:
                return '壹';
            case 2:
                return '贰';
            case 3:
                return '叁';
            case 4:
                return '肆';
            case 5:
                return '伍';
            case 6:
                return '陆';
            case 7:
                return '柒';
            case 8:
                return '捌';
            case 9:
                return '玖';
            default:
                return '拾';
        }
    }
}

另一种写法:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num;

        char[] arr1 = {'零', '零', '零', '零', '零', '零', '零'};  // 数字
        char[] arr2 = {'佰', '拾', '万', '仟', '佰', '拾', '元'};  // 单位

        // 输入整数并检查范围的正确性
        while (true) {
            System.out.print("请输入一个整数: ");
            num = sc.nextInt();
            if (num >= 0 && num <= 9999999) {
                break;
            } else {
                System.out.println("金额输入错误, 请重新输入.");
            }
        }

        // 将 arr1 中的数字转换为大写的中文
        int index = arr1.length - 1;
        while (num != 0) {
            int n = num % 10;
            num /= 10;
            char c = getCapital(n);
            arr1[index] = c;  // 直接修改 arr1
            index--;
        }

        // 把大写的数字和单位拼接为一个字符串
        String res = "";
        for (int i = 0; i < arr1.length; i++) {
            res = res + arr1[i] + arr2[i];
        }

        System.out.println(res);
    }

    // 将数字转换为大写的中文
    private static char getCapital(int num) {
        char[] hashMap = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
        return hashMap[num];
    }
}

另一种写法:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        char[] arr1 = {'零', '零', '零', '零', '零', '零', '零'};  // 数字
        char[] arr2 = {'佰', '拾', '万', '仟', '佰', '拾', '元'};  // 单位
        System.out.print("请输入一个整数: ");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        char[] arr3 = convertNum(num);
        for (int i = arr3.length - 1, j = arr1.length - 1; i >= 0; i--, j--) {  // arr1 和 arr3 的索引要分开
            arr1[j] = arr3[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i] + "" + arr2[i]);
        }
    }

    public static char[] convertNum(int num) {
        String s = num + "";  // 数字转化为字符串
        char[] arr = s.toCharArray();  // 字符串转化为数组, 因为数字不能直接转化为数组, 所以借助字符串为媒介
        char[] newArr = new char[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = toChar(arr[i]);
        }
        return newArr;
    }

    // 将数字字符转换为对应的汉字
    public static char toChar(char n) {
        int num = n - '0';
        char[] hashMap = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
        return hashMap[num];
    }
}

执行结果:

请输入一个整数: 2135
零佰零拾零万贰仟壹佰叁拾伍元

另一种写法:

import java.util.Scanner;

public class Test {
    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];
    }
}

substring() 方法

String 类的 substring() 方法可以从一个较大的字符串提取出一个子串。

类似于 C 和 C++,Java 字符串中的代码单元和码点从 0 开始计数。

String substring(int beginIndex, int endIndex);  // 区间范围: 左闭右开.

substring 的工作方式有一个优点:很容易计算子串的长度,字符串 s.substring(a, b) 的长度为 b-a。

有一个重载的方法:

String substring(int beginIndex);  // 默认截取到末尾. 

substring 返回一个新的字符串,对原始的字符串没有影响。

练习:手机号屏蔽

程序示例:

public class Test {
    public static void main(String[] args) {
        // 先给定一个手机号
        String phoneNumber = "15940379881";
        // 截取前三位
        String start = phoneNumber.substring(0, 3);
        // 截取后四位
        String end = phoneNumber.substring(7);
        // 拼接
        String result = start + "****" + end;
        // 打印
        System.out.println(result);
    }
}

执行结果:

159****9881

练习:
身份证查看
1, 2 位:省份
3, 4 位:城市
5, 6 位:区县
7-14 位:出生年, 月, 日
15, 16 位:所在地派出所
17 位: 性别(奇数男性,偶数女性)
18 位:个人信息码(随机产生)
根据信息:
7-14 位: 出生年, 月, 日
17 位: 性别(奇数男性,偶数女性)
打印信息:
人物信息为
出生年月日: XXXX年X月X日
性别为: 男/女

程序示例:

public class StringDemo1 {
    public static void main(String[] args) {
        String num = "342625199707300017";
        String year = num.substring(6, 10);
        String month = num.substring(10, 12);
        String day = num.substring(12, 14);
        String gender = num.substring(16, 17);
        char gen;
        if (Integer.parseInt(gender) % 2 == 1)
            gen = '男';
        else gen = '女';
        System.out.println("人物信息为:");
        System.out.println("出生年月日: " + year + "年" + month + "月" + day + "日");
        System.out.println("性别为: " + gen);
    }
}

执行结果:

人物信息为:
出生年月日: 1997年07月30日
性别为: 男

replace()

Java 提供了一个方法执行替换:String replace(旧值, 新值);

练习: 敏感词替换

代码 1:

public class StringDemo1 {
    public static void main(String[] args) {
        String talk = "你真的, TMD";
        // 将敏感词 TMD 替换为 ***
        String res = talk.replace("TMD", "***");
        System.out.println(res);
    }
}

执行结果:

你真的, ***

代码 2,有多个敏感词的情况:

public class StringDemo1 {
    public static void main(String[] args) {
        String talk = "你真的, TMD, SB, CNM";
        // 将敏感词替换为 ***
        // 定义一个敏感词库
        String[] arr = {"TMD", "SB", "CNM"};
        for (int i = 0; i < arr.length; i++) {
            talk = talk.replace(arr[i], "***");
        }
        System.out.println(talk);
    }

执行结果:

你真的, ***, ***, ***

一个字符串中有多个相同敏感词的情况:

public class StringDemo1 {
    public static void main(String[] args) {
        String talk = "你真的, SB, SB, SB";
        // 将敏感词替换为 ***
        talk = talk.replace("SB", "***");  // 替换之后的字符串赋值给 talk
        System.out.println(talk);
    }
}

执行结果:

你真的, ***, ***, ***

可以看见,一次性进行了全部替换。

字符串中没有需要替换的内容时,替换不起作用,相当于没有进行这一步。

join()

如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态 join() 方法。

程序示例:

public class StringDemo {
    public static void main(String[] args) {
        String all = String.join("/", "S", "M", "L", "XL");
        System.out.println(all);  // S/M/L/XL
    }
}

repeat()

在 Java11 中还提供了一个 repeat() 方法。

程序示例:

public class StringDemo {
    public static void main(String[] args) {
        String repeated = "Java".repeat(3);
        System.out.println(repeated);  // JavaJavaJava
    }
}

基本数据类型和 String 类型的转换

在程序开发中经常需要将基本数据类型转成 String 类型,或者将 String 类型转成基本数据类型。

基本类型转字符串:基本类型 + ""

程序示例:

public class StringToBasic {
    public static void main(String[] args) {
        int n1 = 100;
        float f1 = 1.1F;
        double d1 = 4.5;
        boolean b1 = true;
        String s1 = n1 + "";
        String s2 = f1 + "";
        String s3 = d1 + "";
        String s4 = b1 + "";
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
    }
}

运行结果:

100
1.1
4.5
true

String 类型转基本数据类型语法:通过基本类型的包装类调用 parseXX 方法即可,XX 对应着一个类型。

Java 里每一个基本数据类型都对应一个包装类。

程序示例:

public class StringToBasic {
    public static void main(String[] args) {
        String s5 = "123";
        int num1 = Integer.parseInt(s5);
        double num2 = Double.parseDouble(s5);
        float num3 = Float.parseFloat(s5);
        long num4 = Long.parseLong(s5);
        byte num5 = Byte.parseByte(s5);
        boolean b = Boolean.parseBoolean("true");
        short num6 = Short.parseShort(s5);
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(num4);
        System.out.println(num5);
        System.out.println(num6);
        System.out.println(b);
    }
}

运行结果:

123
123.0
123.0
123
123
123
true

在将 String 类型转成基本数据类型时,要确保 String 类型能够转成有有效的数据,比如可以把 "123" 转成一个整数,但是不能把 "hello" 转成一个整数。如果格式不正确,就会抛出异常,程序就会终止,这个异常在编译时不会发现,在执行时会体现出来。

文本块

利用 Java 15 新增的文本块(textblock)特性可以很容易地提供跨多行的字符串字面量,文本块以 """ 开头(这是开始),后面是一个换行符,并以另一个 """ 结尾(这是结束)

开始 """ 后面的换行符不作为字符串字面量的一部分。

程序示例:

public class Test {
    public static void main(String[] args) {
        String s1 = """
                ok
                hello
                morning""";  // 如果不想要最后一行后面的换行符, 可以让结束紧跟在最后一个字符后面
        System.out.println(s1);
        System.out.println("==========================");
        String s2 = """
                ni
                hao
                a
                """;
        System.out.println(s2);
        System.out.println("=======================");
        // 有一个转义序列只能在文本块中使用. 行尾的 \ 会把这一行与下一行连接起来.
        String s3 = """
                hello \
                world""";
        System.out.println(s3);
        System.out.println("===========================");
    }
}

执行结果:

ok
hello
morning
==========================
ni
hao
a

=======================
hello world
===========================
posted @ 2026-04-06 11:52  YouKong  阅读(0)  评论(0)    收藏  举报