1. 程式人生 > >【Java學習筆記系列】Java8中陣列(引用型別)、String、List、Set之間的相互轉換問題

【Java學習筆記系列】Java8中陣列(引用型別)、String、List、Set之間的相互轉換問題

陣列、String、List、Set之間的相互轉換問題

本博主要是相理清楚一些轉換的邏輯,順便總結一下貼出來。這裡是把一些可以JDK自帶的使用方法寫出了。不代表沒有其他的轉換方式。

前提宣告:

只要跟集合交流的陣列都是引用型別的陣列。因為集合本身不與基本型別打交道。如果你要交流,他們的包裝型別就是交流的橋樑。而包裝型別和基本型別陣列之間的轉換就要你自己寫迴圈體去一個一個轉型了。

陣列和String

String轉換為char[]

String轉換為char[]的一種方法:

    public static void stringToChar(String str){
        char
[] chars1 = str.toCharArray(); //通過toCharArray方法 }

toCharArray()的原始碼:

    public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length]; //構造返回的char[]變數
        System.arraycopy(value, 0, result, 0
, value.length); //通過arraycopy將String的value值拷貝到result上,返回result return result; }
char[]轉換為String

char[]陣列轉換為String的兩種現有方法:

public static void charToString(){

        char[] chars = {'1','2','3','4','5','6'};
        String str1 = new String(chars);            //通過String建構函式
        String str2 = String.valueOf(chars);        //通過String型別轉換,實際也是new String(char[])
}

第一種建構函式的原始碼:

  public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length); 
        //深拷貝一個新的char[]陣列給String的value(對於基本型別而言都是深拷貝)
  }

第二種String.valueOf()的原始碼:

   public static String valueOf(char data[]) {
        return new String(data); //實際上還是String的建構函式
   }

陣列和List

包裝類陣列轉換為List
public static void arrayToList(){

        Character[] chars = {'1','2','3','4','5','6','7','8','9'};

        //方式一
        List<Character> list1 = Arrays.asList(chars); //通過Arrays的工具類
        //方式二
        List<Character> list2 = new ArrayList<>();   //通過Collections工具類
        Collections.addAll(list2,chars);

}

Arrays工具類的原始碼:

   public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);   //返回Arrays類內部的靜態內部類ArrayList例項物件
    }

Collections.addAll工具類的原始碼:

   public static <T> boolean addAll(Collection<? super T> c, T... elements) {
        boolean result = false;
        for (T element : elements) //通過遍歷陣列
            result |= c.add(element); //每次都把陣列插入到集合c中
        return result;
    }
List轉換為包裝類陣列

List轉換為包裝類陣列的一種方式:

public static void listToArray(){
        List<Character> list = new ArrayList<>();
        list.add('1');
        list.add('2');
        Character[] chars =  list.toArray(new Character[list.size()]);//注意toArray()的引數
}

關於原始碼的實現,就要具體看是那種List了,從List介面中,我們也能知道一些資訊

  <T> T[] toArray(T[] a); //引數是什麼型別就返回什麼型別的陣列

注意:
我們這裡特地強調了是List和包裝類陣列之間的轉換。因為集合只支援對包裝類進行操作。
所以你如過要進行基本型別陣列和List之間的轉換,比如char[]轉換為List,要先轉換成它的包裝型別陣列Character[]

String和List

分隔符String轉換為List

String轉換為List的兩種方式:

    //原理就是首先將String轉換成String[]陣列,再通過工具類轉換為List
    public static void stringToList (String str){

        String str1 = "123456";
        //方式一
        List<String>list1  = Arrays.asList(str.split("")); //str.split()返回一個String[]陣列
        //方式二
        List<String>list2 = new ArrayList<>();
        Collections.addAll(list2, str.split(""));
    }

所以有兩個步驟

  • 首先要將String轉換為包裝型別(如Character[])或String[]陣列
  • 再把包裝型別陣列轉換成List.

注意
要注意的是,通常所說的String轉換成List,方式之一通常是通過split方法轉換成String[]陣列
如果你想將String.toArrayChar轉換成char[],再轉換為List,這就比較麻煩了,首先你先得把char[]基本型別轉換成Character[]

List轉換為分隔符String

List轉換為String的一種方式:

public static void listToString(){
        List<String> list = Arrays.asList("1","2","3","4");
        String str = String.join("", list); //"1234"
}

List通過String的join方法直接轉換為String,通過""作為分隔符,就相當於字元之間沒有分隔符

List和Set

List轉換為Set
public static void listToSet(){
         List<String> list = new ArrayList<>();
         Set<String> set = new HashSet<>(list);   //直接建構函式即可
}
Set轉換為List
 public static void setToList(){
         Set<String> set = new HashSet<>();
         List<String> list = new ArrayList<>(set); //直接建構函式即可
}

所以List集合和Set集合之間只要型別引數相同,既可以通過建構函式互相轉換

String和Set

String轉換為Set
    public static void stringToSet(){
        String str = "12345";
        String[] strs= str.split("");

        //方式一
        List<String> list1 = Arrays.asList(strs);
        Set<String> set1 = new HashSet<>(list1);

        //方式二
        Set<String> set2 = new HashSet<>();
        Collections.addAll(set2, strs);
    }

方式一有三個步驟:

  • String轉換為String[]陣列 或包裝型別陣列(如Character[])
  • 將陣列轉換為List,可以使用Arrays或Collections工具類
  • 將list轉換為Set

方式二有兩個步驟

  • String轉換為String[]陣列 或包裝型別陣列(如Character[])
  • 使用Collections工具類將陣列轉換為Set
Set轉換為String
    public static void setToString(){
        Set<String> set = new HashSet<>();
        String.join("", set);
    }

只需要一個步驟,即

  • 使用String的join方法把集合轉換為String

陣列和Set

陣列轉換為Set
public static void arrayToSet(){
        Character[] chars = {'1','2','3','4'};

        //方式一
        List<Character> list = Arrays.asList(chars);
        Set<Character> set12 = new HashSet<>(list);

        //方式二
        Set<Character> set1 = new HashSet<>();
        Collections.addAll(set1, chars);

}

兩種方式,同樣是受到不同工具類的影響
第一種方式的兩個步驟:

  • 陣列通過Arrays或Collections工具類轉換為List
  • 再把list轉換為set

第二種方式的一個步驟:

  • 通過Collections將陣列轉換為Set
Set轉換為陣列
    public static void setToArray(){
        Set<Character> set = new HashSet<>();
        Character[] chars = set.toArray(new Character[set.size()]);
    }

集合轉為陣列的方式也很簡單,通常都是集合.toArray(T[] t)