今天学习和练习Arrays.asList(),这其间发现有些老师并没有讲得很透,网上也没找到相关讲解(或是不全)的易混淆点。在阅读了多篇文章和手动实践后整理出以下知识点。故此记录下来,方便自己复习,也给同样的新人朋友们一些参考。
前注:本人是初学者,如有错误还请多多指教。
-
Arrays.asList()属于工具类Arrays的类方法,使用前需要导包
import java.util.ArrayList;
-
引入参数可以是基本数据类型的数组,但是只能以数组形式存入集合,没有意义(不建议使用)
int[] i={12,56,48};
List<int[]> li=Arrays.asList(i);
//或者
List<int[]> al=new ArrayList<>(Arrays.asList(i));
System.out.println(li); //[[I@1b3ebeb]
System.out.println(li.size()); //1
如果真的想要把基本数据类型数组中的数据存入集合,那就只能先转化为对应的包装类数组再存入集合,方法不少,但最简单的是使用第三方的ArrayUtils工具类中的toObject()
import org.apache.commons.lang3.ArrayUtils;
int[] a={1,2,3};
List<Integer> a1=Arrays.asList(ArrayUtils.toObject(a));
新人朋友要注意这个是第三方开发的工具类(包),需要先去官网下载"Binaries"下的"commons-lang3-(版本号)-bin"的压缩文件,把里边的"commons-lang3-(版本号).jar"解压到你的 jdk>jre>lib>ext 文件夹中。
- 对于List,Arrays.asList()有两种赋值方式
String[] s={"a","b","c"};
List<String> li=Arrays.asList(s);
ArrayList<String> al=new ArrayList<>(Arrays.asList(s));
- 需要注意的是这样的不行的,编译会报错
ArrayList<String> li=Arrays.asList(s);
错误: 不兼容的类型: 不存在类型变量T的实例, 以使List与ArrayList一致
ArrayList li=Arrays.asList(s);
其中, T是类型变量:
T扩展已在方法 asList(T…)中声明的Object
-
List li=Arrays.asList(s); 这种不可以使用add()或是remove(),可以理解为就是一个数组。别的文章说原理是底层其实是一个Array类的自定义内部类,其没有定义add()和remove()
-
ArrayList al=new ArrayList<>(Arrays.asList(s)); 这个可以正常增删的原理是它其实调用的是它的有参构造器,参数为其它集合,所以是一个正常集合。
- 顺便提一下这个 ,其实都是上边讲过的,但是见过有这样的考题,所以特意拿出来再说一次。
Integer[] in={1,2,3};
int[] i={1,2,3};
System.out.println("Integer[] in="+Arrays.asList(in)); //Integer[] in=[1, 2, 3]
System.out.println("int[] i="+Arrays.asList(i)); //int[] i=[[I@139a55]
- 关于Set类型,这样是不可以的
String[] s={"a","b","c"};
Set<String> set=Arrays.asList(s);
记住它返回的是Array类的自定义内部类实例化的对象,所以无法用Set类型做接收。
但是一下两种是可以的:
Set<String> set=new HashSet<>(Arrays.asList(s));
HashSet<String>hs=new HashSet<>(Arrays.asList(s));
其原理也是调用有参构造器
然后就是别忘了Set各个实现类的特性,它们会对这个数组有一定的影响。