基本类型数组转换列表陷阱(asList)

避开基本类型数组转换列表陷阱

示例:

public class test {
   public static void main(String[] args) {
    int[] data={1,2,3,4,5};
    List<int[]> asList = Arrays.asList(data);
  System.out.println(asList);
  System.out.println("int数组在集合中的类型:"+asList.get(0).getClass());
  System.out.println(data.equals(asList.get(0)));
   }
}

结果:
[[I@15db9742]
int数组在集合中的类型:class [I
true
从结果看出int数组被直接作为一个元素存储在了集合中,那怎样才能正确存储呢?
只需要做一下简单的修改就好了

public class test {
   public static void main(String[] args) {
    Integer[] data={1,2,3,4,5};
    List<int[]> asList = Arrays.asList(data);
  System.out.println(asList);
  System.out.println("int数组在集合中的类型:"+asList.get(0).getClass());
  System.out.println(data.equals(asList.get(0)));
   }
}

仔细的同学会发现只是把int[]改变成了Integer[]结果就发生了很大的变化,这就是基本类型与包装类型的却别啦.大家以后再转化的时候一定要注意哦

注意AsList方法产生的List对象不可更改

代码:

public class test {
    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);
    }
}

结果
Exception in thread “main” java.lang.UnsupportedOperationException
为什么会报异常呢?
发掘asList方法源码:

public static <T> List<T> asList(T... a){
 return new ArrayList<T>(a);
}

是直接new ArrayList对象啊,怎么会没有add方法呢?哈哈,看看上面导入的包吧.你会发现他用的Arrays工具类中的一个内之类,并不是我们意识中的java.util.ArrayList 中的,内置类的构造如下:

private static class ArrayList<E> extends AbstractList<E>
inpltments RandomAccess,java.io.Serizable{
 //存储列表元素的数组
 private final E[] a;
 //唯一的构造函数
 Arraylist(E[] array){
  if(array==null) throw new NullPointException();
  a=array;
 }
 /*其他省略*/
}

这里的ArrayList是一个静态私有内部类,只有Arrays呢狗访问,他并没有提供add方法
有人会觉得他的弗雷AbstractList提供了(不见棺材不掉泪)来看源码吧:

public boolean add(E e){
  throw new UnsupportedOperatiobnException();
}

父类确实提供了,但是并没有具体实现,在这个ArrayList静态内部类中他仅仅实现了5个方法:
size:元素数量.
toArray:转化为数组,实现数组的浅拷贝
get:获得指定元素
set:重置某一元素
contains:是否包含某元素
对于我们经常使用的List.add和List.remove()方法都没有实现,也就是说asList返回的是一个长度不可变的列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值