标签:队列 为什么 dHash 子接口 需求 使用 优化 思想 数组遍历
Collection下的子接口:List、Set
List集合下最常见的集合类有两个:ArrayList和LinkedList
众所周知,ArrayList底层是数组,LinkedList底层是链表。数组遍历速度快,LinkedList增删元素快。
原因也很简单:
1)在工作中,遍历的需求比增删多,即便是增加元素往往也只是从尾部插入元素,而ArrayList在尾部插入元素也是O(1)
2)ArrayList增删没有想象中慢,ArrayList的增删底层调用的copyOf()被优化过,加上现代CPU对内存可以块操作,普通大小的ArrayList增删比LinkedList更快。
1)那Vector我们也一般不用,
2)可以看看CopyOnWriteArrayList,它是JUC下的一个类,但开发用的不多,但还是可以了解一下它的思想(写时拷贝)
3)实际开发常用的方法为 List synlist = Collections.synchronizedList(list),这样我们就可以无忧的增删操作了
但是,在使用迭代遍历的时候,还需要我们自行处理线程安全问题
我们一般用在刷算法题上。把LinkedList当做一个先进先出的队列,LinkedList本身就实现了Queue接口
Set集合下最常见的集合类有三个:HashSet、TreeSet、LinkedHashSet
List和Set都是集合,一般来说:如果我们需要保证集合的元素是唯一的,就应该想到用Set集合
1)TreeSet是可以排序的Set,一般我们需要有序,从数据库拉出来的数据就是有序的,可能往往写order by id desc比较多。
2)而在开发中也很少管元素插入有序的问题,所以LinkedHashSet一般也用不上。
3)那么,TreeSet和LinkedHashSet更多的可能用在刷算法的时候。
1)可以考虑CopyOnWriteArraySet,用得就更少了(这是一个线程安全的Set,底层实际上就是CopyOnWriteArrayList)
2)所以还可以考虑使用:Collections.synchronizedSet()
1)ArrayList始终比HashSet性能要高(因为:HashSet每次添加总要判断hashcode导致效率低)
2)HashSet两种循环中iterator 方式不稳定,不过总是比foreach要快一点
标签:队列 为什么 dHash 子接口 需求 使用 优化 思想 数组遍历
原文地址:https://www.cnblogs.com/byby/p/13126430.html