Java學習筆記7(Java常用類庫與工具 )

黑白LKED發表於2020-11-07

目錄

1.請簡述String,StringBuffer,StringBuilder三者之間的共同點與區別,應該分別在何種場景下使用?
2.為什麼不建議在for迴圈中使用“+”進行字串拼接?
3.什麼是字串的編碼與解碼?


1.請簡述String,StringBuffer,StringBuilder三者之間的共同點與區別,應該分別在何種場景下使用?

  • 共同點
    1. 內部實現基於字元陣列,封裝了對字串處理的各種操作
    2. 可自動檢測陣列越界等執行時異常
  • 不同點
    1. String內部實現基於常量字元陣列,內容不可變;
      StringBuffer、StringBuilder基於普通字元陣列,陣列大小可根據字串 的實際長度自動擴容,內容可變
    2. 效能方面:
      StringBuilder>StringBuffer>String
    3. StringBuffer執行緒安全;StringBuilder非執行緒安全
  • 使用場景
    1. String:字串變化改動少,對安全性要求高的情況
    2. StringBuffer:需要頻繁進行字串運算,且執行在多執行緒環境中
    3. StringBuilder:需要頻繁進行字串運算,且執行在單執行緒環境中

2.為什麼不建議在for迴圈中使用“+”進行字串拼接?

  • 若使用 s=“a”+“b”+“c” 句型,物件 a 和物件 b 相加之後生成新物件 ab,物件 ab 和 c 相加後,又生成新物件 abc,這樣如果有大量的字串需要連線,就會造成記憶體被不必要地浪費。

3.什麼是字串的編碼與解碼?請舉例說明

  • 將 unicode 字符集轉為本地字符集(如 GB2312 或 GBK)的過程叫編碼(encode),反之叫解碼(decode)
  • 編碼
import java.io.*;

public class CharCode {
    public static void printByteArray(String msg,byte[] t){
        System.out.println(msg+"****************");
        for(int i=0;i<t.length;i++){
            System.out.println(Integer.toHexString(t[i])); }

    }
    public static void printCharArray(String msg,char[] c){
        System.out.println(msg+"****************");
        for(int i=0;i<c.length;i++){
            System.out.println(Integer.toHexString(c[i])); }
    }
    public static void main(String[] args){
        try{
            String str = "中文";
            System.out.println(str);
            printCharArray("unicode:",str.toCharArray()); //unicode字符集中對"中文"二字的對應程式碼
            byte[] b =str.getBytes("GB2312"); //編碼:轉為本地字符集GBK2312對應的程式碼
            printByteArray("GB2312",b);
            byte[] m =str.getBytes("ISO8859-1"); //轉為ISO8859-1對應的程式碼
            printByteArray("ISO8859-1",m); // ISO8859-1是英文字符集,沒有對應的漢字程式碼,所以轉化錯誤
        }
        catch(UnsupportedEncodingException e){
            System.out.println("沒有相應的字符集!"); } } }

執行結果:
中文
unicode:****************
4e2d
6587
GB2312****************
ffffffd6
ffffffd0
ffffffce
ffffffc4
ISO8859-1****************
3f
3f

程式已結束,退出程式碼0
  • 解碼
package myjava;

import java.io.*;

public class CharCode {
    public static void printByteArray(String msg,byte[] t){
        System.out.println(msg+"****************");
        for(int i=0;i<t.length;i++){
            System.out.println(Integer.toHexString(t[i])); }

    }
    public static void printCharArray(String msg,char[] c){
        System.out.println(msg+"****************");
        for(int i=0;i<c.length;i++){
            System.out.println(Integer.toHexString(c[i])); }
    }
    public static void main(String[] args){
        byte[] b = new byte[6];
        int t=0,pos=0;
        String s;
        try{
            while(t!='\n'){
                t=System.in.read();
                b[pos]=(byte)t;
                pos++;
            }
            printByteArray("本地碼:",b);
            s = new String(b,"GBK"); //解碼
            System.out.println(s);
            printCharArray("unicode碼:",s.toCharArray());
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}


執行結果:
Chin
本地碼:****************
43
68
69
6e
a
0
Chin
 
unicode碼:****************
43
68
69
6e
a
0

程式已結束,退出程式碼0

相關文章