概述
前几天面试问的关于Arrays.asList()的问题,总结一下常见问题。
Arrays.asList()使用了什么设计模式
答案:使用了适配器模式。适配器模式简单来说就是不修改原对象,为了适应新的需求,适配成另一种接口或者类,我之前写过一篇将适配器模式的文章,有兴趣可以看看~。
下面看看是怎么使用的:
其实就是通过这个方法,把传入的可变参数适配成List类型,而可变参数也可以接受数组对象。
Arrays.asList()得到的List可以修改吗
答案:不可以。
按理来说,List都是可以增改,但是这里却不可以,如果使用add方法,会报如下错误:
我们点进去源码一探究竟:
看了代码就很明显了,这个静态内部类ArrayList并不是我们常用的,而是自己定义的,而其中的数组用final修饰,表示不可修改。
为什么设置成不可修改
因为大家使用数组的时候,都知道访问和使用不如list方便,所以适配为List一般都是为了更好的访问和传参,如果是真的是为了使用list增删(刷题大家常遇到),可以在外面再套一个new ArrayList<>()。
基本类型使用Arrays.asList()
当使用基本类型作为数组传入的时候,数组明明有多个元素,但是转换过来变成了数组类型的List,并且数组大小也是1,如下:
这里我们也直接从代码解释
这里可以看到传入的参数是可变参数的范型T,而范型无法接受基本类型,最终把数组本身作为对象,传入构建新的类型,所以如果要直接转换成对应大小一样的List时,需要使用包装类型。
这样就不会出现之前的问题。
总结
面试官先问了final的场景,又问这个问题,是在提醒我往这方面考虑的,奈何我真没了解过。在记录的过程中,也发现了很多不会的地方,比如范型和可变参数,要学的东西还很多。
参考
https://www.jianshu.com/p/2b113f487e5e