在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过于麻烦。Java中有一个工具类Arrays类,提供一个方法asList()可以直接将数组转换为List集合。但是一定要注意,Arrays.asList(T... a)返回的是一个固定长度的ArrayList,是不能对返回的list进行add或者remove等操作的,因为返回的并不是java.util.ArrayList对象,是java.util.Arrays.ArrayList对象,是Arrays类的内部类。查看源码可以知道如果对该类进行add等操作,是要抛出异常的。该类的定义是起到一个桥梁作用,如果我们需要对转换的List集合进行修改操作,我们可以通过List<T> list = new ArrayList<T>(Arrays.asList(array));的方式,这样产生的list是觉得可以修改的。代码实现如下:
- String[] arrStr = {"a","b","c"};
- List<String> list1 = Arrays.asList(arrStr);
- List<String> list2 = new ArrayList<String>(Arrays.asList(arrStr));
String[] arrStr = {"a","b","c"}; List<String> list1 = Arrays.asList(arrStr); List<String> list2 = new ArrayList<String>(Arrays.asList(arrStr));
结论:如果我们需要将数组转换为可修改的集合List就使用List<T> list = new ArrayList<T>(Arrays.asList(array));如果我们对转换的集合不修改就直接使用List list = Arrays.asList(array);
2、集合对象转换为数组对象
这个就简单了一常用了,直接使用List接口的toArray方法。需要注意的是List有两个重载的toArray方法,第一个List.toArray()返回Object[],第二个List.toArray(T[] a)返回T[].那到底使用哪个呢,两种方法有什么区别呢?第一种返回的是Object[]类型,如果我们想要转换的数组的类型不是Object,那就需要向下转型,但是向下转型会导致类型不兼容,所以会抛出异常,但是我们可以遍历Object[]数组,让后将数组中的每一个元素进行类型转换,这样就不会类型转换异常。通常我们使用带参数的方法,这样就可以通过泛型,返回特定类型的数组,就不用再依次转换了。比如我们将List<String>转换为String[],我们可以通过下面的代码实现:
- List<String> listStr = new ArrayList<String>();
- listStr.add("one");
- listStr.add("two");
- String[] arrStr1 = listStr.toArray(new String[] {});
- String[] arrStr2 = listStr.toArray(arrStr1);
- String[] arrStr3 = (String[]) listStr.toArray();//这样是不行的。不能直接将Object[]转换为String[]
List<String> listStr = new ArrayList<String>(); listStr.add("one"); listStr.add("two"); String[] arrStr1 = listStr.toArray(new String[] {}); String[] arrStr2 = listStr.toArray(arrStr1); String[] arrStr3 = (String[]) listStr.toArray();//这样是不行的。不能直接将Object[]转换为String[]
结论:将集合转换为数组,最好使用toArray(T[] t)方法返回指定类型的数组。
3、判断某个元素是否属于集合或者数组
对于集合对象,提供了直接使用的方法。可以通过contailns方法判断。当然也可以自己使用最暴力的方式,遍历集合中的所有元素。
对于数组对象,没有直接使用的方法,我们可以使用最暴力的方式,遍历数组,但是显然这样做不优雅。所以我们可以借助上面说的现将数组对象转换为集合对象,然后使用集合的contains方法。如果我们只是想判断特定元素是否存在于数组对象中,不对原数据进行修改,那么就可以直接使用Arrays.asList()方法,生成一个固定大小的List,然后直接使用contains方法,具体代码如下:
- List<String> listStr = new ArrayList<String>();
- listStr.add("a");
- listStr.add("b");
- listStr.add("c");
- boolean result1 = listStr.contains("d");//false
- String[] arrStr= {"a","b","c"};
- boolean result2 = Arrays.asList(arrStr).contains("a");//true
相关推荐
list转数组
集合和数组的区别: 1.集合是大小可变的序列,数组在声明后,长度不可变 2.数组只能存放声明时指定的一种数据类型,集合可变存放多种数据类型 3.数组可以存放基本数据类型,集合只能存放对象 ps:要想往集合中...
Enumerables 是 Java 8 集合的包装器,提供 map 和 reduce 等功能方法,同时始终保持不可变和(重新)迭代。 与 Stream 相比,Enumerables 提高了代码的可用性和可读性,尤其是在处理小型内存中的集合时,无需每次...
在我们日常开发中难免会要将ArrayList和数组相互转换,那么如何才能相互转换呢?下面跟着小编一起通过这篇文章学习学习。
15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“three—dimensional array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 ...
15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支...
15.3.3 链表和数组链表 15.3.4 链表应用 15.3.5 数组链表应用 15.4 集Set 15.4.1 排序集接口 15.4.2 哈希集和树集 15.4.3 树集应用 15.5 映射Map 15.5.1 映射接口方法 15.5.2 排序映射接口 15.5.3 哈希...
15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 16.3 ...
10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一维集合 10.6.2使用List集合 10.6.3使用Set集合 10.6.4使用Collections类对集合进行处理 10.6.5使用泛型简化集合...
15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 ...
java,android map形式和数组list转json字符串 可直接调用
13.14 与Java集合的互操作 213 13.15 并行集合 215 练习 217 第14章 模式匹配和样例类 A2 221 14.1 更好的switch 222 14.2 守卫 223 14.3 模式中的变量 223 14.4 类型模式 224 14.5 匹配数组、列表和元组 ...
第2章嵌套循环和数组. 44 核心技能部分… .45 2.1 VS2008中的调试技巧 45 2.2 嵌套循环 47 2.3 数组. 50 231数组的定义 50 232数组的基木操作 50 233数组的排序 51 任务实训部分… 55 1打印等腰三角形 55 2:数组的...
2.5 结构化数据 结构化数据具备特定的数据结构,通常可以转换后最终用二维的结构的数据, 并且其字段的含义明确,是挖掘数据价值的主要对象。 本平台中主要使用Hadoop Impala和Spark SQL来进行结构化数据的处理。...