List的相关文章,没有太多想写的,早先的时候有提到过两篇
除此之外还有一些经常被问到的问题,我从Hollis的知识星期收集一下,用到这里,供一起学习
问题
- Java 中 Set 与 List 有什么不同?
相同点:都是继承Collection的接口,都是用来存储一组相同类型的元素
不同点:
- List有序存储,元素可重复
- Set无序存储,元素不可重复
注意:Set在插入时是要有一定的方法来判断元素是否重复的,这个方法很重要,决定了set种可以保存那些元素,Java中的HashSet使用的是HashMap来存储,弄明白HashMap原理之后就明白HashSet的原理了。
- Java中的List有几种实现,各有什么不同?
Vector,ArrayList,LinkedList 还差Vector没有说到,Vector实现方式与ArrayList类似,不过在方法上加了Synchronized关键字来保证现场安全。
ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.
当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义.
Vector 和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
而 LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。
- 什么是fail-fast,什么是fail-safe,有什么区别吗?
fail-fast字面意思,快速失败,也就是当集合类遇到数据问题时时立刻抛出异常,常规的集合类都是如此,在多线程同时操作时会立刻抛出concurrentmodificationexception
fail-safe当集合类在多线程环境下处理的时候,遇到问题时,不会抛出异常,而是继续执行下去。
以上是个人理解。
- 通过Array.asList获得的List有何特点,使用时应该注意什么?
Array.asList获取的列表,使用的是适配器模式,其List是Array内部的实现,内部的数据指向的还是数组,并且不支持插入,删除操作。
解:1. asList 得到的只是一个 Arrays 的内部类,一个原来数组的视图 List,因此如果对它进行增删操作会报错
2. 用 ArrayList 的构造器可以将其转变成真正的 ArrayList
最后
以上是常问道的关于List相关的问题,一次小小的总结。