1、String
創建字符串
-
String s = "xxx" ;
-
String s = new String ("xxx");
-
String s = new String( new char [] {'x','x','x'} );
對於第三種的解釋:字符串在String內部是通過一個char[ ] 數組表示的(和C++類似),只是由於String太常用了,所以Java提供了“xxx”這種字符串字面量表示方法。
特點
Java字符串是不可變的,這種不可變性是通過內部的private final char[ ]字段,以及沒有任何修改char[ ]的方法實現的(即Java中不能對char[] 進行修改);
不可變意味着:一旦創建了String,就無法修改其值。所以在調用String的修改方法時,並不是對該String本身進行修改,而是復制一個副本,對該副本修改並返回,所以需要額外的String來承接。
對象方法:用法str.xxx(...)
需要注意的是,由於String的不可變性,所以所有這些方法都不會改變原String,只能返回改變后的新String
返回值類型 |
方法 |
說明 |
boolean | == | 比較兩個字符串變量是否指向同一個地址 |
char | charAt( index ) | 返回指定索引處的單個char |
int | compareTo(String str) | 比較兩個字符串 |
int | compareToIgnoreCase(String str) | 比較兩個字符串,不考慮大小寫 |
String | concat(String str2) | 把指定字符串連接到該字符串結尾 |
boolean | contains(String str2) | 判斷str中是否包含子串str2 |
String | copyValueOf(char [] data) | 返回指定的char[]代表的String |
String | copyValueOf(char [] data , int offset , int count) | 返回從offset開始,總共count個字符的data中一部分char組成的String |
boolean | endsWith(String suffix) | str是否以suffix結尾 |
boolean | equals(str2) | 比較兩個字符串內容是否相同 |
boolean | equalsIgnoreCase(str2) | 忽略大小寫比較內容 |
String | formatted()、format() | 格式化字符串 |
byte[] | getBytes() | 使用默認編碼,將該String編碼為byte序列 |
byte[] | getBytes(String charset) | 用charset指定的編碼方式,將該String編碼為byte序列 |
void | getChars(int srcBegin , int srcEnd , char[] dst , int dstBegin) | 將字符串str中從srcBegin到srcEnd的char復制到目標char[] dst中,從dst的dstBegin處開始 |
int | hashCode() | 返回該字符串的Hash碼 |
int | indexOf(String str2 , int fromIndex=0) | 第一次出現指定子串的索引,參數fromIndex指定從何處開始 |
String | intern() | 返回字符串對象的規格化表示形式 |
boolean | isBlank() | 是否為"" |
boolean | isEmpty() | 是否為null |
int | lastIndexOf(String str2 , int fromIndex=-1) | 最后一次出現指定字串的索引,參數fromIndex指定從何處反向開始 |
int | length() | 字符串長度 |
boolean | matches(String regex) | 該字符串是否匹配指定的正則表達式 |
boolean | regionMatches(...) | 兩個字符串的指定部分區域是否相等 |
String | replace(char oldChar , char newChar) | 用newChar替換該String中的所有oldChar |
String | replace(String str2 , String str3) | 用子串str3替換該String中的所有str2 |
String | replaceAll(String regex , String replacement) | 用replacement替換該字符串中所有匹配正則表達式regex的子串 |
String | replaceFirst(String regex,String replacement) | 用replacement替換該字符串中第一個匹配正則表達式regex的子串 |
String[ ] | split(String regex , int limit=0) | 用正則表達式regex指定的分隔符分割字符串,返回分割后各部分String組成的String[] 參數limit指明分割次數,默認0為無限制 |
boolean | startsWith(String prefix , int toffset=0) | str是否以在toffset處以prefix開始 |
String | substring(int start,int end=-1) | 截取指定位置間的子串 |
String | trim() | 移除首尾空白字符 |
strip() | 移除首尾空白字符,包括中文的空格字符 | |
stripLeading() | 移除首部空白字符 | |
stripTrailing() | 移除尾部空白字符 | |
char[ ] | toCharArray() | 將String轉為char[ ] |
String | toLowerCase() | 把String中的字符小寫 |
String | toUpperCase() | 把String中的字符大寫 |
String | valueOf( x ) | 把各類型的x字符串化 |
靜態方法:用法String.xxx(...)
方法返回值 |
方法 |
說明 |
String | copyValueOf(char[ ] data) copyValueOf(char[ ] data , int offset , int count) |
等同於valueOf( char [ ] ),把char[ ]轉化為String |
String | format(String format , Object... args) | 將參數1format格式化,其中的格式化字符例如%d、%s等填充為一系列的參數args |
String | join(CharSequence delimiter , String [] str) | 用連接符delimiter將一個String []中的各String連接起來 |
String | valueOf( xxx ) | 將xxx轉化為String |
部分方法的補充說明
1、格式化字符串:formatted、format
package pack1; public class Main{ public static void main(String [] args){ String s= "Hi %s,your score is %d!"; System.out.println(s.formatted("Alice",80)); System.out.println(String.format("Hi %s,your score is %.2f!","Bob",59.5)); } }
formatted()
str.formatted(格式化列表)
format()
String.format(str,格式化列表)
其中有幾個占位符,后邊的格式化列表中就有幾個參數,且參數類型要和占位符一致。
常用占位符
s | 字符串 |
d | 整數 |
x | 十六進制整數 |
f | 浮點數 |
占位符可以帶格式,比如%.2f是兩位小數,如果不確定用啥占位符,那就始終用%s,因為%s可以顯示任何類型數據。
③各類型與String的相互轉化
各類型轉字符串:String.valueOf(xxx)
要把任意基本類型或者引用類型轉換為String,可以使用靜態方法String.valueOf()。這是一個重載方法,編譯器會根據參數自動選擇合適的方法:
String.valueOf(123); // "123" String.valueOf(45.67); // "45.67" String.valueOf(true); // "true" String.valueOf(new Object()); // 類似java.lang.Object@636be97c
字符串轉各類型
轉換類型 | 方法 | 補充 |
int | Integer.parseInt(str,進制) | |
boolean | Boolean.parseBoolean(str) | |
Integer | Integer.getInteger(str) | 不是轉化str,而是將str對應的系統變量轉化為Integer |
char[] | str.toCharArray() | 如果從char[]到String,直接用new String (carray)構造String即可 |
2、字符編碼
主流編碼
ASCII編碼:每個字符1B
Unicode編碼:每個字符2或更多字節,包含了全世界所有語言
UTF-8編碼:變長編碼,用來把Unicode編碼變為1~4B的變長編碼
編碼轉化
Java中,char類型實際上是2B Unicode編碼,如果要把字符串轉換為其他編碼,可以用str.getBytes(編碼類型)這種方法。
byte[] b1 = "Hello".getBytes(); // 按系統默認編碼轉換,不推薦 byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8編碼轉換 byte[] b2 = "Hello".getBytes("GBK"); // 按GBK編碼轉換 byte[] b3 = "Hello".getBytes(StandardCharsets.UTF_8); // 按UTF-8編碼轉換
需要注意的是,以上代碼轉換編碼后,就不再是char類型,而是byte[ ]
如果要把某種已知編碼的byte[ ]轉化為String,可以在new String()時通過參數指定原編碼格式:
byte[] b = ... String s1 = new String (b,"GBK");//按GBK轉化 String s2 = new String (b,StandardCharsets.UTF_8);//UTF-8
始終牢記:Java中的String和char是以Unicode編碼的。
3、總結
- Java中的字符串類型是String,它本身也是一個class,但是Java編譯器對String有特殊處理,可以直接用"xxx"來表示;實際上String在JVM中是通過char[ ]數組表示的;
- Java字符串是不可變的,這是因為String在JVM內部表示char [ ]時,通過private final char[ ]實現的,此外JVM中沒有任何修改char[ ]方法實現的;
- 字符串的各種方法,判斷字符串內容通常用equals(str2)
- 格式化字符串的方法:formatted、format
- 字符編碼:ASCII——每個字符1B;Unicode——每個字符2B;UTF-8——1~4B的邊長編碼。Java中,char、String類型實際上是2B Unicode編碼。字符串的編碼轉化,同str.getBytes(編碼類型)實現的,不過編碼轉化后,就不再是char類型,而是byte[ ];反之,如果要把byte[ ]轉化為String,可以在new String ( )時通過參數指定編碼格式。