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 = { ...
随机推荐
- phpcms 手机门户配置注意事项
设置域名解析后,服务器apache,iis,nginx等,设置虚拟服务器时, 如下,只设置index.php为默认入口文件: 默认pc站为index.html为默认访问文件! pc与wap站,绑定目录 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- OpenLayers学习笔记(五)— 拖拽Feature图层
参考文档的例子可以知道如何拖动矢量图层feature GitHub: 八至 作者:狐狸家的鱼 本文链接:拖拽Feature图层 全部代码 <!DOCTYPE html> <html& ...
- 洛谷P3396 哈希冲突
分块还真是应用广泛啊...... 题意:求 解:以n0.5为界. 当p小于n0.5的时候,直接用p²大小的数组储存答案. 预处理n1.5,修改n0.5. 当p大于n0.5的时候,直接按照定义计算,复杂 ...
- 【BZOJ3289】Mato的文件管理 莫队+树状数组
题目大意:给定一个长度为 N 的序列,M 个询问,每次询问区间逆序对的个数. 题解:用树状数组加速答案转移. 代码如下 #include <bits/stdc++.h> #define f ...
- 【洛谷P2868】Sightseeing Cows
题目大意:给定一个 N 个点,M 条边的有向图,点有点权,边有边权,求该有向图中的一个环,使得环上点权和与环上边权和之比最大. 题解:0/1 分数规划思想,每次二分一个 mid,在新图上跑 spfa, ...
- [luoguU48574][藏妹子之处]
题目链接 思路 首先,因为这是曼哈顿距离,所以很容易就可以将这三个点之间的距离转化为一个矩形,那么这三个点在矩形上的分布只有六种可能. 假设当前矩形的长为n,宽为m.那么可以发现,无论是哪一种情况,这 ...
- 【听RQY大佬“训话”有感】
今天听了山东省“红太阳”——RQY大佬(dalao获奖传送门)的讲话,做一下总结及感悟: 总结: 1.基础重要!!!.基础重要!!!.基础重要!!!(重要的事情说三遍) 只要基础好了,后面知识都很简单 ...
- Django(五)框架之模板继承和静态文件配置
https://www.cnblogs.com/haiyan123/p/7731959.html 一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% end ...
- easyUI 两个grid表格数据左移右移代码
做项目中经常遇到选择已有数据,移动到选择好数据grid的场景,比如为项目添加员工,左侧grid是待选择员工,选好后移动到右侧grid,这里我用的jquery-easyui-1.4.2,整理出一份gri ...