String
equals() | == |
---|---|
重寫后比較的是數據內容 | 引用類型比較地址,基本類型比較本身值 |
虛擬機的內存劃分為棧、堆、方法區。
方法區內又為String開辟了一塊字符串常量池。
String str = "測試";
先檢查字符串常量池中有沒有對應的字符串,有則直接調用,沒有則創建。變量地址 str 指向 String 所在的字符串常量池。
String str = new String("測試");
先檢查字符串常量池中有沒有對應的字符串,有則直接調用,沒則有則創建,并且在堆內存中開辟一塊空間,將字符串常量池中的復制一份給堆內存,返回堆內存地址。
注意
public static void changed(String str) {
if ("測試".equals(str)) {
}
}
一般在開發中用常量調用equals()去比較,
因為用變量如果傳入Null,會報NullPointerException。
StringBuffer
1.字符串是常量,它們的值在創建之后不能更改。
2..字符串的內容不適宜頻繁修改,因為字符串的內容一旦發生變化,就會創建一個新的對象,若要頻繁修改字符串的內容,建議使用字符串緩沖類。
StringBuffer 其實就是一個存儲字符的容器,底層是依賴一個字符數組做存儲,默認構造方法16個字符,如果不夠使用,自動增長一倍。
StringBuffer 和 StringBuilder 的區別
StringBuffer 可以保證線程安全,但是相應速度慢,而StringBuilder則相反。
實際開發中一般用StringBuilder,因為很少在線程中頻繁操作字符串。
正則
正則表達式就是操作字符串的一個規則。
預定義字符
任何預定義字符,在沒有加上數量之前都只能匹配一個字符。
預定義字符 | 作用 |
---|---|
. | 任何字符 |
\d | 數字:[0-9] |
\D | 非數字字符(除了0-9):[^0-9] |
\s | 空白字符:[\t\n\x08\f\r] |
\s | 空白字符:[\t\n\x08\f\r] |
\S | 非空白字符:[^\s] |
\w | 單詞字符[a-zA-Z_0-9] |
\W | 非單詞字符[^\w] |
public static void main(String[] args) {
/**
* 預定義字符
*/
System.out.println("任意字符:" + ("%".matches(".")));
System.out.println("數字字符:" + ("12".matches("\\d\\d")));
System.out.println("非數字字符:" + ("a".matches("\\D")));
System.out.println("空白字符:" + ("\r".matches("\\s")));
System.out.println("非空白字符:" + ("a".matches("\\S")));
System.out.println("單詞字符:" + ("a".matches("\\w")));
System.out.println("非單詞字符:" + (".".matches("\\W")));
}
數量詞
數量詞 | 作用 |
---|---|
? | 一次或一次也沒有 |
* | 零次或多次 |
+ | 一次或多次 |
{n} | 恰好n次 |
{n,} | 至少n次 |
{n,m} | 至少n次,但是不超過m次 |
public static void main(String[] args) {
/**
* 數量詞
*/
System.out.println("?一次或一次也沒有:" + ("1".matches("\\d?")));
System.out.println("*零次或多次:" + ("11".matches("\\d*")));
System.out.println("+至少出現一次:" + ("11".matches("\\d+")));
// 只能出現十一位
System.out.println("{次數}恰好出現n次:" + ("11".matches("\\d{11}")));
// 至少要出現三次,沒有上限
System.out.println("{次數,}至少要出現指定的次數:" + ("111".matches("\\d{3,}")));
// 指定出現次數為3-4次
System.out.println("{次數1,次數2指定次數出現的范圍}" + "11144".matches("\\d{3,4}"));
}
字符類(范圍詞)
范圍詞里面不管內容有多長,沒有數量詞的配合都只能匹配一個字符而已
范圍詞 | 作用 |
---|---|
[abc] | 只包含a,b,c |
[^abc] | 任何字符,除了a、b或c |
[a-zA-Z] | a到z或A到Z,兩頭的字母包括在內 |
[a-d[m-p]] | a到d或m到p |
[a-z&&[def]] | d、e或f(交集) |
public static void main(String[] args) {
/**
* 范圍詞
*/
System.out.println("[abc]:" + "abc".matches("[abc]{3}"));
//除了abc以外
System.out.println("[abc]:" + "@ss".matches("[^abc]{3}"));
//字符可以出現a-z,A-Z,$#
System.out.println("[abc]:" + "ass".matches("[a-zA-Z$#]{3}"));
}
匹配,分割
public class Run {
public static void main(String[] args) {
matchesPhone("13390580000");
mathcesTel("020-12345678");
spiltTest1();
spiltTest2();
}
// 匹配手機號,第一位 1開頭,第二位3,5,4,7,8,共11位
public static void matchesPhone(String phone) {
String reg = "1[34578]\\d{9}";
System.out.println(phone.matches(reg) ? "合法" : "非法");
}
// 匹配固定號碼,區號-主機號 區號:首位0,長度3-4位 主機號:首位不能為0,長度7-8
public static void mathcesTel(String tel) {
String tell = "0\\d{2,3}-[1-9]\\d{6,7}";
System.out.println(tel.matches(tell) ? "合法" : "非法");
}
// 切割空格
public static void spiltTest1() {
String str = "測 試 切 割";
String[] arr = str.split(" +");
System.out.println(Arrays.toString(arr));
}
//根據重疊詞切割
public static void spiltTest2(){
String str = "紅火火火白恍恍恍藍忽忽";
//如果正則的內容需要被復用,那么需要對正則的內容進行分組,分組的目的就是為了提高正則的復用性
//組號不能指定,組號是從1開始,\\1代表引用第一組鎖匹配的內容
String[] arr = str.split("(.)\\1+");
System.out.println(Arrays.toString(arr));
}
}