java 容器、数组相互转换

来源:互联网 发布:软件p光头 编辑:程序博客网 时间:2024/05/17 07:05

1,来个图解释一下容器间的关系

这里写图片描述

这图我是从这里找来的(图原址),这个图对新手来说真是超级棒啊,应该打印出来,慢慢对子各自的优劣,每次需要用容器的时候就去图上找。
2,List、Set、Map 转换成数组

Collection有一个方法叫做toArray,而且是重载的。
toArray

两个方法的作用是一样的,都是把Collection的实现类转换成数组,第二个方法的参数指明了返回数据的类型,推荐使用第二种方法。
分别对List、Map、Set给个转换为数组的Demo:

 import java.util.*;public class TestCollection{    public static void main(String args[]) {        List<Integer> list = new ArrayList<>();        for(int i = 0; i < 10; i++) {            list.add(i);        }        //List转数组,实现1        //toArrya()方法的返回类型为Object数组        Object[] array1 = list.toArray();        System.out.println(Arrays.toString(array1));        //List转数组,实现2        Integer[] array2 = list.toArray(new Integer[0]);        System.out.println(Arrays.toString(array2));        //List转数组,实现3        Integer[] array3 = new Integer[list.size()];        list.toArray(array3);        System.out.println(Arrays.toString(array3));    }}

打印结果是:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

对于实现二和实现三,一开始我也纳闷,为什么传入长度为0的数组和正好等于list长度的数组都可以,看了下API文档,是这样解释的

这里写图片描述

就是说toArray()这个方法会根据你传如的数组类型来确认方法返回的数组类型,如果传入的数组有足够的空间保存容器(比如List)的数据,就把容器的数据直接存到这个数组,如果传入的数组空间不足以保存数据,就重新分配一个空间来保存数组。
所以方法3不需要接收toArray()的返回对象,因为数据已经存入array3了。
再做个测试,以加深理解:

        //List转数组,实现2        Integer[] array1 = new Integer[0];        Integer[] array2 = list.toArray(array1);        System.out.println("array1 == array2 : " + array1.equals(array2));        //打印结果array1 == array2 : false        //List转数组,实现3        Integer[] array3 = new Integer[list.size()];        Integer[] array4 = list.toArray(array3);        System.out.println("array3 == array4 : " + array3.equals(array4));        //打印结果array3 == array4 : true          //返回值array4和穿进去的array3在同一个地址

上面讲了List转数组,其实Map和Set转数组也是一样的方法,因为都是Collection的实现,也给个Demo:

import java.util.*;public class TestCollection{                                                                                               public static void main(String args[]) {        //Set        Set<Integer> set = new HashSet<>();        for(int i = 0; i < 10; i++) {            set.add(i);        }           Integer[] array1 = new Integer[set.size()];        set.toArray(array1);        System.out.println(Arrays.toString(array1));        //Map        Map<Integer, String> map = new HashMap<>();        for(int i = 0; i < 10; i++) {            map.put(1, "hello");            map.put(2, "world");            map.put(3, "!");        }           //Map 的Key转换成数组        Integer[] keys = new Integer[map.size()];        map.keySet().toArray(keys);        System.out.println(Arrays.toString(keys));        //Map 的Value转换成数组        String[] values = new String[map.size()];        map.values().toArray(values);        System.out.println(Arrays.toString(values));    }   }

3, 数组转List、Set:

数组转List一定要了解这个内容
demo:

import java.util.*;public class TestCollection{    public static void main(String args[]) {        Integer[] array = new Integer[10];        for(int i = 0; i < 10; i++) {            array[i] = i;        }        //数组转List        List<Integer> list = Arrays.asList(array);        System.out.println(list);                                                                                              //数组转Set,先转长List,再转成集合,这里也包含List转Set的方法哦        Set<Integer> set = new HashSet(Arrays.asList(array));    }}

4, 数组转Map:
key用一个数组保存,value用一个数组保存,生成对应的Map

import java.util.*;public class TestCollection{    public static void main(String args[]) {        Integer[] keys = new Integer[5];        String[] values = new String[5];        for(int i = 0; i < keys.length; i++) {            keys[i] = i;            values[i] = "hello" + i;                                                                                    }        Map<Integer, String> map = new HashMap<>();        for(int i = 0; i < keys.length; i++) {            map.put(keys[i], values[i]);        }        System.out.println(map);    }}

5,这是上海汉得的一个面试的问题,题目是:通过java编写简要的算法实现删除数组中重复的元素。
如果不考虑效率,我的实现方法是这样的:

  Set<Integer> set = new HashSet(Arrays.asList(array));

直接转换成集合就完事了,我觉得深入了了解各个容器的特性已经底层实现还是很有必要的,每遇到容器选择的时候我都会去复习相关容器的特性。

6,List,Set,间的相互转换
demo:

import java.util.*;public class TestCollection{    public static void main(String args[]) {        List<Integer> list = new ArrayList<>();        for(int i = 0; i < 10; i ++) {            list.add(i);        }        //List 转Set        Set<Integer> set = new HashSet<>(list);        System.out.println(set);                                                                                               //Set转List        List<Integer> list2 = new ArrayList<>(set);        System.out.println(list2);    }}

总结:我只就List、Set、Map来说明,至于LinkedList、 TreeMap、 TreeSet等都是其对应接口的实现或父类的继承,所以,只要父类能实现,子类的实现也是一样的,我也是只是一个java新手,本文也只是想让和我一样的新手少走点弯路,如有不对的地方,请指正!

2 0
原创粉丝点击