在Java中,String是一个引用类型,它本身也是一个class。但是,Java编译器对String有特殊处理,即可以直接用"…"来表示一个字符串。
字符串的表示方式有3种:
package program;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
String s1 = "s1"; // 第一种
String s2 = new String("s2"); // 第二种
String s3 = new String(new char[] {'s','3'}); // 第三种
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
实际上字符串在String内部是通过一个char[]数组表示的.
Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段,以及没有任何修改char[]的方法实现的。
字符串比较
比较字符串的内容是否相同时,必须使用equals()方法而不能用==。因为==是比较地址是否相同,而equals才是比较字符串内容是否相同。
我们先看个例子:
public class Main {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
从表面上看,两个字符串用==
和equals()比较都为true,但实际上那只是Java编译器在编译期,会自动把所有相同的字符串当作一个对象放入常量池,自然s1和s2的引用就是相同的。所以==
为true。所以,这种==
比较返回true纯属巧合。换一种写法,==
比较就会失败:
public class Main {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO".toLowerCase();
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
因为这是运行时做的事情,而不是编译时。
要忽略大小写比较,使用equalsIgnoreCase()方法。
Demo:
package program;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
String s1 = "Hello";
String s2 = "heLLo";
System.out.println(s1.equalsIgnoreCase(s2));
}
}
String类还提供了多种方法来搜索子串、提取子串。常用的方法有:
in运算。
// 子串是否存在
"Hello".contains("ll"); // true
// 相当于python中的 "ll" in "Hello"
注意到contains()方法的参数是CharSequence而不是String,因为CharSequence是String的父类。所以说在这儿只能老老实实的穿字符串,而不是字符数组。因为CharSequence可不是Char的父类。
更多实例:
字符串索引:
String ss = "fsfgeth";
ss.charAt(3); // g
// ss.charAt(index)
字符串长度:
String ss = "fdsgg";
ss.length(); // 5
子串替换:
String ss = "dsa";
String kk = ss.replace("d","fff"); // old串, new串
System.out.println(kk); // fffsa
子串位置搜索:
"Hello".indexOf("l"); // 2 找第一个l的index
"Hello".lastIndexOf("l"); // 3 找最后一个l的index
是否以…开头/结尾:
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
字符串切片:
"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"
字符串分割:
split接受的参数是一个正则字符串
String ss = "dsa ";
String[] arr = ss.split("");
System.out.println(Arrays.toString(arr)); // ["d","s","a"]
arr = ss.split("s");// ["d","a "]
注意和python的区别,python如果是split()的话,会按照空白分割。
把大写字母变小写:
String ss = "dsa A12";
String kk = ss.toLowerCase();
System.out.println(kk);
小写字母变大写:
String ss = "dsa A12";
String kk = ss.toUpperCase();
System.out.println(kk);
字符串拼接:
效率比直接用加号好很多。
String ss = "dsa A12";
String kk = ss.concat(ss); // 字符串拼接
System.out.println(kk);
静态join方法:
String[] arr = {"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"
去掉首位空白字符:
忽略大小写比较串是否相等:
String ss = "dasd";
System.out.println(ss.equalsIgnoreCase("DASD")); // true
获得某个index的元素的码点(即 a: 97之类的值):
String ss = "我啊";
System.out.println(ss.codePointAt(1)); // 21834
// 原因:啊的utf码点为21834
字符串比较大小:
按照字典序逐一比较。
String ss = "abc";
System.out.println(ss.compareTo("abc"));
相等返回0,ss小于参数返回-1,大于返回1。
字符串相等判断,接受StringBuffer类型:
String ss = "abd";
System.out.println(ss.contentEquals("fds"));
字符串转字符数组:
String ss = "abd";
char[] dst = new char[ss.length()];
ss.getChars(0,3,dst,0);
System.out.println(Arrays.toString(dst));