String
String是char[]
数组
实际上字符串在String内部是通过一个char[]
数组表示的,因此,String x = "Hello"
也可以改成下面的写法:
String x = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});
Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]
字段,并且没有暴露任何修改char[]
的方法供外部调用。
如下,字符串是不可变的,可以看到字符串 “Hello” 并没有改变,只是将内存单元中s1存储的内容更改为新创建的字符串 “HELLO” 的引用,我们通过s2还是可以访问字符串 “Hello” 。
public static void main(String[] args) {
String s1 = "Hello";
String s2 = s1;
s1 = s1.toUpperCase();
System.out.println(s1); // HELLO
System.out.println(s2); // Hello
}
String
和char[]
类型可以互相转换,如下进行互相转换。
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String
1)字符串比较
由于字符串比较中,我们的意图总是比较字符串的每个char字符值是否相同,而不是比较字符串变量在内存单元中是否存储的是同一个字符串的引用。所以字符串比较总是使用equals
方法,不会使用==
。要忽略大小写比较,使用equalsIgnoreCase()
方法。
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO".toLowerCase();
String s3 = "HELLO";
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // false
System.out.println(s1.equalsIgnoreCase(s3)); // true
}
2)搜索子串、提取子串
public static void main(String[] args) {
// 是否包含子串:
System.out.println( "Hi Michael".contains("cha") ); // true
System.out.println( "Hi Michael".startsWith("Hi") ); // true
System.out.println( "Hi Michael".endsWith("el") ); // true
//搜索
System.out.println( "Hello".indexOf("e") ); // 1
System.out.println( "Hello".lastIndexOf("l") ); // 3
//提取子串
System.out.println( "Hello".substring(2) ); // "llo"
System.out.println( "Hello".substring(2, 4) ); // "ll",左闭右开
}
3)字符串是否为空 和 空白字符串
字符串为空就是指字符串长度为0,空白字符串就是指该字符串只包含空格(字符串长度等于空格的个数)。
isEmpty()判断字符串是否为空(字符串长度为0)
public boolean isEmpty() {
return value.length == 0;
}
isBlank()判断是否是空白字符串indexOfNonWhitespace()
返回值是字符串中空格字符的个数,也就是如果空格字符的个数等于字符串的长度,说明该字符串全部由空格组成,称之为空白字符串。\t是空格的转义字符表示,\r是回车,\n是换行,它们都表示空格。
public boolean isBlank() {
return indexOfNonWhitespace() == length();
}
demo
public static void main(String[] args) {
System.out.println( "".isEmpty() ); // true,因为字符串长度为0
System.out.println( " ".isEmpty() ); // false,因为字符串长度不为0
System.out.println( "".isBlank() ); // true,因为字符串长度为0,空格个数也为0
System.out.println( "\t \r \n".length() ); // 5 ; \t是空格的转义字符表示,\r是回车,\n是换行,这几个转义字符都表示空格
System.out.println( "\t \n \n".isBlank() ); // true,因为字符串长度为5,包含的5个字符都表示空格
System.out.println( "He llo !".isBlank() ); // false,因为字符串长度为8,空格个数为2,字符串长度不等于空格的个数
}
字符串为空肯定也是空白字符串,因为字符串长度为0,空格个数肯定也是0,字符串长度等于空格个数。
4)替换字符串
要在字符串中替换子串,有两种方法。
根据字符或字符串替换
public static void main(String[] args) {
String s = "hello abc lo end";
System.out.println( s.replace('l', 'w') ); // "hewwo abc wo end",所有字符'l'被替换为'w'
System.out.println( s.replace("lo", "!") ); // "hel! abc ! end",所有子串"lo"被替换为"~~"
}
通过正则表达式替换
public static void main(String[] args) {
String s = "A,,B;C ,D";
System.out.println( s.replaceAll("[\\,\\;\\s]", ",")); // "A,,B,C,,D"
System.out.println( s.replaceAll("[\\,\\;\\s]+", ",")); // "A,B,C,D"
}
在正则表达式中,\s用于匹配空格,为了\不被转义,需要添加\,这样转义后就是\。 +的区别从结果可以看出是匹配到的一个或多个连续字符都是替换为一个
,
,没有+则匹配到的连续字符中每个字符都替换为,
。
5)分割字符串
要分割字符串,使用split()方法,并且传入的也是正则表达式:
String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}
6)拼接字符串
拼接字符串使用静态方法join(),它用指定的字符串连接字符串数组:
String[] arr = {"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"
7)类型转换
要把字符串转换为其他类型,就需要根据情况。
把字符串转换为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
他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!