java 容器、数组相互转换
来源:互联网 发布:软件p光头 编辑:程序博客网 时间:2024/05/17 07:05
1,来个图解释一下容器间的关系
这图我是从这里找来的(图原址),这个图对新手来说真是超级棒啊,应该打印出来,慢慢对子各自的优劣,每次需要用容器的时候就去图上找。
2,List、Set、Map 转换成数组
Collection有一个方法叫做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新手,本文也只是想让和我一样的新手少走点弯路,如有不对的地方,请指正!
- java 容器、数组相互转换
- java 数组 List 相互转换
- java 文件和byte数组相互转换
- java中字符串 字符数组相互转换
- Java中数组与List相互转换
- java ByteBuffer和byte 数组相互转换
- Java 数组、List、Set、Map相互转换
- java数组和字符串相互转换
- java图片和数组相互转换
- java File和Byte[]数组 相互转换
- Java 数组、List、Set、Map相互转换
- java中数组与集合相互转换
- Java byte数组和文件相互转换
- java数组和List相互转换
- java数组、集合使用及相互转换
- java数组和字符串相互转换
- java List和数组相互转换方法
- Java 对象与字节数组相互转换
- Java web使用第三方插件JFreeChart进行图形开发
- C# 多线程的自动管理(线程池)
- "多线程和线程池"-之通俗易懂的介绍+图文,代码解析
- android UI 组件-对话框
- javascript 检查邮件是否正确
- java 容器、数组相互转换
- Eclipse很卡很受不了,这个小技巧能帮上忙
- NAT类型与NAT穿越技术
- Preconditions优雅的检验参数
- linux环境下新建weblogic域
- 用Redis的set指令实现锁
- SevletContext
- ASCII控制字符和ASCII可显示字符
- Copy List with Random Pointer