[趣學程序]java的常用類之String
- 2019 年 10 月 3 日
- 筆記
java基礎之常用類
String類
String表示字符串,所謂字符串,就是一連串的字符,是java中最常用的類之一。
String是不可變類,一旦String對象被創建,包含在對象中的字符序列(內容)是不可變的,直到對象被銷毀;
String對象保存在JVM的常量池中,String類是用final來修飾的,是不可以被繼承的類。
常量池
常量池: JVM中一塊獨立的區域存放字符串常量和基本類型常量(被public static final
修飾的)。
String使用private final char value[]
來實現字符串的存儲,也就是說String對象創建之後
,就不能再修改此對象中存儲的字符串內容,就是因為如此,才說String類型是不可變的.
String對象的創建方式
String str = "HelloWorld"; String str2 = new String("upuptop"); String str3 = String.valueOf(1); String str4 = 123+"";
String對象比較:
單獨使用""
引號創建的字符串都是常量,編譯期就已經確定存儲到常量池中;
使用new String("")
創建的對象會存儲到堆內存中,是運行期新創建的;
使用只包含常量的字符串連接符如"aa" + "bb"
創建的也是常量,編譯期就能確定,已經確定存儲到常量池中;
使用包含變量的字符串連接符如"aa" + s1
創建的對象是運行期才創建的,存儲在堆中;
public class StringDemo { public static void main(String[] args) { /* * "" 其實表示的是 String的匿名對象 */ String s = ""; /** * String() 初始化一個新創建的 String 對象,使其表示一個空字符序列。 * "",不是表示 null * String(String original) * String s = new String("asd");// s 的值就是 asd */ s = new String();//"" String s1 = new String("11"); String s2 = new String("11"); System.out.println(s1 == s2);//false String s3 = "22"; String s4 = "22"; System.out.println(s3 == s4);//true System.out.println(s3 == s2);//false String s5 = "2" + "2";//這句話其實在編譯器編譯後的class文件中 已經變成 "22" //s5創建了幾個對象?//回答:最多一個,如果常量池裏面沒有就是創建一個,如果常量池裡本來就有就是創建零個!下面的str一樣的道理。 String str = "A" +"B"+ "C" +"D" +"E";//String str = "ABCDE"; System.out.println(s3 == s5);//true /** * String特點: 不可變的, 一個String對象的內容不能變,一旦內容變量該對象就變成一個新的String對象了 * String str = "AAA"; * str = str+"12"; */ String str1 = "ABCDE"; System.out.println(str == str1);//true String str2 = "ABC" + "DE"; System.out.println(str == str2);//true String ss = "AB"; String str3 = ss + "CDE";//這裡的str3在運行期才能確定內容值 System.out.println(str3 == str2);//false String str4 = getStr() +"CDE";//在運行期才能確定 str4的值 System.out.println(str == str4);//false System.out.println(str3 == str4);//false /* * String s = "cd"; //一個String對象 s = s + "itcast"; //itcast也是String對象, 最後的s的值cditcast,也是一個String對象 System.out.print(s); * */ } public static String getStr(){ return "AB"; } }
String常用方法
方法名 | 意義 |
---|---|
String() | 初始化一個新的 String 對象,使其表示一個空字符序列,並不是返回空(不等於 null)。 |
String(StringBuffer buffer) | 根據StringBuffer對象來創建String對象; |
String(StringBuilder builder) | 同上 |
char charAt(int index) | 取字符串中指定位置的字符,index從0開始計算。 |
String concat(String str) | 連接字符串,等同於 「+」; |
boolean contentEquals(StringBuffer buffer) | 若二者包含的字符序列相同時就返回true; |
boolean equals(Object obj) | 將該字符串與指定對象比較,若二者包含的字符序列相等返回true; |
boolean equalsIgnoreCase(String anotherString) | 將此 String 與另一個 String 比較,不考慮大小寫; |
byte[] getBytes() | 將該字符串轉換成byte數組; |
int indexOf(String str) | 找出str字符串在該字符串中第一次出現的位置; |
int indexOf(String str, int fromIndex) | 返回指定子字符串在此字符串中第一次出現處的索引,從指定的索引開始; |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最後一次出現處的索引; |
int length() | 返回當前字符串長度; |
String replace(char oldChar, char newChar) | 返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的。 |
String replaceAll(String regex, String replacement) | 使用給定的 字符串replacement 替換此字符串所有的regex字符串; |
boolean startsWith(String prefix) | 測試此字符串是否以指定的前綴開始. |
String[] split(String regex) | 把字符串按指定的字符串分隔開。 |
String substring(int beginIndex) | 返回一個新的字符串,從beginIndex開始截取,它是此字符串的一個子字符串; |
String substring(int beginIndex, int endIndex) | 返回一個新字符串,它是此字符串的一個子字符串;[begin,end) |
char[] toCharArray() | 將此字符串轉換為一個新的字符數組。 |
String toLowerCase() | 將此 String 中的所有字符都轉換為小寫; |
String toUpperCase() | 轉成大寫; |
static String valueOf(基本類型 obj) | 把基本類型值轉成字符串; |
String trim() | 忽略字符串前導空白和尾部空白。 |
String小練習
- 判斷字符串是否由純數字組成:
package reviewDemo; public class Demo20 { public static void main(String[] args) { String s1 = "123456789"; String s2 = "12345 6789"; System.out.print(isnum(s1)); System.out.print(isnum(s2)); } public static boolean isnum(String s){ //將字符串參數轉為字符數組 char []ch = s.toCharArray(); //循環字符數組,判斷每一個元素是否在數字對應的字符區間內 for (char c : ch) { //判斷字符是否在[0-9]這個區間內部 if(!(c > '0' && c <= '9')){ return false; } } return true; } } 輸出: true false
- 判斷字符串是否為空:
分析: 字符串的空有兩種情況:1、null;2、""; package reviewDemo; public class Demo21 { public static void main(String[] args) { String s1 = ""; System.out.println(isimpty(s1)); } public static String isimpty(String s){ if(s != null && !"".equals(s)){ return "不為空"; } return "為空!"; } }
StringBuffer 與 StringBuilder
String是不可變類,一旦String對象被創建,包含在對象中的字符序列是不可變的,直到對象被銷毀;
StringBuffer 與 StringBuilder對象則是可變的!
由於String創建的對象是一個不變化的對象,為了方便在我們使用過程中修改字符串的內容,java為我們提供了StringBUffer和StringBuilder兩個類
StringBuffer是線程安全的類,StringBuilder是線程不安全的類。在多線程環境下使用StringBuffer。
在平時的編程中,我們為了方便,總是使用字符串之間相互加減進行操作修改字符串的內容。 比如: String a = "h"; String b = "e"; String c = "c"; String result = a + b +c +"result" ; 如上方式是不高效的,推薦修改為StringBuilder或StringBuffer。下列程序驗證了程序的高效性。 package reviewDemo; public class Demo22 { public static void main(String[] args) { String s = ""; long begintime = System.currentTimeMillis(); for(int i = 1;i <= 100000;i++){ s += i; } long endtime = System.currentTimeMillis(); long time = endtime - begintime; System.out.println("運行時間為:"+time); StringBuffer s1 = new StringBuffer(); s = ""; begintime = System.currentTimeMillis(); for(int i = 1;i <= 100000;i++){ s = ""+i; s1 = new StringBuffer(s); } endtime = System.currentTimeMillis(); time = endtime - begintime; System.out.println("運行時間為:"+time); } } 輸出: 運行時間為:82922 運行時間為:15 可以看得出:StringBuffer這兩個效率相當高!
StringBuffer 與 StringBuilder
- StringBuffer: 是線程安全的;
- StringBuilder: 是線程不安全的,性能高點,推薦使StringBuilder;(jdk1.5出現)
- StringBuffer的字符序列是可變的(通過append等方法操作)
- StringBuffer 和 String之間的轉換;
- String toString() 返回此序列中數據的字符串表示形式。
- StringBuffer(String str):以指定的字符串創建StringBuffer對象。
StringBuffer方法
方法名 | 意義 |
---|---|
public StringBuilder() | 構造一個不帶任何字符的StringBuilder對象。 |
StringBuffer(String str) | 構造一個字符串緩衝區,並將其內容初始化為指定的字符串內容。 |
StringBuffer append(Object o) | 將指定的任意類型對象追加到此StringBuffer 對象。 |
StringBuffer insert(int offset, Object o) | 將任意類型參數的字符串表示形式插入此序列中。 |
StringBuffer delete(int start, int end) | 移除此序列的子字符串中的字符。 |
StringBuffer deleteCharAt(int index) | 移除此序列指定位置的 char。 |
練習
- 需求:用StringBuilder 或StringBuffer: 把字符串「ABCDE」; 轉變成字符串「A,B,C,D」
public class Demo23 { public static void main(String[] args) { //第一種方法:往裏面插入; StringBuilder sb = new StringBuilder("ABCDE"); sb.deleteCharAt(sb.length()-1); System.out.println(sb); for (int i = 0; i < sb.length(); i+=2) { sb.insert(i, ","); } sb.deleteCharAt(0); System.out.println(sb); //第二種方法:往裏面追加,要追加必須遍歷,必須換為數組! sb = new StringBuilder("ABCDE"); sb.deleteCharAt(sb.length()-1); System.out.println(sb); char []cs = sb.toString().toCharArray(); StringBuilder sb1 = new StringBuilder(); for (char c : cs) { sb1.append(c).append(","); } sb1.deleteCharAt(sb1.length()-1); System.out.println(sb1); } }
- 編寫一個程序,這個程序把一個整數數組中的每個元素用逗號連接成一個字符串,例如,根據內容為{1,2,3}的數組形成內容為"1,2,3"的字符串。
package reviewDemo; /** * 編寫一個程序, * 這個程序把一個整數數組中的每個元素用逗號連接成一個字符串, * 例如,根據內容為{1,2,3}的數組形成內容為"1,2,3"的字符串。 */ public class Demo24 { public static void main(String[] args) { int []i = {1,2,3,4,5}; StringBuilder sb = new StringBuilder(); for (int j : i) { sb.append(j).append(","); } sb.deleteCharAt(sb.length()-1); System.out.println(sb); } }
注意:
字符串是任何程序語言的最常用、處理操作最多的。即使在大數據領域也是以處理文本數據為主。
推薦朋友關注【趣學程序】公眾號,公眾號內所有資源免費獲取。