集合之List和Set
Posted byby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合之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要快一点
以上是关于集合之List和Set的主要内容,如果未能解决你的问题,请参考以下文章