asList方法顾名思义:转换为集合,接收的是Object变动参数——Arrays.asList(Object... a)
示例:
import java.util.Arrays;
import java.util.List;
public class Test47
{
public static void main(String[] args)
throws Exception
{
int[] data = {5, 4, 3, 2, 1};
// 若是int基本类型会把data看作一个整体的元素
List list = Arrays.asList(data);
List list2 = new ArrayList<>();
for (int i = 5; i >= 1; i-- )
{
list2.add(i);
}
System.out.println("元素类型:" + list.get(0).getClass());
System.out.println("前后是否相等:" + list.get(0).equals(data));
System.out.println("元素类型:" + list2.get(0).getClass());
System.out.println("前后是否相等:" + list2.get(0).equals(data));
// 8大基本数据类型不能作为泛型参数,要想作为泛型参数需使用对应的包装类型 返回一个固定长度的列表 如源码:
// public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
// public ArrayList(Collection<? extends E> c) {
// elementData = c.toArray();
// if ((size = elementData.length) != 0)
// {
// if(elementData.getClass() != Object[].class)
// elementData = Arrays.copyOf(elementData,size, Object[].class);
// } else { this.elementData = EMPTY_ELEMENTDATA; }
// }
System.out.println("列表中的元素数量是:" + list.size());
// Arrays.asList方法转换成list对象不可更改,如add,remove等方法,源码Arrays创建了一个静态私有内部类ArrayList,但并未实现add方法 如源码:
// public boolean add(E e) { add(size(), e); return true;}
// public void add(int index, E element) { throw new UnsupportedOperationException(); }
list.add(6);
System.out.println("提示报错");
}
}
执行结果:
元素类型:class [I
前后是否相等:true
元素类型:class java.lang.Integer
前后是否相等:false
列表中的元素数量是:1
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.wxp.test.Test47.main(Test47.java:29)
拓展源码Arrays创建了一个静态私有内部类ArrayList的相关方法
size:元素数量
contains:是否包含某元素
replaceAll:集合里全部替换
indexOf:获取某一元素的下标
set:重置指定某一元素
get:获得指定元素
toArray:转换为数组,实现了数组的浅拷贝
参照来源:《编写高质量代码:改善java程序的151建议》