Java-字符串-String

String

Java程序中所有的字符串文字(例如"abc" )都可以被看作是實現此類的實例。

特點:

1、字符串String類型本身是final聲明的,意味着我們不能繼承String。

2、字符串的對象也是不可變對象,意味着一旦進行修改,就會產生新對象

  我們修改了字符串後,如果想要獲得新的內容,必須重新接受。

3、String對象內部是用字符數組進行保存的

  JDK1.9之前有一個char[] value數組,JDK1.9之後byte[]數組

4、String類中這個char[] values數組也是final修飾的,意味着這個數組不可變,然後它是private修飾,外部不能直接操作它,String類型提供的所有的方法都是用新對象來表示修

改後內容的,所以保證了String對象的不可變。

5、就因爲字符串對象設計爲不可變,那麼所以字符串有常量池來保存很多常量對象,可以共享

  如果涉及到大量的字符串修改操作,建議使用StringBuffer或StringBuilder

String對象的創建

1、字面常量值

  String str = "hello";

2、使用構造器

  • public String() :初始化新創建的 String對象,以使其表示空字符序列。

  • String(String original): 初始化一個新創建的 String 對象,使其表示一個與參數相同的字符序列;換句話說,新創建的字符串是該參數字符串的副本。

  • public String(char[] value) :通過當前參數中的字符數組來構造新的String。

  • public String(char[] value,int offset, int count) :通過字符數組的一部分來構造新的String。

  • public String(byte[] bytes) :通過使用平臺的默認字符集解碼當前參數中的字節數組來構造新的String。

  • public String(byte[] bytes,String charsetName) :通過使用指定的字符集解碼當前參數中的字節數組來構造新的String。

3、靜態方法

  • static String copyValueOf(char[] data): 返回指定數組中表示該字符序列的 String

  • static String copyValueOf(char[] data, int offset, int count):返回指定數組中表示該字符序列的 String

  • static String valueOf(char[] data) : 返回指定數組中表示該字符序列的 String

  • static String valueOf(char[] data, int offset, int count) : 返回指定數組中表示該字符序列的 String

  • static String valueOf(xx value):xx支持各種數據類型,返回各種數據類型的value參數的字符串表示形式。

4、xx.toString() 

  StringBuffer s = new StringBuffer(xx);
  String str = s.toString();  :返回字符串對象

5、和字符串的拼接+

  任意數據類型與"字符串"進行拼接,結果都是字符串

String對象的個數

String str = "hello";  //1個

String str = new String("atguigu");  //2個

String s1 = "hello";//1個
String s2 = "world";//1個

String s3 = s1 + s2 + "java";  //"java"1個,s1 + s2拼接結果1個,最後結果1個

字符串對象的內存分析

String對象的拼接

1、+

(1)常量+常量:結果是常量池

(2)常量與變量 或 變量與變量:結果是堆

  指向堆中的字符串常量 + 常量:結果都在堆

(3)拼接後調用intern方法:結果在常量池

2、concat:拼接的結果都是新的字符串,哪怕是兩個常量對象拼接,都在堆中

String s1 = "hello";
String s2 = "world";

String s3 = s1 + "world";  //s3字符串內容也是helloworld,s1是變量,"world"常量,變量 + 常量的結果在堆中
String s4 = s1 + s2;    //s4字符串內容也是helloworld,s1和s2都是變量,變量 + 變量的結果在堆中

String對象的比較

1、==:比較地址

2、equals(xx):比較字符串內容,嚴格區分大小寫。因爲String類型重寫equals

3、equalsIgnoreCase(xx):比較字符串內容,不區分大小寫

4、compareTo(xx):比較字符串的大小,按照字符編碼值比較,嚴格區分大小寫。String類型重寫了Comparable接口的抽象方法,自然排序

5、compareToIgnoreCase(xx):比較字符串的大小,按照字符編碼值比較,不區分大小寫

6、java.text.Collator:文本校對器比較大小,按照指定語言環境的自然語言順序比較大小(字典排序)

空字符的比較

空字符串

  String str1 = "";
  String str2 = new String();
  String str3 = new String("");

判斷某個字符串是否是空字符串

  if("".equals(str))  //推薦

  if(str!=null && str.isEmpty())

  if(str!=null && str.equals(""))

  if(str!=null && str.length()==0)

String類的常用API

序號方法簽名方法功能簡介
1 String() 創建空字符串
2 String(String original) 根據original創建一個新字符串
3 static String valueOf(xx value) 根據value內容創建一個字符串
4 String intern() 將字符串的內容存入常量池
5 String concat() 字符串拼接
6 boolean equals(Object obj) 判斷當前字符串與指定字符串內容是否已在,嚴格區分大小寫
7 boolean equalsIgnoreCase(String obj) 判斷當前字符串與指定字符串內容是否已在,不區分大小寫
8 int compareTo(String str) 比較當前字符串與指定字符串的大小,嚴格區分大小寫
9 int compareToIgnoreCase(String str) 比較當前字符串與指定字符串的大小,不區分大小寫
10 boolean isEmpty() 判斷當前字符串是否爲空
11 int length() 返回當前字符串的長度
12 String toLowerCase() 將當前字符串轉爲小寫
13 String toUpperCase() 將當前字符串轉爲大寫
14 String trim() 去掉當前字符串前後空白符
15 boolean contains(xx) 判斷當前字符串中是否包含xx
16 int indexOf(xx) 在當前字符串中查找xx第一次出現的下標
17 int lastIndexOf(xx) 在當前字符串中查找xx最後一次出現的下標
18 String substring(int beginIndex) 從當前字符串的[beginIndex, 最後]截取一個子串
19 String substring(int beginIndex, int endIndex) 從當前字符串的[beginIndex, endIndex)截取一個子串
20 char charAt(index) 返回當前字符串[index]位置字符
21 char[] toCharArray() 將當前字符串的內容用一個字符數組返回
22 String(char[] value) 用value字符數組的元素構建一個新字符串
23 String(char[] value,int offset, int count) 用value字符數組的[offset]開始的count個字符構建一個新字符串
24 static String copyValueOf(char[] data) 用data字符數組的元素構建一個新字符串
25 static String copyValueOf(char[] data, int offset, int count) 用data字符數組的[offset]開始的count個字符構建一個新字符串
26 static String valueOf(char[] data) 用data字符數組的元素構建一個新字符串
27 static String valueOf(char[] data, int offset, int count) 用data字符數組的[offset]開始的count個字符構建一個新字符串
28 byte[] getBytes() 將當前字符串按照平臺默認字符編碼方式編碼爲字節序列
29 byte[] getBytes(字符編碼方式) 將當前字符串按照指定字符編碼方式編碼爲字節序列
30 String(byte[] bytes) 將bytes字節序列按照平臺默認字符編碼方式解碼爲字符串
31 String(byte[] bytes,String charsetName) 將bytes字節序列按照指定字符編碼方式解碼爲字符串
32 boolean startsWith(xx) 判斷當前字符串是否以xx開頭
33 boolean endsWith(xx) 判斷當前字符串是否以xx結尾
34 boolean matchs(xx) 判斷當前字符串是否滿足xx正則
35 String replace(xx,yy) 將當前字符串中所有xx替換爲yy
36 String replaceFirst(xx,value) 將當前字符串中第一個滿足xx正則的字符替換爲value
37 String repalceAll(xx, value) 將當前字符串中所有滿足xx正則的字符替換爲value
38 String[] split(xx) 將當前字符串按照xx正則拆分爲多個字符串
39 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 將當前字符串的[srtBegin,srcEnd)部分字符複製到dst字符數組中,dst數組從[dstBegin]開始存儲

StringBuffer和StringBuilder

String類的對象是不可變字符序列,StringBuffer和StringBuilder的對象是可變字符序列。

StringBuffer:老點,線程安全的,因爲它的方法有synchronized修飾

StringBuilder:JDK1.5之後引入的,線程不安全,單線程情況下推薦使用。

常用的API,StringBuilder、StringBuffer的API完全一致

StringBuilder、StringBuffer的API

序號方法簽名方法區功能簡介
1 StringBuffer() 創建一個空的可變字符序列,默認長度16
2 StringBuffer(String str) 用字符串str內容創建一個可變字符序列
3 StringBuffer append(數據類型 b) 在當前字符序列後面追加b
4 StringBuffer insert(int index, 數據類型 s) 在當前字符序列[index]插入s
5 StringBuffer delete(int start, int end) 刪除當前字符序列[start,end)部分字符
6 StringBuffer deleteCharAt(int index) 刪除當前字符序列[index]位置字符
7 void setLength(int newLength) 修改當前字符序列的長度爲newLength
8 void setCharAt(int index, char ch) 替換當前字符序列[index]位置字符爲ch
9 StringBuffer reverse() 將當前字符序列內容反轉
10 StringBuffer replace(int start, int end, String str) 替換當前字符序列[start,end)部分字符爲str
11 int indexOf(String str) 在當前字符序列中開始查找str第一次出現的下標
12 int indexOf(String str, int fromIndex) 在當前字符序列[fromIndex]開始查找str第一次出現的下標
13 int lastIndexOf(String str) 在當前字符序列中開始查找str最後一次出現的下標
14 int lastIndexOf(String str, int fromIndex) 在當前字符序列[fromIndex]開始查找str最後一次出現的下標
15 String substring(int start) 截取當前字符序列[start,最後]部分構成一個字符串
16 String substring(int start, int end) 截取當前字符序列[start,end)部分構成一個字符串
17 String toString() 將當前可變字符序列的內容用String字符串形式表示
18 void trimToSize() 如果緩衝區大於保存當前字符序列所需的存儲空間,則將重新調整其大小,以便更好地利用存儲空間。
19 int length() 返回當前字符序列的長度
20 char charAt(int index) 返回當前字符序列[index]位置字符
21 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 將當前字符串的[srtBegin,srcEnd)部分字符複製到dst字符數組中,dst數組從[dstBegin]開始存儲

 

 正則表達式

字符編碼

ASCII碼
  • 0~31及127(共33個)是控制字符或通信專用字符(其餘爲可顯示字符),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS(退格)

  • 32~126(共95個)是字符(32是空格),其中48~57爲0到9十個阿拉伯數字。

  • 65~90爲26個大寫英文字母,97~122號爲26個小寫英文字母,其餘爲一些標點符號、運算符號等。

Unicode

 爲解決一個問題:如果一份文檔中含有不同國家的不同語言的字符,那麼無法在一份文檔中顯示所有字符。Unicode字符集涵蓋了目前人類使用的所有字符,併爲每個字符進行統一編號,分配唯一的字符碼(Code Point)

 UTF-8

 它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號。從unicode到uft-8並不是直接的對應,而是要過一些算法和規則來轉換(即Uncidoe字符集≠UTF-8編碼方式

 Unicode只是定義了一個龐大的、全球通用的字符集,併爲每個字符規定了唯一確定的編號,具體存儲成什麼樣的字節流,取決於字符編碼方案。推薦的Unicode編碼是UTF-16

和UTF-8。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章