博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java基础】一个有意思的泛型方法Arrays.asList(T... a)
阅读量:4316 次
发布时间:2019-06-06

本文共 4624 字,大约阅读时间需要 15 分钟。

总结

  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
integers = Arrays.asList(1, 2, 3, 4); int[] arr = new int[]{1,2,3,4}; List
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
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@27077aa71234----------------------[1, 2, 3, 4]1234-----------------------11234Process 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}. * *

This method also provides a convenient way to create a fixed-size * list initialized to contain several elements: *

     *     List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");     * 
* * @param a the array by which the list will be backed * @return a list view of the specified array */ @SafeVarargs public static
List
asList(T... a) { return new ArrayList<>(a); }

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

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

转载于:https://www.cnblogs.com/gslyyq/p/4970089.html

你可能感兴趣的文章
sessionStorage
查看>>
代码示例_进程
查看>>
Java中关键词之this,super的使用
查看>>
人工智能暑期课程实践项目——智能家居控制(一)
查看>>
前端数据可视化插件(二)图谱
查看>>
kafka web端管理工具 kafka-manager【转发】
查看>>
获取控制台窗口句柄GetConsoleWindow
查看>>
Linux下Qt+CUDA调试并运行
查看>>
51nod 1197 字符串的数量 V2(矩阵快速幂+数论?)
查看>>
OKMX6Q在ltib生成的rootfs基础上制作带QT库的根文件系统
查看>>
zabbix
查看>>
多线程基础
查看>>
完美解决 error C2220: warning treated as error - no ‘object’ file generated
查看>>
使用SQL*PLUS,构建完美excel或html输出
查看>>
前后台验证字符串长度
查看>>
《算法导论 - 思考题》7-1 Hoare划分的正确性
查看>>
win64 Python下安装PIL出错解决2.7版本 (3.6版本可以使用)
查看>>
获取各种类型的节点
查看>>
表达式求值-201308081712.txt
查看>>
centos中安装tomcat6
查看>>