Arrays.asList() 的使用注意
Sometimes it is needed to convert a Java array to List or Collection because the latter is a more powerful data structure - A java.util.List have many functionality that ordinary array do not support. For example, we can easily check if a List contains a specific value with just one built-in method call. Below are some examples on how to convert an array to List.
Convert Array To List using java.util.Arrays.asList()
The class java.util.Arrays has a convenient method named asList that can help with the task of conversion. Here is the syntax:
public static <T> List<T> asList(T... a)
Notice that the parameter does not necessarily receive an array but varargs. It means we can create a List using this code:
public class Test {
public static void main(String[] args) {
List<String> myList = Arrays.asList("Apple");
}
}
Which creates a List with one item - the String "Apple". We could also do this:
public class Test {
public static void main(String[] args) {
List<String> myList = Arrays.asList("Apple", "Orange");
}
}
This will create a List with two items - the Strings "Apple" and "Orange".
Since this is varargs, we can pass an Array and the items are treated as the arguments. Here is an example code:
public class Test {
public static void main(String[] args) {
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = Arrays.asList(myArray);
for (String str : myList) {
System.out.println(str);
}
}
}
Here, a List of String was created and the contents of the Array "myArray" was added to it. The List "myList" will have the size of 3. Here is the output of the code:
Apple
Banana
Orange
Pitfalls
This approach however has some problems:
- The Array passed must be an array of Objects and not of primitive type
If we will pass an array of primitive type, for example:
public class Test {
public static void main(String[] args) {
int[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());
}
}The output of the code will be:
1
Why? Because the asList method is expecting a varargs of Objects and the parameters passed is an Array of primitive, what it did was it created a List of Array! And the only element of the List is "myArray". Hence, this code
myList.get(0)
will return the same object as "myArray".
- The List created by asList is fixed-size
The returned list by the asList method is fixed sized and it can not accommodate more items. For example:
public class Test {
public static void main(String[] args) {
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = Arrays.asList(myArray);
myList.add("Guava");
}
}Will have the output:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at Test.main(Test.java:8)Because myList is fixed-sized an can't add more items to it.
Convert Primitive Array To List
As mentioned above, passing a primitive array to Arrays.asList() will
not work. A workaround without introducing a third party library is
through Java 8's stream. Here is an example:
public class Test {
public static void main(String[] args) {
int[] intArray = { 5, 10, 21 };
List myList = Arrays.stream(intArray).boxed()
.collect(Collectors.toList());
}
}
And the individual array items will be converted from int to Integer (boxing), and converted to a List.
Convert Array To List That Allows Adding More Items
As mentioned in pitfalls above, the result of Arrays.asList() does not
support adding or removing items. If you don't want this behavior, here
is an alternative solution:
public class Test {
public static void main(String[] args) {
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = new ArrayList<String>(Arrays.asList(myArray));
myList.add("Guava");
}
}
What this code do is create a new ArrayList explicitly and then add the items from the result of Arrays.asList(). And since it is our code that created the ArrayList, there is no restriction in adding or removing items. The code above will have 4 items in it right before the program ends. No exception will be thrown when the code is executed.
Convert Array To List Using Own Implementation
There are times when it is better to use our own implementation when
solving a problem. Here is a simple implementation of converting a Java
array to List:
public class Test {
public static void main(String[] args) {
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = new ArrayList<String>();
for (String str : myArray) {
myList.add(str);
}
System.out.println(myList.size());
}
}
The expected output of the code is that it should display "3", because there are 3 items in the List after the logic is executed.
The downside of this is that our code is longer and we are reinventing the wheel. The pros is that we can accommodate customization if our requirement changes. For example, here is the code where each item in the array is added twice to the List.
public class Test {
public static void main(String[] args) {
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = new ArrayList<String>();
for (String str : myArray) {
myList.add(str);
myList.add(str);
}
System.out.println(myList.size());
}
}
Here the output becomes 6 because each String in the array was added twice. Here is another example that converts an array of String to a List of Integer:
public class Test {
public static void main(String[] args) {
String[] myArray = { "5", "6", "7" };
List<Integer> myList = new ArrayList<Integer>();
for (String str : myArray) {
myList.add(Integer.valueOf(str));
}
}
}
Each String in the array is parsed and converted to corresponding Integer. The resulting List will contain all converted Integers.
Arrays.asList() 的使用注意的更多相关文章
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- Arrays.asList()注意
api: public static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表.(对返回列表的更改会“直接写”到数组.)此方 ...
- Arrays.toString Arrays.asList
import java.util.Arrays; public class TestCalc{ public static void main(String[] args) { ,,,,,,,}; / ...
- Arrays.asList()使用注意点
今天看代码时, 发现书上使用了Arrays.asList()方法, 将一个数组转成了List, 然后说到得到的List不能调用add(), remove()方法添加元素或者删除,带着疑问看了下内部实现 ...
- Arrays.asList(数组) 解说
最近在用Arrays的asList()生成的List时,List元素的个数时而不正确. Java代码 一:Arrays.asList(数组)该方法是将数组转化为集合(该方法主要用于Object对象数组 ...
- Arrays.asList方法总结
import java.util.Arrays; import java.util.List; /** * * 本类演示了Arrays类中的asList方法 * 通过四个段落来演示,体现出了该方法的相 ...
- Arrays.asList的使用及异常问题
将数组转成List问题,通常我们习惯这样写成:List<String> list = Arrays.asList("1","2"); 于是我们这样就 ...
- Arrays.asList引起的惨案
最近代码中需要对两个数组求交,想当然便用到了List中的retainAll函数,但要将将数组转换成list.代码如下: String[] abc = new String[] { "abc& ...
- Arrays.asList的源码分析
以前一直很奇怪为什么Arrays.asList的数组不能插入新的数据,后来看了源码发现是因为内部是一个final的数组支持起来的Arraylist,下面贴入源码与分析. 1.先看Arrays的方法 我 ...
- 【转载】最近在用Arrays的asList()生成的List时,List元素的个数时而不正确,数组转化为List,即Arrays.asList(intArray);
最近在用Arrays的asList()生成的List时,List元素的个数时而不正确. Java代码 //经多次测试,只要传递的基本类型的数组,生成List的元素个数均为1 char arrc = { ...
随机推荐
- 解决Eclipse每次修改完代码后需要先Clean,不然修改的代码无效
工具栏 Project-->Build Automatically 勾选上即可
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- [UOJ317]【NOI2017】游戏 题解
题意 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图一共有四种,分别用小写字 ...
- java 连接数组
一,使用Apache Commons的ArrayUtils Apache Commons类库有很多,几乎大多数的开源框架都依赖于它,Commons中的工具会节省你大部分时间,它包含一些常用的静态方法和 ...
- C# Winfrom常用的几个公共控件
ComboBox控件的使用方法: //首先写好查询方法,实例化对象, NationData nd = new NationData(); List<Nation> NN = new Lis ...
- [luogu2296][寻找道路]
直接赋题目..... 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- gradle下载jar包
使用IntelliJ IDEA+gradle的时候,有时用到的是公司的jar包,如果在外面就无法访问仓库,因此试着下载所需要的jar包到电脑上.然后发现原来gradle已经缓存到本地上了,可用如下方式 ...
- maomao的现在与未来
今晚开始,maomao决定要成为一个和以前不一样的人了. 自从高一开始竞赛生涯以来,我的竞赛就一直处于不是很好,也不是很差的水平,就像我初中一年级到二年级一直处于的状态一样.一直以来,我从来没有对自己 ...
- 多态(instanceof)
多态调用的三种格式 * A:多态的定义格式: * 就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); * B: 普通类多态定义的格式 父类 变量名 = ...
- rabbitMQ 3.6.15生产环境
服务器配置 系统环境:CentOS 7 由于RabbitMQ依赖erlang, 所以需要先安装erlang 下载erlang 下载地址 http://erlang.org/download/ linu ...