java Arrays.aslist用法

java.util 类 Arrays

java.lang.Object——java.util.Arrays
public class Arrays

extends Object

此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。 除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。一段有意思的代码如下:

Java代码

public static void main(String[] args) {

int[] data = {1,2,3,4,5};

List list = Arrays.asList(data);

System.out.println("列表中的元素数量是:" + list.size());

}

注意这里输出的数量是1,原因是,在Arrays.asList中,该方法接受一个变长参数,一般可看做数组参数,但是因为int[] 本身就是一个类型,所以data变量作为参数传递时,编译器认为只传了一个变量,这个变量的类型是int数组,所以size为1。基本类型是不能作为泛型的参数,按道理应该使用包装类型,但这里缺没有报错,因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组

Java代码 

int[] data = {1,2,3,4,5};

List list = Arrays.asList(data);

System.out.println("元素类型:" + list.get(0).getClass());

System.out.println("前后是否相等:"+data.equals(list.get(0)));

可以看到,
输出的为元素类型:class [I
前后是否相等:true
因为jvm不可能输出array类型,array类型属于java.lang.reflect包,通过反射访问数组的这个类,编译时候生成的。所以要改为:

Java代码 

Integer[] data = {1,2,3,4,5};

List list = Arrays.asList(data);

System.out.println("列表中的元素数量是:" + list.size());

输出结果:
列表中的元素数量是:5

说明编译器对Integer[] 处理不一样。Integer是可变长参数。传入过程中asList()方法实际是将Integer数组里的元素进行存储。

此外,假如如下代码:

Java代码 

//枚举,声明一个星期

enum Week{Sun,Mon, Tue, Wed,Thu,Fri,Sat}

public static void main(String[] args) {

//工作日

Week[] workDays = {Week.Mon, Week.Tue, Week.Wed,Week.Thu,Week.Fri};

//转换为列表

List list = Arrays.asList(workDays);

//增加周六也为工作日

list.add(Week.Sat);

注意这里用add会出错,因为是arrays.aslist中,看代码可以看到这里返回的ArrayList不是原来的传统意义上的java.util.arraylist了,而是自己工具类的一个静态私有内部类,并没有提供add方法,要自己实现,所以这里是出错了,因此,除非确信array.aslist后长度不会增加,否则谨慎使用:List abc=Arrays.asList("a","b","c"),因为这样的长度是无法再add的了.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Java 10 实战第 1 篇:局部变量类型推断

现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了。

1174
来自专栏desperate633

LeetCode 28. Implement strStr()题目分析代码

对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不...

873
来自专栏Bingo的深度学习杂货店

Q169 Majority Element

Given an array of size n, find the majority element. The majority element is the...

4147
来自专栏battcn

一起学设计模式 - 迭代器模式

迭代器模式听起来可能感觉很陌生,但是实际上, 迭代器模式是所有设计模式中最简单也是最常用的设计模式,正是因为太常用了,所以导致很多人忽略了它的存在。

904
来自专栏分享达人秀

经常被问到的有深度有内涵的数据结构面试题

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构...

1969
来自专栏禁心尽力

Java Collection知识总结

首先说说java中常用的集合容器:ArrayList,LinkedList,Vector,HashMap,Hashtable,HashSet,TreeSet。【...

20010
来自专栏斑斓

编程修炼 | Scala中Stream的应用场景及其实现原理

假设一个场景需要在50个随机数中找到前两个可以被3整除的数字。听起来很简单,我们可以这样来写: def randomList = (1 to 50).map(_...

2925
来自专栏二进制文集

JDK源码分析 Integer

对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。所以我的JDK源码分析,着重在JDK的体系架构层面,具体源...

1183
来自专栏MyBlog

Effective.Java 读书笔记(11)关于clone方法

说到clone方法,我们来提一提Cloneable这个接口,这个接口是用来作为一种标记某对象允许被clone的一种混合接口,可是不幸运的是,这个接口并没能起到该...

1072
来自专栏专注研发

poj-1056-IMMEDIATE DECODABILITY(字典)

An encoding of a set of symbols is said to be immediately decodable if no code f...

891

扫码关注云+社区

领取腾讯云代金券