【Java学习笔记系列】Java8中数组(引用类型)、String、List、Set之间的相互转换问题

时间:2020-12-26 16:16:37

数组、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)