2020/7/10 JAVA常用Api之String類和字串緩衝區、正則表示式
一、String類
1、String類的概述:
查閱API中的String類的描述,發現String 類代表字串。Java 程式中的所有字串字面值(如 "abc" )都作為此類的例項實現。
//演示字串 String str = "oracle"; str = "甲骨文";
繼續查閱API發現說字串是常量;它們的值在建立之後不能更改,這是什麼意思呢?
其實就是說一旦這個字串確定了,那麼就會在記憶體區域中就生成了這個字串。字串本身不能改變,但str變數中記錄的地址值是可以改變的。
字串的本質是一個字元的陣列。
String s3 = "abc"; String s4= new String("abc"); System.out.println(s3==s4);//false System.out.println(s3.equals(s4));//true, //因為String重寫了equals方法,建立了字串自己的判斷相同的依據(通過字串物件中的字元來判斷)
s3和s4的建立方式有什麼不同呢?
s3建立,在記憶體中只有一個物件。這個物件在字串常量池中
s4建立,在記憶體中有兩個物件。一個new的物件在堆中,一個字串本身物件,在字串常量池中
2、String類構造方法
String s1 = newString(); //建立String物件,字串中沒有內容 byte[] bys = new byte[]{97,98,99,100}; String s2 = new String(bys); // 建立String物件,把陣列元素作為字串的內容 String s3 = new String(bys, 1, 3); //建立String物件,把一部分陣列元素作為字串的內容,引數offset為陣列元素的起始索引位置,引數length為要幾個元素 char[] chs = new char[]{’a’,’b’,’c’,’d’,’e’}; String s4= new String(chs); //建立String物件,把陣列元素作為字串的內容 String s5 = new String(chs, 0, 3);//建立String物件,把一部分陣列元素作為字串的內容,引數offset為陣列元素的起始索引位置,引數count為要幾個元素 String s6 = new String(“abc”); //建立String物件,字串內容為abc
3、String類的方法
1)字串中有多少個字元?
String str = "abcde"; int len = str.length(); System.out.println("len="+len);
2)獲取部分字串
String str = "abcde"; String s1 = str.substring(1); //返回一個新字串,內容為指定位置開始到字串末尾的所有字元 String s2 = str.substring(2, 4);//返回一個新字串,內容為指定位置開始到指定位置結束所有字元 System.out.println("str="+str); System.out.println("s1="+s1); System.out.println("s2="+s2);
3)字串是否以指定字串開頭。結尾同理。
String str = "StringDemo.java"; boolean b1 = str.startsWith("Demo");//判斷是否以給定字串開頭 boolean b2 = str.startsWith("String"); boolean b3 = str.endsWith("java");//判斷是否以給定字串結尾
4)字串中是否包含另一個字串
String str = "abcde"; int index = str.indexOf(“bcd”); //判斷是否包含指定字串,包含則返回第一次出現該字串的索引,不包含則返回-1 boolean b2 = str.contains("bcd");//判斷是否包含指定字串,包含返回true,不包含返回false
5)將字串轉成一個字元陣列。或者位元組陣列。
String str = "abcde"; char[] chs = str.toCharArray(); byte[] bytes = str.getBytes();
6)判斷兩個字串中的內容是否相同
7)其他方法如下程式碼所示:
String str = "abcde"; String str2 = "abcde"; String str3 = "hello"; boolean b1 = str.equals(str2); boolean b2 = str.equals(str3);
//判斷該字串的內容是否為空的字串 String a=""; System.out.println(a.isEmpty()); //獲取給定的字元,在該字串中第一次出現的位置 String b="java"; System.out.println(b.indexOf("a")); //獲取該字串中指定位置上的字元 System.out.println(b.charAt(3)); //把該字串轉換成 小寫字串 String c="JAVA"; System.out.println(c.toLowerCase()); //把該字串轉換成 大寫字串 System.out.println(b.toUpperCase()); //在該字串中,將給定的舊字元,用新字元替換 System.out.println(b.replace('a', 'b')); //在該字串中, 將給定的舊字串,用新字串替換 String d="你好阿達大阿達"; System.out.println(d.replace("阿達", "哈哈")); //去除字串兩端空格,中間的不會去除,返回一個新字串 String e=" 我我 我我我 "; System.out.println(e.trim());
二、字串緩衝區
1、StringBuffer類
查閱StringBuffer的API,StringBuffer又稱為可變字元序列,它是一個類似於 String 的字串緩衝區,通過某些方法呼叫可以改變該序列的長度和內容。
原來StringBuffer是個字串的緩衝區,即就是它是一個容器,容器中可以裝很多字串。並且能夠對其中的字串進行各種操作。
2、StringBuffer的方法使用
程式碼演示:
建立一個字串緩衝區物件。用於儲存資料。 StringBuffer sb = new StringBuffer(); sb.append("haha"); //新增字串 sb.insert(2, "it");//在指定位置插入 sb.delete(1, 4);//刪除 sb.replace(1, 4, "cast");//替換指定範圍內的內容 String str = sb.toString();
//從指定位置開始,到末尾結束,擷取該字串緩衝區,返回新字串 StringBuffer sb=new StringBuffer("abcdefg"); String ss=sb.substring(1,4); System.out.println(ss); //在原有字串緩衝區內容基礎上,刪除指定位置上的字元 sb=sb.deleteCharAt(2); System.out.println(sb);
3、物件的方法鏈式呼叫
程式碼如下:
建立一個字串緩衝區物件。用於儲存資料。 StringBuffer sb = new StringBuffer(); 新增資料。不斷的新增資料後,要對緩衝區的最後的資料進行操作,必須轉成字串才可以。 String str = sb.append(true).append("hehe").toString();
4、StringBuilder類
我們閱讀StringBuilder的API說明發現,它也是一個可變的字元序列。此類提供一個與 StringBuffer 相容的 API,但不保證同步。
該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。
如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。
三、正則表示式
1、概念:
正則表示式(英語:Regular Expression,在程式碼中常簡寫為regex)。
正則表示式是一個字串,使用單個字元串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字串。
在開發中,正則表示式通常被用來檢索、替換那些符合某個規則的文字。Pattern
2、正則表示式匹配規則
正則表示式的語法規則:
字元:x
含義:代表的是字元x
例如:匹配規則為 "a",那麼需要匹配的字串內容就是 ”a”
字元:\\
含義:代表的是反斜線字元'\'
例如:匹配規則為"\\" ,那麼需要匹配的字串內容就是 ”\”
字元:\t
含義:製表符
例如:匹配規則為"\t" ,那麼對應的效果就是產生一個製表符的空間
字元:\n
含義:換行符
例如:匹配規則為"\n",那麼對應的效果就是換行,游標在原有位置的下一行
字元:\r
含義:回車符
例如:匹配規則為"\r" ,那麼對應的效果就是回車後的效果,游標來到下一行行首
字元類:[abc]
含義:代表的是字元a、b 或 c
例如:匹配規則為"[abc]" ,那麼需要匹配的內容就是字元a,或者字元b,或字元c的一個
字元類:[^abc]
含義:代表的是除了 a、b 或 c以外的任何字元
例如:匹配規則為"[^abc]",那麼需要匹配的內容就是不是字元a,或者不是字元b,或不是字元c的任意一個字元
字元類:[a-zA-Z]
含義:代表的是a 到 z 或 A 到 Z,兩頭的字母包括在內
例如:匹配規則為"[a-zA-Z]",那麼需要匹配的是一個大寫或者小寫字母
字元類:[0-9]
含義:代表的是 0到9數字,兩頭的數字包括在內
例如:匹配規則為"[0-9]",那麼需要匹配的是一個數字
字元類:[a-zA-Z_0-9]
含義:代表的字母或者數字或者下劃線(即單詞字元)
例如:匹配規則為" [a-zA-Z_0-9] ",那麼需要匹配的是一個字母或者是一個數字或一個下滑線
預定義字元類:.
含義:代表的是任何字元
例如:匹配規則為" . ",那麼需要匹配的是一個任意字元。如果,就想使用 . 的話,使用匹配規則"\\."來實現
預定義字元類:\d
含義:代表的是 0到9數字,兩頭的數字包括在內,相當於[0-9]
例如:匹配規則為"\d ",那麼需要匹配的是一個數字
預定義字元類:\w
含義:代表的字母或者數字或者下劃線(即單詞字元),相當於[a-zA-Z_0-9]
例如:匹配規則為"\w ",,那麼需要匹配的是一個字母或者是一個數字或一個下滑線
邊界匹配器:^
含義:代表的是行的開頭
例如:匹配規則為^[abc][0-9]$ ,那麼需要匹配的內容從[abc]這個位置開始, 相當於左雙引號
邊界匹配器:$
含義:代表的是行的結尾
例如:匹配規則為^[abc][0-9]$ ,那麼需要匹配的內容以[0-9]這個結束, 相當於右雙引號
邊界匹配器:\b
含義:代表的是單詞邊界
例如:匹配規則為"\b[abc]\b" ,那麼代表的是字母a或b或c的左右兩邊需要的是非單詞字元([a-zA-Z_0-9])
數量詞:X?
含義:代表的是X出現一次或一次也沒有
例如:匹配規則為"a?",那麼需要匹配的內容是一個字元a,或者一個a都沒有
數量詞:X*
含義:代表的是X出現零次或多次
例如:匹配規則為"a*" ,那麼需要匹配的內容是多個字元a,或者一個a都沒有
數量詞:X+
含義:代表的是X出現一次或多次
例如:匹配規則為"a+",那麼需要匹配的內容是多個字元a,或者一個a
數量詞:X{n}
含義:代表的是X出現恰好 n 次
例如:匹配規則為"a{5}",那麼需要匹配的內容是5個字元a
數量詞:X{n,}
含義:代表的是X出現至少 n 次
例如:匹配規則為"a{5, }",那麼需要匹配的內容是最少有5個字元a
數量詞:X{n,m}
含義:代表的是X出現至少 n 次,但是不超過 m 次
例如:匹配規則為"a{5,8}",那麼需要匹配的內容是有5個字元a 到 8個字元a之間
3、字串類中涉及正則表示式的常用方法