Java字符串

本篇主要记录Java字符串的一些相关知识,以便巩固。

基础

String是一个引用类型[1],它本身是个class。但是,Java编译器对String有特殊处理,即可以直接用"..."来表示一个字符串 。

Java字符串的一个重要特点就是字符串不可变

字符串比较:

public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = "HELLO".toLowerCase();
        System.out.println(s1 == s2);  //true
        System.out.println(s1 == s3);  //false
        System.out.println(s1.equals(s3));  //true
    }
}

“==”若用于引用类型比较的是所指向的地址,若用于基本类型则比较的是值。“equals()”不能用于基本数据类型,若无重写,比较的是地址,但是String等类对其进行了重写,比较的是内容。
Java编译器在编译期,会自动把所有相同的字符串当作一个对象放入常量池,所以上面s1==s2是true,换种方式就不行了。

常用操作:

//搜索子串
"Hello".contains("ll"); // true
"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
//提取子串
"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"
//修改(注意:此处不是真的修改,只是返回个新的。想修改变量的值得把新的字符串赋值给变量。)
"  \tHello\r\n ".trim(); // "Hello",移除空格,\t,\r,\n
"\u3000Hello\u3000".strip(); // "Hello",可以移除的包括中文空格\u3000
" Hello ".stripLeading(); // "Hello "
" Hello ".stripTrailing(); // " Hello"
String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"
String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"
//判断空字符串
"".isEmpty(); // true,因为字符串长度为0
"  ".isEmpty(); // false,因为字符串长度不为0
"  \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符
//分割,拼接
String s = "A,B,C,D";
String[] ss = s.split("\\,"); // 传进去的是正则表达式
String[] ss = s.split("\\s+"); //分割空格不要用" "," "只能匹配一个。
String[] arr = {"A", "B", "C"};
String s = String.join("***", arr);//"A***B***C"
//与char[]的转换
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

[1] 与之相对,int等则是基本类型。 引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置。

StringBuilder

String s = "";
for (int i = 0; i < 1000; i++) {
    s = s + "," + i;
}

这种操作每次都会创建新的字符串对象,然后扔掉旧的,浪费内存,影响GC效率。

为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区 。StringBuffer是Java早期的一个StringBuilder的线程安全版本(因此效率较低)。StringBuilderStringBuffer接口完全相同,现在完全没有必要使用StringBuffer

public class Main {
    public static void main(String[] args) {
        var sb = new StringBuilder(1024);
        sb.append("Mr ")
          .append("Bob")
          .append("!")
          .insert(0, "Hello, ");
        System.out.println(sb.toString()); //"Hello, Mr Bob!"
    }
}

StringBuilder进行链式操作的关键是,定义的append()方法会返回this,这样,就可以不断调用自身的其他方法。

参考资料

·https://www.liaoxuefeng.com/wiki/1252599548343744/1260469698963456

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注