java中的asList_java中的Arrays.asList()浅析
1.Arrays.asList(T..)使用的是静态内部类:ArrayList, (没有定义add和remove等一些方法),而不是java.util.ArrayList
/**
* 1.测试Arrays.asList()方法
*@author zhangdi
*@description
* 使用的是静态内部类:ArrayList, (没有定义add和remove等一些方法),而不是java.util.ArrayList
* 接受的参数被一个final修饰的成员变量 private final E[] a接受
* 调用Arrays.asList()的add和remove方法 会抛异常:java.lang.UnsupportedOperationException
*/
@Test
public void testAsListOfArray() {
List list = Arrays.asList("1", "2", "3");
list.add("4");
for (String string : list) {
System.out.println("string:" + string);
}
}
@Test
public void testAsListOfArray2() {
List list = new ArrayList<>();
list.add("5");
list.add("6");
list.add("7");
list.add("8");
for (String string : list) {
System.out.println("string:" + string);
}
}
2.为什么List asList2 = Arrays.asList(d);返回的是List而不是List呢?为什么testAsListOfArray3中的list.size():输出1而不是4呢?
/**
* 2.Array.asList()接收基本类型与单个元素
* @author zhangdi
* @see https://stackoverflow.com/questions/1467913/arrays-aslist-not-working-as-it-should
*/
@Test
public void testAsListOfArray3(){
//1
int[] f = {1,2,3,4};
List list = Arrays.asList(f);
System.out.println("list.size():"+list.size()); //output: list.size():1
//2
int[] a = {1,2,3,4,8,10,22,12,214,23};
String[] b = {"a","b","c"};
Integer[] c = {1,2,3,4,8,10,22,12,214,23};
System.out.println(Arrays.asList(a));
System.out.println(Arrays.asList(b));
System.out.println(Arrays.asList(c));
//3
//There's no such thing as a List in Java - generics don't support primitives.
//Autoboxing only happens for a single element, not for arrays of primitives.
//java arrays are objects and Arrays.asList() treats your int array as a single argument in the varargs list.
int[] d = new int[]{1,2,3,4,8,10,22,12,214,23};
Integer[] e = new Integer[]{1,2,3,4,8,10,22,12,214,23}; //避免使用原始类型数组作为asList的输入参数
List asList2 = Arrays.asList(d);
List asList3 = Arrays.asList(e);
System.out.println(asList2);
System.out.println(asList3);
// output:
/*
1
[[I@232d49d1] //会被当做一个参数接收
[a, b, c]
[1, 2, 3, 4, 8, 10, 22, 12, 214, 23]
[[I@ef05133d]
[1, 2, 3, 4, 8, 10, 22, 12, 214, 23]
*/
}
因为:Arrays.asList()方法接受一个可变参数T,一般可看做数组参数,但是因为int[] 本身就是一个类型,所以a变量作为参数传递时,编译器认为只传了一个变量,这个变量的类型是int数组,所以size为1,相当于是List中数组的个数。基本类型是不能作为泛型的参数,要想作为泛型化参数就必须使用其对应的包装类型。 按道理此处应该使用包装类型,但这里却没有报错,因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组; 所以 ,以后要避免使用原始类型数组作为asList的输入参数.
另外,java8的一些写法:学习一下
//1
Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);
List boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());
//2
Integer[] boxedIntArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
List boxedIntList = Arrays.stream(ints).boxed().collect(Collectors.toList());
自己实现一个asList方法,能够add和remove; (比较一下自己和源码的写法)
/**
*@author zhangdi
*@param strings
*@return 目的也是为了让返回的list是一个可操作的list
*@description jdk 中Arrays.asList()是一个静态方法:
*/
@SafeVarargs
private static List asList(T... args) {
List list = new ArrayList<>();
for (T a : args) {
list.add(a);
}
return list;
}
Arrays.asList()的手写第二个版本(目的也是为了让返回的list是一个可操作的list):
/**
*@author zhangdi
*@param a
*@return
*@description asList_v2 比用for更为简洁
*/
@SafeVarargs
public static List asList_v2(T... a) {
List list = new ArrayList();
Collections.addAll(list, a);
return list;
}
实际上,addAll底层用的也是for循环,还有一个 result |= c.add(element);操作,可以学习一下
/**
* jdk_source:
* 把所有指定元素添加到集合c中, 有一个元素添加成功就返回true
*/
public static boolean addAll(Collection super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
jdk源码 – Arrays.asList(T… a) :
从这个内部类ArrayList的实现可以看出,它继承了类AbstractList,但是没有重写add和remove方法,没有给出具体的实现。查看一下AbstractList类中对add和remove方法的定义,如果一个list不支持add和remove就会抛出UnsupportedOperationException。
@SafeVarargs
@SuppressWarnings("varargs")
public static List asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList extends AbstractList
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
@Override
@SuppressWarnings("unchecked")
public T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
@Override
public E get(int index) {
return a[index];
}
@Override
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
@Override
public int indexOf(Object o) {
E[] a = this.a;
if (o == null) {
for (int i = 0; i < a.length; i++)
if (a[i] == null)
return i;
} else {
for (int i = 0; i < a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
@Override
public boolean contains(Object o) {
return indexOf(o) != -1;
}
@Override
public Spliterator spliterator() {
return Spliterators.spliterator(a, Spliterator.ORDERED);
}
@Override
public void forEach(Consumer super E> action) {
Objects.requireNonNull(action);
for (E e : a) {
action.accept(e);
}
}
@Override
public void replaceAll(UnaryOperator operator) {
Objects.requireNonNull(operator);
E[] a = this.a;
for (int i = 0; i < a.length; i++) {
a[i] = operator.apply(a[i]);
}
}
@Override
public void sort(Comparator super E> c) {
Arrays.sort(a, c);
}
}
java中的asList_java中的Arrays.asList()浅析相关推荐
- java中的asList_Java中的Arrays.asList()方法
Arrays.asList()返回一个List,但是这种情况下,其底层的实现是一个final数组,因此不能调整其尺寸 如下代码片段: package chapter11.t1; import java ...
- java中的asList_java中Arrays.asList的使用
Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类.阿里的开发手册上java开发规范说到使用工具类Ar ...
- java 集合数组初始化_Java用Arrays.asList初始化ArrayList实例方法
Java用Arrays.asList初始化ArrayList实例方法 发布于 2020-2-29| 复制链接 在本篇文章里小妖给大家分享的是关于Java中使用Arrays.asList初始化Array ...
- 【java】数组转list用arrays.aslist报错
现象: 数组转List用arrays.asList方法,只能用于获取数组长度,不能从转成的List中使用add和remove方法 报错:java.lang.UnsupportedOperationEx ...
- java中的asList_Java Arrays.AsList原理及用法实例
java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意: 一. ...
- 【JAVA】谈谈Arrays.asList()
我们在日常的开发中,常常使用到Arrays.asList()这个方法,它能够很轻易地将一个数组转化为一个List. 例如: Integer[] a = new Integer[]{1, 2, 3};L ...
- Java基础之Java8中map和flatMap的使用
Java基础之Java8中map和flatMap的使用 一.介绍 首先,看下map和flatMap的官方文档说明 map flatMap 其实单纯的看api说明还是比较抽象,下面我将以几个实战例子来帮 ...
- java 是否含有日文_Java踩坑记系列之Arrays.asList
阅读本文大概需要6分钟 1. java.util.Arrays.asList()可以方便的把一个数组转成ArrayList集合来使用,但是如果对集合使用增加或删除元素的操作将会报错,如下: List ...
- Exception in thread “main“ java.lang.UnsupportedOperationException Arrays.asList中add报错
public static void main(String[] args) {List<Integer> integers = Arrays.asList(new Integer[]{1 ...
最新文章
- BZOJ4563[Haoi2016]放棋子
- 52 两个链表的第一个公共结点(时间空间效率的平衡)
- android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM
- springcloud hystrix入门简介(二)
- c# forbidden.html,c# - google+ api error forbidden 403 - Stack Overflow
- 大道至简读书笔记(1)
- java图片填充父容器_java相关:spring的父子容器及配置详解
- CentOS 5.5 安装VirtualBox
- 如何评价路孚特的Datastream工具?
- C# Gooflow+layer弹出层 全js代码
- 【RX解码MIPI输出】XS9922B 4通道模拟复合视频解码芯片 功能对标TP2815
- 二、设计模式总览及工厂模式详解
- Android黑科技之微信语音助手-长辈关怀利器
- Linux磁盘管理之GPT分区,磁盘管理之MBR与GPT分区
- php sku颜色,PHP 产品库 SPU、SKU 如何设计?
- PTA:7-6 奇偶数处理
- 【渝粤教育】广东开放大学 公共经济学 形成性考核 (33)
- 微信小程序开发——上课摇号系统的开发
- stm32直流电机PID控制hal库(Cubemx)
- mysql之把查询的结果保存到新表
热门文章
- CF604B货物打包题解
- Windows server 没有网络适配器 找不到无线网卡
- 【Ubuntu】解压 tar.xz 类型文件
- 风力发电机高散热滑环
- vs2019|解决控制台闪退的方法
- php 二维数组 下标,php 二维数组排序 按指定数组下标排序
- [9i]小程序开发中,input组件的常用事件
- Python pexpect模块的使用及示例代码
- JMeter 命令行测试
- 2023中国新能源汽车产品魅力指数排名,比亚迪汉BEV、小鹏G9、蔚来ET7分获细分市场第一 | 美通社头条...