Java核心API -- 2(String、StringBuilder、StringBuffer)
?
1. String字符串
? ? 1)String類型介紹
? ? ? ? String類采用final修飾,String對象為不可變對象,一旦在內存中創建,內容不能發生變化,若要對字符串內容改變,那么就會創建新對象。
? ? ? ? String對象創建,有靜態和動態之分。
? ? ? ? String str1 = "dadsadad";
? ? ? ? String str2 = new String("dasdasdadad");
? ? 2)String常量池
? ? ? ? JVM對字符串有一個限制,讓字符串作為不變對象,這樣就可以做到重用。事實上,當我們通過字面量,常量來初始化一個字符串時,JVM首先會從字符串的常量池(一個JVM內部維護的內存區域,用來保存已經創建過的字符串對象)中查詢用來保存該字符串的對象是否存在,若存在則直接引用,若不存在則創建該字符串對象并存入常量池,然后引用它。
? ? 3)字符串的常用方法
? ? ? ? String str = "dn1aAj2FD6hbF4hjaX0f";
? ? ? ? ① str.length(),獲取字符串的長度,返回int類型的數值
? ? ? ? ② str.indexOf(char c),獲取字符串中某個字符第一次出現的索引,找不到,返回值為-1。 ? ?
? ? ? ? ? ? str.lastIndexOf(char c), 返回指定字符在此字符串中最后一次出現的索引,找不到,返回值為-1。
? ? ? ? ③?str.charAt(int index),獲取字符串指定下標位置上的字符,返回值是char類型的。
? ? ? ? ④?str.toUpperCase(),將字符串str全部轉成大寫,
? ? ? ? ? ? str.toLowerCase(),將字符串str全部轉成小寫,返回的都是新的字符串。
? ? ? ? ⑤ str.stratsWith(String s),判斷字符串str是不是以字符串s開頭,
? ? ? ? ? ? str.endsWith(String s),判斷字符串str是不是以s結尾,返回值都是boolean類型的。
? ? ? ? ⑥?str.equals(String s),判斷兩個字符串的內容是否相等(在前一章已經分析了==和equals()的區別了),返回boolean類型。
? ? ? ? ⑦?str.replace(char oldChar, char newChar):將字符串中匹配odChar的字符全部替換成新的newChar字符,返回新的字符串。
? ? ? ? ⑧?str.subString(int begin),截取字符串中某一段字符,從下標begin開始,截取到最后,?
? ? ? ? ? ? str.subString(int begin, int end),截取字符串中某一段字符,從下標begin開始,到end-1結束,返回的是一個新的字符串。
? ? ? ? ⑨??str.split(String regex): 參數regex為一個字符串規則,以regex所表示的字符串為分隔符,將字符串拆分成字符串數組。
? ? ? ? ? ? 其中,regex所表示的字符串不被保留,即 不會存到字符串數組中,可理解為被一刀切,消失!
? ? ? ? ⑩?str.trim(),去掉字符串前后兩端的空格,返回新的字符串。
? ? 案例1:
????????
? ? 結果:
????????
2. StringBuilder、StringBuffer類
? ? String類我們已經得知,它是不變對象,那么每當對內容修改時都會引發新對象的創建。那么當我們有一個需求是需要頻繁修改字符串時,這樣不僅不能減少內存的開銷,返回會增加內存的開銷。為此java為我們提供了一個專門用于修改字符串內容的類StringBuilder類,?該類封裝了可變的字符串,換句話說,當我們需要改變字符串內容時,并不會創建新對象,而是在原對象基礎上進行修改。從而減小了內存的開銷。
? ? StringBuilder類的常用方法有:
? ? ? ? append(String str):追加字符串;
? ? ? ? insert (int index,String s):從指定下標位置插入字符串;
? ? ? ? delete(int start,int end):從起始下標刪除字符串到end結束下標,end要大于等于start,可以超出數組總長度;
? ? ? ? replace(int start,int end,String str): 替換字符串;
? ? ? ? reverse():字符串反轉。
? ? 案例2:
????????
? ? 結果:可以看出效率方面對比性很強。
????????
? ? 案例3:
????????
? ? 結果:
????????
? ? StringBuffer類,是JDK早期的版本,StringBuffer是線程安全的可變字符序列。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。可將字符串緩沖區安全地用于多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區中。
? ? 通常,如果 sb 引用 StringBuilder 的一個實例,則 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。只要發生有關源序列(如在源序列中追加或插入)的操作,該類就只在執行此操作的字符串緩沖區上而不是在源上實現同步。每個字符串緩沖區都有一定的容量。只要字符串緩沖區所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩沖區數組。如果內部緩沖區溢出,則此容量自動增大。
? ? 從 JDK 5 開始,為該類補充了一個單個線程使用的等價類,即 StringBuilder。與該類相比,通常應該優先使用 StringBuilder 類,因為它支持所有相同的操作,但由于它不執行同步,所以速度更快。 java.lang.StringBuilder一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。
?
轉載于:https://blog.51cto.com/kingkongzhao/1656611
總結
以上是生活随笔為你收集整理的Java核心API -- 2(String、StringBuilder、StringBuffer)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack 之 控制节点物理机备
- 下一篇: [转]“Ceph浅析”系列之(二)—Ce