(資料圖片僅供參考)
一、字符串相關的類
1.String
String的特性
String類:代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作 為此類的實例實現。String是一個
final類,代表不可變的字符序列。字符串是常量,用雙引號引起來表示。它們的值在創建之后不能更改。String對象的字符內容是存儲在一個字符數組value[]中的。
public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0
String s1 = "abc";//字面量的定義方式String s2 = "abc";s1 = "hello";
string對象的創建
String str = "hello";//本質上this.value = new char[0];String s1 = new String(); //this.value = original.value;String s2 = new String(String original); //this.value = Arrays.copyOf(value, value.length);String s3 = new String(char[] a); String s4 = new String(char[] a,int startIndex,int count);
String str1 = “abc”;與String str2 = new String(“abc”);的區別?
字符串常量存儲在 字符串常量池,目的是共享字符串非常量對象 存儲在堆中。
練習1
String s1 = "javaEE";String s2 = "javaEE";String s3 = new String("javaEE");String s4 = new String("javaEE");System.out.println(s1 == s2);//trueSystem.out.println(s1 == s3);//falseSystem.out.println(s1 == s4);//falseSystem.out.println(s3 == s4);//false
字符串對象是如何存儲的
字符串特性
結論
常量與常量的拼接結果再常量池。且常量池中不會存在相同內容的常量。只要其中有一個是變量,結果就在堆中如果拼接的結果調用intern()方法返回值就在常量池中
String使用陷阱
String s1 = "a";說明:在字符串常量池中創建了一個字面量為"a"的字符串。s1 = s1 + "b";說明:實際上原來的“a”字符串對象已經丟棄了,現在在堆空間中產生了一個字符串s1+"b"(也就是"ab")。如果多次執行這些改變串內容的操作,會導致大量副本字符串對象存留在內存中,降低效率。如果這樣的操作放到循環中,會極大影響 程序的性能。String s2 = "ab"; 說明:直接在字符串常量池中創建一個字面量為"ab"的字符串。String s3 = "a" + "b";說明:s3指向字符串常量池中已經創建的"ab"的字符串。String s4 = s1.intern();說明:堆空間的s1對象在調用intern()之后,會將常量池中已經存在的"ab"字符串 賦值給s4。
String常用方法
int length():返回字符串的長度: return value.lengthchar charAt(int index): 返回某索引處的字符return value[index]boolean isEmpty():判斷是否是空字符串:return value.length == 0String toLowerCase():使用默認語言環境,將 String 中的所有字符轉換為小寫String toUpperCase():使用默認語言環境,將 String 中的所有字符轉換為大寫String trim():返回字符串的副本,忽略前導空白和尾部空白boolean equals(Object obj):比較字符串的內容是否相同boolean equalsIgnoreCase(String anotherString):與equals方法類似,忽略大小寫String concat(String str):將指定字符串連接到此字符串的結尾。等價于用“+”
int compareTo(String anotherString):比較兩個字符串的大小String substring(int beginIndex):返回一個新的字符串,它是此字符串的從 beginIndex開始截取到最后的一個子字符串。String substring(int beginIndex, int endIndex) :返回一個新字符串,它是此字符串從beginIndex開始截取到endIndex(不包含)的一個子字符串。boolean endsWith(String suffix):測試此字符串是否以指定的后綴結束boolean startsWith(String prefix):測試此字符串是否以指定的前綴開始boolean startsWith(String prefix, int toffset):測試此字符串從指定索引開始的子字符串是否以指定前綴開始boolean contains(CharSequence s):當且僅當此字符串包含指定的 char 值序列 時,返回 trueint indexOf(String str):返回指定子字符串在此字符串中第一次出現處的索引int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出現處的索引,從指定的索引開始int lastIndexOf(String str):返回指定子字符串在此字符串中最右邊出現處的索引int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后 一次出現處的索引,從指定的索引開始反向搜索注:indexOf和lastIndexOf方法如果未找到都是返回-1String replace(char oldChar, char newChar):返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的。String replace(CharSequence target, CharSequence replacement):使用指定的字面值替換序列替換此字符串所有匹配字面值目標序列的子字符串。String replaceAll(String regex, String replacement) : 使用給定的 replacement 替換此字符串所有匹配給定的正則表達式的子字符串。String replaceFirst(String regex, String replacement) : 使用給定的 replacement 替換此字符串匹配給定的正則表達式的第一個子字符串。boolean matches(String regex):告知此字符串是否匹配給定的正則表達式。String[] split(String regex):根據給定正則表達式的匹配拆分此字符串。String[] split(String regex, int limit):根據匹配給定的正則表達式來拆分此 字符串,最多不超過limit個,如果超過了,剩下的全部都放到最后一個元素中。
String str = "12hello34world5java7891mysql456"; //把字符串中的數字替換成,,如果結果中開頭和結尾有,的話去掉 String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", ""); System.out.println(string);
String str = "12345"; //判斷str字符串中是否全部有數字組成,即有1-n個數字組成 boolean matches = str.matches("\\d+"); System.out.println(matches); String tel = "0571-4534289"; //判斷這是否是一個杭州的固定電話 boolean result = tel.matches("0571-\\d{7,8}"); System.out.println(result);
String str = "hello|world|java";String[] strs = str.split("\\|");for (int i = 0; i < strs.length; i++) {System.out.println(strs[i]);}System.out.println();String str2 = "hello.world.java";String[] strs2 = str2.split("\\.");for (int i = 0; i < strs2.length; i++) {System.out.println(strs2[i]);}