Array.asList: 个人的一些理解

看API,我们知道,这个方法会返回一个固定长度的List。有下面几个问题:

  1. 这个list是什么样子的;
  2. 从Array 变为List,JVM是怎么做到的;
  3. 这个List为啥不能增加、删除;
  4. jdk为啥要用静态内部类,不用接口的方式去实现这个功能。

先来看源码,源码中去掉了本文不用的方法。

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

上面的方法调用下面的静态内部类

 
private static class ArrayList<E> extends AbstractList<E>
	implements RandomAccess, java.io.Serializable
   {
	private final E[] a;

	ArrayList(E[] array) {
           if (array==null)
               throw new NullPointerException();
	    a = array;
	}

	public E get(int index) {
	    return a[index];
	}

	public E set(int index, E element) {
	    E oldValue = a[index];
	    a[index] = element;
	    return oldValue;
	}
   }


1、我们可以看到,返回的List是一个ArrayList类型的对象,这个ArrayList类并不是Java.util.ArrayList类,而是Arrays类的静态内部类。

2、这个静态内部类继承了AbstractList类,并且AbstractList<E> extends AbstractCollection<E> implements List<E>。

3、AbstractList里面的add()方法和remove方法只是做了简单的定义,并没有去实现;且ArrayList 也没有实现这两个方法。

4、如果用多态的方式,会增加很多不必要的代码量。而用内部类可以实现c++中多重继承的功效。


第一次写文章,肯定有不少疏漏和理解不对的地方,大神们,如果觉得哪个地方说的不对或者你有很好的提议,还望您留下宝贵意见,共同进步。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值