总结

  1. 利用Arrays.asList方法返回的List是不允许add和remove的,这种list的长度不可变,因为底层依然是写数组。
  2. Arrays.asList的返回值是调用是传入T类型的List,所以传入啥,返回啥的列表
  3. T... a 底层本来就是转换为T[] x的数组,所以如果传入的T是数组,最后的底层参数是二维数组T[][] y.

Arrays.asList(T... a)方法的作用

将数组转为集合的方法,返回的是List集合。和Collection的toArray对应,是数组和集合间相互转换的两个桥梁方法。asList接受的参数是T... a,这是一种可变参数的表示,这种可变参数底层其实会转化为T[] x的形式,所以可以接受多个T类型的传参。

Arrays.asList的示例代码

下面写了一段利用Arrays的asList方法将数组转为List链表的测试方法:

import java.util.*;

/**
* Created by lili on 15/11/13.
*/
public class Test {
public static void main(String[] args) {
      
List<Integer> integers = Arrays.asList(1, 2, 3, 4); int[] arr = new int[]{1,2,3,4};
List<int[]> list0 = Arrays.asList(arr);
System.out.println(list0);
// list0.add(new int[]{111});//出错
for(int[] a : list0){
System.out.println("mark1: "+a);//打印的是地址,Integer数组
for(int i : a){
System.out.println(i);
}
}
System.out.println("----------------------");
// list0.set(0,11);//java.lang.ArrayStoreException: java.lang.Integer
list0.set(0, new int[]{11}); List<Integer> list1 = Arrays.asList(1,2,3,4);
System.out.println(list1);
for(int a : list1){
System.out.println(a);
}
System.out.println("-----------------------");
list1.set(0, 11);
// list1.add(11);//不支持add for(int a : list1){
System.out.println(a);
}
}
}

上述代码首先明显的说明了一个问题:

  利用Arrays.asList方法返回的List是不允许add的,同时测试了remove也不可以,但是可以改为各个索引位置的值。隐含表示List长度不可变。

反编译出来的结果是:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// import java.util.Arrays;
import java.util.Iterator;
import java.util.List; public class Test {
public Test() {
} public static void main(String[] var0) {
List var1 = Arrays.asList(new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4)});
int[] var2 = new int[]{1, 2, 3, 4};
List var3 = Arrays.asList(new int[][]{var2});
System.out.println(var3);
Iterator var4 = var3.iterator(); while(var4.hasNext()) {
int[] var5 = (int[])var4.next();
System.out.println("mark1: " + var5);
int[] var6 = var5;
int var7 = var5.length; for(int var8 = 0; var8 < var7; ++var8) {
int var9 = var6[var8];
System.out.println(var9);
}
} System.out.println("----------------------");
var3.set(0, new int[]{11});
List var10 = Arrays.asList(new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4)});
System.out.println(var10);
Iterator var11 = var10.iterator(); int var12;
while(var11.hasNext()) {
var12 = ((Integer)var11.next()).intValue();
System.out.println(var12);
} System.out.println("-----------------------");
var10.set(0, Integer.valueOf(11));
var11 = var10.iterator(); while(var11.hasNext()) {
var12 = ((Integer)var11.next()).intValue();
System.out.println(var12);
} }
}

上述反编译出来的结果除了表明增强型for循环会转变为Iterator外,更重要的是表明asList接受的传参最后会转变为数组:

  1. 如果直接在asList(int a,int b,int c,int d)中传入一个个的值,最后转换的是int[]{a,b,c,d},是一维数组。
  2. 如果传入的本来是一个数组asList(int[] arr),最后转换成一个二维数组,且该二维数组只有一个一维数组对象。

最终输出结果:

[[I@27077aa7]
mark1: [I@27077aa7
1
2
3
4
----------------------
[1, 2, 3, 4]
1
2
3
4
-----------------------
11
2
3
4 Process finished with exit code 0

Arrays.asList的方法结构

在这里我们最大的疑惑是为啥返回的是List,却不允许添加元素呢?下面看看asList的源码:

 /**
* Returns a fixed-size list backed by the specified array. (Changes to
* the returned list "write through" to the array.) This method acts
* as bridge between array-based and collection-based APIs, in
* combination with {@link Collection#toArray}. The returned list is
* serializable and implements {@link RandomAccess}.
*
* <p>This method also provides a convenient way to create a fixed-size
* list initialized to contain several elements:
* <pre>
* List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
* </pre>
*
* @param a the array by which the list will be backed
* @return a list view of the specified array
*/
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}

asList是一个泛型方法,可以接受可变参数传递,而返回值是调用方法时传入类型T的List,所以这里返回值是什么类型是一个重要的问题,在使用时要注意区分。

之所以不能修改,注释的解释是:返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)-->由于数组长度不可变,所以不可增删

【Java基础】一个有意思的泛型方法Arrays.asList(T... a)的更多相关文章

  1. Java踩坑记系列之Arrays.AsList

    java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意: 一. ...

  2. 【Java必修课】好用的Arrays.asList也有这三个坑

    好用的asList 在开发或写测试用例的过程中,经常会用到Arrays.asList()这个方法,可以快速方便地将数组转化成一个List.例如: List<String> list = A ...

  3. Java基础知识强化62:Arrays工具类之概述和使用

    1. Arrays工具类: Arrays这个类包含操作数组(比如排序和查找)的各种方法. 2. Arrays的方法: (1)toString方法:把数组转成字符串 public static Stri ...

  4. java基础64 JavaScript中的Arrays数组对象和prototype原型属性(网页知识)

    1.Arrays数组对象的创建方式 方式一: var 变量名=new Array(); //创建一个长度为0的数组. 方式二: var 变量名=new Array(长度); //创建一个指定长度的数组 ...

  5. Java基础系列(40)- Arrays类

    Arrays类 数据的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作 查看 ...

  6. Java基础-一个java文件多个类的问题

    一个.java文件当然可以包括多个类.但这些类有一个特殊的类与其它的不同,,这个类是带public 属性的类.一个.java类文件中仅有一个public属性的类.而且这个类与文件名相同.

  7. Java基础知识强化63:Arrays工具类之方法源码解析

    1. Arrays工具类的sort方法: public static void sort(int[] a): 底层是快速排序,知道就可以了,用空看. 2. Arrays工具类的toString方法底层 ...

  8. java基础/一个类A继承了类B,那么A就叫做B的派生类或子类,B就叫基类或超类。

    类重复,pulic class demo1 和class demo1 重复 无主类, 在cmd中输入命令: SET CLASSPATH=. (等号后为英文点符号),即可设置解释的路径为当前路径. 再次 ...

  9. Java.基础 -------- 一个Java源文件中可以有很多类,但只能有一个类是public的

    一个Java源文件中可以有很多类,但只能有一个类是public的        Java程序是从一个public类main函数开始执行的,只能有一个public是为了给类装载器提供方便,一个publi ...

随机推荐

  1. Nodejs初学者福音

    Nodejs+Express+MongoDb 搭建个人博客  001 我喜欢把任务或者工作分解成工作流来完成,如下,后面将会按照流程来详述,希望能为Nodejs初学者及推广Nodejs做出些努力. n ...

  2. ImportError: No module named pysqlite2 --安装pysqlite

    yum install sqlite-devel -y pip install pysqlite 每次使用yum安装额外的包之后都需要重新安装python,否则可能会有各种奇奇怪怪的问题出现 cd P ...

  3. CentOS 6.6x64下编译gcc-4.7.4

    最近使用老版本的gcc发现一些问题,于是想尝试升级. 看了一些教程之后进行尝试,发现各类教程均会有一些小问题,于是在此记录一下本人的过程. 编译过程中参考的文章有如下几篇,在此表示感谢: http:/ ...

  4. 用最直白的语言告诉你,hadoop是什么?

    hadoop应历史之潮流,随着理论探索.科学技术试验的不断开展,hadoop终于2006年问世,惊天地泣鬼神! hadoop雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java ...

  5. iOS新上线注意事项

    上传不出现构建版本 现在苹果要求先上传版本,然后在提交审核,但是现在经常上传完应用后,不出现构建版本,等待很久很久,也不出现,那么怎么解决,我告诉你~~尼玛的苹果是自己数据丢包了,结果就造成你不出现构 ...

  6. Memcached(七)Memcached的并发实例

    1. Memcached是什么?Memcached是分布式的内存对象缓存系统.  2. Memcached的基本数据结构是什么?Memcached是基于Key/Value对的HashMap.每一对,都 ...

  7. Nhibernate 一对多,多对一配置

    先来分析下问题,这里有两张表:Users(用户表) U和PersonalDynamic(用户动态表) PD,其中PD表的UserId对应U表的Id 如图: 现在映射这两张表: 如图: User.hbm ...

  8. Spring+MyBatis实践—中文乱码

    多种中文乱码问题及解决: jsp页面乱码 表单提交乱码 URL中文参数乱码 1.jsp页面乱码解决(2步): 新建jsp页面: <%@ page language="java" ...

  9. DHTMLX 前端框架 建立你的一个应用程序 教程(十)--保存表单中的数据

    保存表单中的数据 现在我们所要做的是 当用户点击提交按钮的时候  我们将表单中的数据进行保存操作. 我们可以使用dhtmlxDataProcessor. 来进行操作.它是一个数据组件,可以提供与服务器 ...

  10. edX Devstack 汉化(i18n)

    操练了几日edx Devstack后,发现自己e文还是那么poor,如果和我一样,继续往下看,否则可以轻轻的飘过- 1.运行起 edx Devstack cd /devstack vagrant up ...