基础
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
的线程安全版本(因此效率较低)。StringBuilder
和StringBuffer
接口完全相同,现在完全没有必要使用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