Java字元串相關類——String、StringBuffer、StringBulider類及相關方法
- 1.String類
-
- 1.1String常用方法
- 1.2String類型與其他資料類型轉換
- 2.StringBuffer類
-
- 2.1StringBuffer常用方法
- 3.StringBuilder類
Java中與字元串相關的類有三個——String、StringBuffer、StringBulider類,本文對這三個類和他們的常用方法進行總結。
1.String類
String是一個final類,代表不可變的字元序列,其對象的字元内容是存儲在一個字元數組char[]中的。建立String對象的方式有兩種,一種是通過定義字面量的形式建立,另一種是通過調構造器的形式建立:
//字面量方式
String str = "hello";//相當于new char[]{'h','e','l','l','o'};
//構造器方式
String str1 = new String(); //相當于new char[0]
String str2 = new String(String str);
String str3 = new String(char[] a);
String str4 = new String(char[] a,int startIndex,int count);
這兩種方式有什麼差別呢?對于通過字面量形式定義的字元串都是存儲在方法區的字元串常量池中,而通過構造器定義的字元串是存儲在堆空間中的。例如:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5UNJRVT4FEROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLxAjMzUTM1ATMwMDOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
其中字元串s1就存儲在常量池中,并且在常量池中不會出現兩個相同的字元串,是以字元串s1和s2的位址值是相同的,都指向常量池中的同一個字元串。隻有建立的字元串在常量池中沒有的時候,才會新存儲一個字元串在常量池中。而s3首先指向堆空間中,然後再指向常量池的字元串。 String字元串的不可變性展現為:修改或替換原有字元串時,需要新指定記憶體區域去指派,原有的字元串是不會變的,這是與StringBuffer和StringBuilder最大的差別。
1.1String常用方法
● int length():傳回字元串的長度: return value.length
● char charAt(int index): 傳回某索引處的字元return value[index]
● boolean isEmpty():判斷是否是空字元串:return value.length == 0
● String 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 值序列時,傳回 true
● int indexOf(String str):傳回指定子字元串在此字元串中第一次出現處的索引
● int indexOf(String str, int fromIndex):傳回指定子字元串在此字元串中第一次出現處的索引,從指定的索引開始
● int lastIndexOf(String str):傳回指定子字元串在此字元串中最右邊出現處的索引
● int lastIndexOf(String str, int fromIndex):傳回指定子字元串在此字元串中最後 一次出現處的索引,從指定的索引開始反向搜尋 注:indexOf和lastIndexOf方法如果未找到都是傳回-1
● String 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個,如果超過了,剩下的全部都放到最後一個元素中。
1.2String類型與其他資料類型轉換
🔺字元串 <----> 基本資料類型、包裝類
● Integer包裝類的public static int parseInt(String s):可以将由“數字”字 符組成的字元串轉換為整型;
● 調用String類的public String valueOf(int n)可将int型轉換為字元串 。
🔺字元數組 <----> 字元串
● 調用構造器String(char[]) 和 String(char[],int offset,int length) 分别用字元數組中的全部字元和部分字元建立字元串對象。
● public char[] toCharArray():将字元串中的全部字元存放在一個字元數組中。
● public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):将指定索引範圍内的字元串存放到數組中。
🔺位元組數組 <----> 字元串
● String(byte[]):通過使用平台的預設字元集解碼指定的 byte 數組,構造一個新的字元串。
● String(byte[],int offset,int length) :用指定的位元組數組的一部分, 即從數組起始位置offset開始取length個位元組構造一個字元串。
● public byte[] getBytes() :使用平台的預設字元集将此 String 編碼為 byte 序列,并存儲到一個 byte 數組中。
● public byte[] getBytes(String charsetName) :使用指定的字元集将此 String 編碼到 byte 序列,并存儲到一個 byte 數組中。
2.StringBuffer類
StringBuffer和String的相同點是底層都是通過char型數組存儲的。不同點是StringBuffer代表可變的字元序列,可以對字元串内容進行增删,不會産生新的對象。StringBuffer是線程安全的。并且其對象必須使用構造器生成:
- StringBuffer():初始容量為16的字元串緩沖區
- StringBuffer(int size):構造指定容量的字元串緩沖區
- StringBuffer(String str):将内容初始化為指定字元串内容
StringBuffer sb1 = new StringBuffer();//相當于new char[16];
StringBuffer sb2 = new StringBuffer("abc");//相當于new char["abc".length() + 16];
雖然此時sb2底層char[]數組長度容量為19,但在調用sb2.length()時,傳回的是字元串實際的長度。如果需要存儲的資料超過了原有數組的容量,則需要擴容,預設擴容規則為:原有容量*2+2,并将原有數組中的資料複制到新的數組中。
2.1StringBuffer常用方法
● StringBuffer append(xxx):提供了很多的append()方法,用于進行字元串拼接 ● StringBuffer delete(int start,int end):删除指定位置的内容
● StringBuffer replace(int start, int end, String str):把[start,end)位置替換為str
● StringBuffer insert(int offset, xxx):在指定位置插入xxx
● StringBuffer reverse() :把目前字元序列逆轉
● public int indexOf(String str)
● public String substring(int start,int end)
● public int length() public char charAt(int n )
● public void setCharAt(int n ,char ch)
3.StringBuilder類
StringBuilder 和 StringBuffer 非常類似,均代表可變的字元序列,而且 提供相關功能的方法也一樣,唯一不同的是StringBuilder是線程不安全的,是以相較StringBuffer效率較高。
總結三個類的異同點:
異同點 | String | StringBuffer | StringBuilder |
---|---|---|---|
底層存儲 | char型數組 | char型數組 | char型數組 |
字元序列 | 不可變字元序列 | 可變字元序列 | 可變字元序列 |
線程安全 | 線程安全 | 線程安全 | 線程不安全 |
效率 | 低 | 中 | 高 |
根據以上各個類的優缺點,我們在實際開發中優先使用StringBuffer、StringBuilder。如果不涉及線程安全問題,則優先選擇StringBuilder;若涉及線程安全問題,則應該使用StringBuffer。
以上就是關于字元串相關類的總結,歡迎大家指正補充!