集合之List和Set

集合之List和Set

Collection下的子接口:List、Set

一、List

List集合下最常见的集合类有两个:ArrayList和LinkedList
众所周知,ArrayList底层是数组,LinkedList底层是链表。数组遍历速度快,LinkedList增删元素快。

1.1、为什么在工作中一般就用ArrayList,而不用LinkedList呢?

原因也很简单:
1)在工作中,遍历的需求比增删多,即便是增加元素往往也只是从尾部插入元素,而ArrayList在尾部插入元素也是O(1)
2)ArrayList增删没有想象中慢,ArrayList的增删底层调用的copyOf()被优化过,加上现代CPU对内存可以块操作,普通大小的ArrayList增删比LinkedList更快。

1.2、如果考虑到线程安全的问题,

1)那Vector我们也一般不用,
2)可以看看CopyOnWriteArrayList,它是JUC下的一个类,但开发用的不多,但还是可以了解一下它的思想(写时拷贝)
3)实际开发常用的方法为 List synlist = Collections.synchronizedList(list),这样我们就可以无忧的增删操作了
但是,在使用迭代遍历的时候,还需要我们自行处理线程安全问题

1.3、那么,LinkedList用在什么地方呢?

我们一般用在刷算法题上。把LinkedList当做一个先进先出的队列,LinkedList本身就实现了Queue接口

二、Set

Set集合下最常见的集合类有三个:HashSet、TreeSet、LinkedHashSet
List和Set都是集合,一般来说:如果我们需要保证集合的元素是唯一的,就应该想到用Set集合

2.1、一般我们在开发中最多用到的也就是HashSet。

1)TreeSet是可以排序的Set,一般我们需要有序,从数据库拉出来的数据就是有序的,可能往往写order by id desc比较多。
2)而在开发中也很少管元素插入有序的问题,所以LinkedHashSet一般也用不上。
3)那么,TreeSet和LinkedHashSet更多的可能用在刷算法的时候。

2.2、如果考虑线程安全的问题,

1)可以考虑CopyOnWriteArraySet,用得就更少了(这是一个线程安全的Set,底层实际上就是CopyOnWriteArrayList)
2)所以还可以考虑使用:Collections.synchronizedSet()

三、结论:

1)ArrayList始终比HashSet性能要高(因为:HashSet每次添加总要判断hashcode导致效率低)
2)HashSet两种循环中iterator 方式不稳定,不过总是比foreach要快一点

相关推荐