字符串和编码
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
编码