关于Arrays.asList 函数的一些 陷阱

博客分类:

居然也碰到这个陷阱的问题了,查了下书,终于解决,大概讲解如下,

代码如下:

Java代码

  1. public static void main(String[] args) {
  2. int[] data = {1,2,3,4,5};
  3. List list = Arrays.asList(data);
  4. System.out.println("列表中的元素数量是:" + list.size());
  5. }
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中,其接收的参数原型其实是泛型变长参数来的,而基本类型是不能作为范型的参数,按道理应该使用包装类型,但这里缺没有报错,

因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组

Java代码

  1. int[] data = {1,2,3,4,5};
  2. List list = Arrays.asList(data);
  3. System.out.println("元素类型:" + list.get(0).getClass());
  4. System.out.println("前后是否相等:"+data.equals(list.get(0)));
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

因为jvm不可能输出array类型,array类型属于java.lang.reflect包,通过反射访问

数组的这个类,编译时候生成的。所以要改为:

Java代码

  1. Integer[] data = {1,2,3,4,5};
  2. List list = Arrays.asList(data);
  3. System.out.println("列表中的元素数量是:" + list.size());
	Integer[] data = {1,2,3,4,5};
		List list = Arrays.asList(data);
		System.out.println("列表中的元素数量是:" + list.size());

此外,假如如下代码:

Java代码

  1. //枚举,声明一个星期
  2. enum Week{Sun,Mon, Tue, Wed,Thu,Fri,Sat}
  3. public static void main(String[] args) {
  4. //工作日
  5. Week[] workDays = {Week.Mon, Week.Tue, Week.Wed,Week.Thu,Week.Fri};
  6. //转换为列表
  7. List<Week> list = Arrays.asList(workDays);
  8. //增加周六也为工作日
  9. list.add(Week.Sat);
//枚举,声明一个星期
	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<Week> list = Arrays.asList(workDays);
		//增加周六也为工作日
		list.add(Week.Sat);

注意这里用add会出错,因为是arrays.aslist中,看代码可以看到这里返回的

ArrayList不是原来的传统意义上的java.util.arraylist了,而是自己工具类的一个

静态私有内部类,并没有提供add方法,要自己实现,所以这里是出错了,因此,
除非确信array.aslist后长度不会增加,否则谨慎使用:

还有就是因为此处的array.asList 底层的实现是一个固定大小的数组,所以生成的list仅仅是可以进行哪些不改变数组大小的操作因此
List<String> abc=Arrays.asList("a","b","c"),因为这样的长度是无法再add的了

时间: 2024-10-27 10:35:10

关于Arrays.asList 函数的一些 陷阱的相关文章

学会使用RecyclerView 及Arrays.asList函数

要实现ListView列表的循环滚动效果,其实可以用RecyclerView实现. Runnable run = new Runnable() { @Override public void run() { // String str = "abc"; // datas.add(str); // mRecyclerAdapter.notifyItemInserted(1); datas.remove(curPos); mRecyclerAdapter.notifyItemRemoved

Java之Arrays.asList陷阱

http://www.cnblogs.com/treerain/p/Java_Arrays_asList.html Java.Util.Arrays可以将数组转换为List,具体的定义如下: @SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 可以看到实际上是将这个数组转换成为了ArrayList<>,看似没有问题,但是当我们使用add和re

Arrays.asList的用法:

Arrays.asList 返回数组而非List. List的一个典型的特性就是其长度是可变的,我们可以很方便地对它进行插入和删除元素的操作,这是它与数组所存在的一个很大的区别,后者的长度是固定的,而且我们不能从数组中删除元素,只能修改元素的值. 利用Arrays.asList(array)返回一个List,然而这个返回的是只读的List不支持add和remove的操作. JDK文档是这么说的: public static <T> List<T> asList(T... a) 返回

【转】java.util.Arrays.asList 的用法

DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.Arrays.asList的定义,函数参数是Varargs, 采用了泛型实现.同时由于autoboxing的支持,使得可以支持对象数组以及基本类型数组. 不过在使用时,当传入基本数据类型的数组时,会出现小问题,会把传入的数组整个当作返回的List中的第一个元素,例如: public static vo

Java - 一道关于Arrays.asList的题目

题目 有这样一道有趣的题目: final int[] test = new int[]{1,2,3,4}; final Integer[] test2 = new Integer[]{1,2,3,4}; final List list1 = Arrays.asList(test); final List list2 = Arrays.asList(test2); final List list3 = Arrays.asList(1,2,3,4); System.out.println(list1

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

总结 利用Arrays.asList方法返回的List是不允许add和remove的,这种list的长度不可变,因为底层依然是写数组. Arrays.asList的返回值是调用是传入T类型的List,所以传入啥,返回啥的列表 T... a 底层本来就是转换为T[] x的数组,所以如果传入的T是数组,最后的底层参数是二维数组T[][] y. Arrays.asList(T... a)方法的作用 将数组转为集合的方法,返回的是List集合.和Collection的toArray对应,是数组和集合间相

浅谈Arrays.asList()方法的使用

首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新 (3)不支持add和remove方法 上代码: 1 package com.hdu.test; 2 3 import java.util.Arrays; 4 import java.util.List; 5 6 abstract public class

Arrays.asList 小结

Arrays.asList()返回一个实现了List接口的类,但是不支持add,remove等改变尺寸的操作. Arrays.asList源码如下 1 public static <T> List<T> asList(T... a) { 2 return new ArrayList<>(a); 3 } 这里有一个大坑,我开始没仔细看,以为返回的就是java.util.ArrayList,可实际上此ArrayList是Arrays里面的私有静态内部类,代码如下所示. 1

Arrays.asList () 不可添加或删除元素的原因

Java中奖数组转换为List<T>容器有一个很方便的方法 Arrays.asList(T ... a),我通过此方法给容器进行了赋值操作,接着对其进行 添加元素,却发现会抛出一个(java.lang.UnsupportedOperationException)异常. 看了一下源码: public static <T> List<T> asList(T... a) { return new ArrayList<T>(a); } 定位到 ArrayList 内