【Java基础】一个有意思的泛型方法Arrays.asList(T... a)

总结

  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),最后转换成一个二维数组,且该二维数组只有一个一维数组对象。

最终输出结果:

[[[email protected]]
mark1: [[email protected]
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,所以这里返回值是什么类型是一个重要的问题,在使用时要注意区分。

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

时间: 2024-10-26 10:22:13

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

黑马程序员——Java基础工具类---Collections、Arrays、超级for循环、静态导入、方法可变参数

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Collections 一.概述 Collections是对集合框架的一个工具类.它里边的方法都是静态的,不需要创建对象.并未封装特有数据. 在Collections工具类中大部分方法是用于对List集合进行操作的,如比较,二分查找,随机

Java基础20-System、Math、Arrays、BigDecimal/Integer

一.Arrays类 此类包含用来操作数组(比如排序和搜索)的各种方法.此类还包含一个允许将数组作为列表来查看的静态工厂. 1.常用方法 public static void main(String[] args) { int[] arr= {1,5,6,8,3,5,2,4,9}; //将int数组转化为字符串 String ret=Arrays.toString(arr); System.out.println(ret); //排序,第二到第六个数进行排序 Arrays.sort(arr,2,6

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

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

Android 之Java基础---一个列表框引发的血案暨java装箱拆箱的实际应用

为了提高代码的封装性及可读性,我把原来手懒搞的一些AsyncTask的继承内部类决定都单独拉到一个文件夹中,但这一拉,出事情了! 我的应用业务是,有一个min_question_id(int )来记录目前读取到的服务器端数据,原来是内部类的时候,用的好好的,这把它单独剥离出来,每次拉取数据却是从头拉取了! 好了,先上原来的代码! public class getQuestionListDataTask extends AsyncTask<Void, Void, Void> { private

java Arrays.asList的用法

import java.util.Arrays; import java.util.List; /** * * 本类演示了Arrays类中的asList方法 * 通过四个段落来演示,体现出了该方法的相关特性. * * (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用 * (2) 当使用asList()方法时,数组就和列表链接在一起了. *     当更新其中之一时,另一个将自动获得更新. *     注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性 * (

Arrays.asList方法总结

import java.util.Arrays; import java.util.List; /** * * 本类演示了Arrays类中的asList方法 * 通过四个段落来演示,体现出了该方法的相关特性. * * (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用 * (2) 当使用asList()方法时,数组就和列表链接在一起了. * 当更新其中之一时,另一个将自动获得更新. * 注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性 * (3) asLis

Arrays.asList()vs Collections.singletonList()

Collections.singletonList(something)是不可变的, 对Collections.singletonList(something)返回的列表所做的任何更改将导致UnsupportedOperationException . Arrays.asList(something)允许Arrays.asList(something) 更改  . 此外,由Collections.singletonList(something)返回的List的容量将始终为1, 而Arrays.a

Arrays.asList使用误区

Arrays.asList使用的jar包是import java.util.Arrays;   Arrays.asList是使用该jar中的ArrayList方法 1.  基本类型数组 Int [] intArr={1,2,3}; List listArr=Arrays.asList(intArr); System.out.println(listArr.size());  ///长度为1 总结:Arrays.ArrayList的参数为可变长泛型,而基本类型(int.boolean.char等)

Java基础知识强化之集合框架笔记33:Arrays工具类中asList()方法的使用

1. Arrays工具类中asList()方法的使用 1 public static <T> List<T> asList(T... a): 把数组转成集合 注意事项: 虽然可以把数组转成集合,但是集合的长度不能改变. 2. 代码示例: (1) 1 package cn.itcast_03; 2 3 import java.util.Arrays; 4 import java.util.List; 5 6 /* 7 * public static <T> List<