Java:String與編碼


1、String

創建字符串

  1. String s = "xxx" ;

  2. String s = new String ("xxx");

  3. 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中從srcBeginsrcEndchar復制到目標char[] dst中,從dstdstBegin處開始
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中的Stringchar是以Unicode編碼的。

 

3、總結

  1. Java中的字符串類型是String,它本身也是一個class,但是Java編譯器對String有特殊處理,可以直接用"xxx"來表示;實際上String在JVM中是通過char[ ]數組表示的;
  2. Java字符串是不可變的,這是因為String在JVM內部表示char [ ]時,通過private final char[ ]實現的,此外JVM中沒有任何修改char[ ]方法實現的;
  3. 字符串的各種方法,判斷字符串內容通常用equals(str2)
  4. 格式化字符串的方法:formatted、format
  5. 字符編碼:ASCII——每個字符1B;Unicode——每個字符2B;UTF-8——1~4B的邊長編碼。Java中,char、String類型實際上是2B Unicode編碼。字符串的編碼轉化,同str.getBytes(編碼類型)實現的,不過編碼轉化后,就不再是char類型,而是byte[ ];反之,如果要把byte[ ]轉化為String,可以在new String ( )時通過參數指定編碼格式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM