坑一:java.util.Arrays#asList的参数不要传入基本类型数组
示例:基本类型数组作为参数
package com.example.demo;
import java.util.Arrays;
import java.util.List;
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
long[] demo = new long[]{1L, 8L, 88L};
List<long[]> longs = Arrays.asList(demo);
System.out.println(longs);
for (long[] aLong : longs) {
System.out.println(aLong);
}
}
}
输出:
基本类型数组作为Arrays.asList参数,返回的列表中只有一个元素。
因为Arrays.asList的参数是一个泛型变长参数,但是java中基本类型是不能泛型化的。
我们必须使用包装类型,避免这种问题的发生:
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
Long[] demo = new Long[]{1L, 8L, 88L};
List<Long> longs = Arrays.asList(demo);
System.out.println(longs);
for (Long aLong : longs) {
System.out.println(aLong);
}
}
}
结果:
其实基本类型作为参数,如果使用IDE的自动赋值给变量功能,从其返回类型中我们也可以看出问题所在:
返回类型:
当然我们的参数直接为多个基本类型变量,不会有这个问题的发生,如下示例:
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
System.out.println(integers);
}
}
坑二、java.util.Arrays#asList返回的List对象不能修改
示例: 返回的List对象添加操作
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
integers.add(1);
}
}
输出:
抛出异常:UnsupportedOperationException。
因为java.util.Arrays#asList返回的list对象是java.util.Arrays类中的一个私有的静态内部类:
java.util.Arrays.ArrayList
此类没有实现父类AbstractList的增加、删除操作方法:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
默认都是抛出异常UnsupportedOperationException。
坑三、java.util.Arrays#asList传入数组对象返回的list并不是原数组对象的copy,修改会反映到原数组对象
示例:
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6};
List<Integer> list = Arrays.asList(integers);
System.out.println(list);
System.out.println(Arrays.toString(integers));
list.set(0,999); //修改操作
System.out.println(list);
System.out.println(Arrays.toString(integers));
}
}
输出:
我们可以使用java.util.ArrayList的构造函数
java.util.ArrayList#ArrayList(java.util.Collection<? extends E>)
new ArrayList<>(Arrays.asList(stringArray))
来深度复制一份原数组对象。
小结
java.util.Arrays工具类避坑记:
【👍🏻】java.util.Arrays#asList的参数不要传入基本类型数组;
【👍🏻】java.util.Arrays#asList返回的List对象不能修改;
【👍🏻】java.util.Arrays#asList传入数组对象返回的list并不是原数组对象的copy,修改会反映到原数组对象;