java学习笔记之Arrays.asList

来源:互联网 发布:mac新版itunes添加铃声 编辑:程序博客网 时间:2024/05/30 23:02

  在一个网站看工厂设计模式, 提到Arrays.asList这个方法,这是一个为数组产生一个List视图的方法。具体定义为 

public static <T> List<T> asList(T... a) {

return new ArrayList<>(a); 
}

   这个方法有两个问题比较有意思。

首先, 参数是可变参数,有点类似C里面printf,参数个数可变。这是java 1.5才引入的新语法,接触得不多。Arrays.asList的通常用法是传入一个array,所以这个可变参数也可以由一个array来代替。而传入多个参数, 最终其实也是被处理成一个array来操作。

其次, 初看返回是个ArrayList,一般都以为是java.util.ArrayList,其实这里是java.util.Arrays.ArrayList, 是定义在Arrays.java里的一个私有静态内部类,也就是说只有在Arrays.java内部可以被使用,这个类实现了AbstractList,,但是并没有重写add和remove操作,由于AbstractList的这两个方法实现只是简单的抛出异常, 所以通过这个方法返回的List在调用add或remove时, 会抛出UnsupportedOperationException这个runtime异常, 因此Arras.asList产生的数组是不可变长的,但是可以改变内容, 并且会write through到原来的数组里面。这一点看过Arrays.ArrayList的构造函数就不难理解了

    private final E[] a; 
  ArrayList(E[] array) 

if (array==null) 
throw new NullPointerException(); 
a = array; 
  }

这里其实只是简单的把传入的参数赋值给内部的一个数组变量a而已, 而在Arrays.ArrayList的set操作中,就是更改a里面的内容,其实指向的是原始从Arrays.asList传入的数组。

  说完这些, 回到工厂模式上来。 Arrays.asList返回的是一个List类型, 具体的实现类,也就是上面说的Arrays.ArrayList并没有暴露给client,更不用说具体实例如何生成,这里很好的展示了工厂模式所要达到的效果。

原创粉丝点击