黑马程序员技术交流社区
标题: Arrays.asList()方法源码解析 [打印本页]
作者: 哔哩哔哩 时间: 2015-5-16 00:01
标题: Arrays.asList()方法源码解析
本帖最后由 哔哩哔哩 于 2015-5-16 00:01 编辑
public static <T> List<T> asList(T... a)
返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了RandomAccess。以上是API 1.6的说明,这个方法是Collection和数组之间的桥梁。下面我们看看asList的源码:
- <font face="Arial"> @SafeVarargs
- @SuppressWarnings("varargs")
- public static <T> List<T> asList(T... a) {
- return new ArrayList<>(a);
- }</font>
复制代码 参数是可变参数,可变参数按照数组来处理,注意这条语句:
- <font face="Arial">return new ArrayList<>(a);</font>
复制代码
这里的ArrayList并不是API中的ArrayList,而是Arrays类的一个私有的静态内部类(设计师就不能换个名字嘛- -!简直迷惑众人),我们看看他的实现:
- private static class ArrayList<E> extends AbstractList<E>
- 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> 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<E> 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<E> 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);
- }
- }
复制代码 这个私有静态内部类继承自AbstractList抽象类,然而却并没有覆写AbstractList的add和remove方法,我们再看看AbstractList的add和remove方法:
- public E set(int index, E element) {
- throw new UnsupportedOperationException();
- }
- public void add(int index, E element) {
- throw new UnsupportedOperationException();
复制代码这两个方法直接抛出了UnsupportedOperationException异常,这也就是通过asList方法得到的List集合长度固定,不支持增删操作的根本原因。
如果想做增删操作可以这样处理:List list=new ArrayList(Arrays.asList(1,2,3,4,5));
作者: showdy 时间: 2015-5-16 10:33
赞,就是目前水平难得看懂
作者: as604049322 时间: 2015-5-16 12:40
:time::(Objects.requireNonNull(array);
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |