字符串和编码
约 1113 字大约 4 分钟
2024-08-08
String
在 Java 中,String 是一个引用类型,它本身也是一个 class
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}Java 字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的 private final char[] 字段,以及没有任何修改 char[] 的方法实现的
字符串比较
当我们想要比较两个字符串是否相同时,必须使用 equals() 方法而不能用 ==
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
}Java 编译器在编译期,会自动把所有相同的字符串当作一个对象放入常量池,自然 str1 和 str2 的引用就是相同的
去除首尾空白字符
使用 trim() 方法可以移除字符串首尾空白字符。空白字符包括空格、\t、\r、\n
" \tHello\r\n ".trim(); // "Hello"strip() 方法也可以移除字符串首尾空白字符。它和 trim() 不同的是,类似中文的空格字符 \u3000 也会被移除
"\u3000Hello\u3000".strip(); // "Hello"
" Hello ".stripLeading(); // "Hello "
" Hello ".stripTrailing(); // " Hello"String 还提供了 isEmpty() 和 isBlank() 来判断字符串是否为空和空白字符串
"".isEmpty(); // true,因为字符串长度为0
" ".isEmpty(); // false,因为字符串长度不为0
" \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符替换子串
根据字符或字符串替换
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"分割字符串
String str = "A,B,C,D";
String[] split = str.split(","); // {"A", "B", "C", "D"}字符串数组拼接
字符串数组拼接使用静态方法 join(),它用指定的字符串连接字符串数组
public static void main(String[] args) {
String[] arr1 = {"A", "B", "C", "D"};
List<String> arr2 = Arrays.asList("A2", "B2", "C2", "D2");
String str1 = String.join("-", arr1);
String str2 = String.join("-", arr2);
System.out.println(str1); // A-B-C-D
System.out.println(str2); // A2-B2-C2-D2
}格式化字符串
字符串提供了 format() 静态方法,可以传入其他参数,替换占位符,然后生成新的字符串
public static void main(String[] args) {
String str = "Hello %s!, your age is %d";
System.out.println(String.format(str, "marui", 23)); // Hello marui!, your age is 23
}占位符
%s:显示字符串%d:显示整数%x:显示十六进制整数%f:显示浮点数
类型转换
要把任意基本类型或引用类型转换为字符串,可以使用静态方法 valueOf()。这是一个重载方法,编译器会根据参数自动选择合适的方法
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // java.lang.Object@4554617c要把字符串转换为其他类型,就需要根据情况
把字符串转换为 int 类型
int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255把字符串转换为 boolean 类型
boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false转换为char[]
String 和 char[] 类型可以互相转换
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String字符编码
在Java中,char 类型实际上就是两个字节的 Unicode 编码。我们可以手动把字符串转换成其他编码
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] b1 = "Hello".getBytes(); // 按系统默认编码转换,不推荐
byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换
byte[] b2 = "Hello,你好".getBytes("GBK"); // 按GBK编码转换
byte[] b3 = "Hello,你好".getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换
System.out.println(Arrays.toString(b2)); // [72, 101, 108, 108, 111, 44, -60, -29, -70, -61]
System.out.println(Arrays.toString(b3)); // [72, 101, 108, 108, 111, 44, -28, -67, -96, -27, -91, -67]
}把已知编码的 byte[] 转换为 String
String s1 = new String(b2, "GBK"); // 按GBK转换
String s2 = new String(b3, StandardCharsets.UTF_8); // 按UTF-8转换
System.out.println(s1); // Hello,你好
System.out.println(s2); // Hello,你好小结
Java字符串String是不可变对象字符串操作不改变原字符串内容,而是返回新字符串
常用的字符串操作:提取子串、查找、替换、大小写转换等
Java使用Unicode编码表示String和char转换编码就是将
String和byte[]转换,需要指定编码转换为
byte[]时,始终优先考虑UTF-8编码