Java 集合整理大全
HashMap与HashTable的区别
1.HashMap是非线程安全的,HashTable是线程安全的
2.HashMap的键和值都可以为null,HashTable则不行
3.线程安全问题,所以HashMap的效率比HashTable高
ArrayList和LinkList的比较
ArrayList和LinkedList都不是线程安全的,小并发量的情况下可以使用Vector,若并发量很多,且读多写少可以考虑使用CopyOnWriteArrayList。
因为CopyOnWriteArrayList底层使用ReentrantLock锁,比使用synchronized关键字的Vector能更好的处理锁竞争的问题。
TreeSet, LinkedHashSet and HashSet 的区别
TreeSet的主要功能用于排序,它是无序的(插入顺序)
LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
HashSet只是通用的存储数据的集合
共同点
三者都不是线程安全的,如果要使用线程安全可以collections.synchronizedSet()
不同点
HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序
HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则
HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException
TreeSet有两种排序方式
- 自然排序
- 比较器排序
自然排序
public class Student implements Comparable<Student>{ @Override public int compareTo(Student s) {
比较器排序
public class MyComparator implements Comparator<Student> { @Override public int compare(Student s1,Student s2) {
TreeMap在添加、删除、定位映射关系上,性能比HashMap要差。适用于有序集合。
由于Set集合是唯一性的,由HashSet类实现的Set集合的优点是能够快速定位集合中的元素。HashSet类需要重新实现equals()方法和hashCode()方法。
Queue和Deque接口继承Collection接口,实现FIFO(先进先出)的集合。二者的区别在于,Queue只能在队尾入队,队头出队,而Deque接口则在队头和队尾都可以执行出/入队操作
Queue接口常用方法:
add(E)/offer(E):入队,即向队尾追加元素,二者的区别在于如果队列是有界的,add方法在队列已满的情况下会抛出IllegalStateException,而offer方法只会返回false
remove()/poll():出队,即从队头移除1个元素,二者的区别在于如果队列是空的,remove方法会抛出NoSuchElementException,而poll只会返回null
element()/peek():查看队头元素,二者的区别在于如果队列是空的,element方法会抛出NoSuchElementException,而peek只会返回null
Deque接口常用方法:
addFirst(E) / addLast(E) / offerFirst(E) / offerLast(E)
removeFirst() / removeLast() / pollFirst() / pollLast()
getFirst() / getLast() / peekFirst() / peekLast()
removeFirstOccurrence(Object) / removeLastOccurrence(Object)
Queue接口的常用实现类:
ConcurrentLinkedQueue
ConcurrentLinkedQueue是基于链表实现的队列,队列中每个Node拥有到下一个Node的引用:
private static class Node {
volatile E item; volatile Node<E> next;
}
由于Node类的成员都是volatile的,所以ConcurrentLinkedQueue自然是线程安全的。能够保证入队和出队操作的原子性和一致性,但在遍历和size()操作时只能保证数据的弱一致性。
LinkedBlockingQueue
与ConcurrentLinkedQueue不同,LinkedBlocklingQueue是一种无界的阻塞队列。所谓阻塞队列,就是在入队时如果队列已满,线程会被阻塞,直到队列有空间供入队再返回;同时在出队时,如果队列已空,线程也会被阻塞,直到队列中有元素供出队时再返回。LinkedBlocklingQueue同样基于链表实现,其出队和入队操作都会使用ReentrantLock进行加锁。所以本身是线程安全的,但同样的,只能保证入队和出队操作的原子性和一致性,在遍历时只能保证数据的弱一致性。
ArrayBlockingQueue
ArrayBlockingQueue是一种有界的阻塞队列,基于数组实现。其同步阻塞机制的实现与LinkedBlocklingQueue基本一致,区别仅在于前者的生产和消费使用同一个锁,后者的生产和消费使用分离的两个锁。
ConcurrentLinkedQueue vsLinkedBlocklingQueue vs ArrayBlockingQueue
ConcurrentLinkedQueue是非阻塞队列,其他两者为阻塞队列
三者都是线程安全的
LinkedBlocklingQueue是无界的,适合实现不限长度的队列, ArrayBlockingQueue适合实现定长的队列
SynchronousQueue
SynchronousQueue算是JDK实现的队列中比较奇葩的一个,它不能保存任何元素,size永远是0,peek()永远返回null。向其中插入元素的线程会阻塞,直到有另一个线程将这个元素取走,反之从其中取元素的线程也会阻塞,直到有另一个线程插入元素。
这种实现机制非常适合传递性的场景。也就是说如果生产者线程需要及时确认到自己生产的任务已经被消费者线程取走后才能执行后续逻辑的场景下,适合使用SynchronousQueue。
PriorityQueue & PriorityBlockingQueue
这两种Queue并不是FIFO队列,而是根据元素的优先级进行排序,保证最小的元素最先出队,也可以在构造队列时传入Comparator实例,这样PriorityQueue就会按照Comparator实例的要求对元素进行排序。
PriorityQueue是非阻塞队列,也不是线程安全的,PriorityBlockingQueue是阻塞队列,同时也是线程安全的。
Deque 的实现类包括LinkedList(前文已描述过)、ConcurrentLinkedDeque、LinkedBlockingDeque,其实现机制与前文所述的ConcurrentLinkedQueue和LinkedBlockingQueue非常类似,此处不再赘述
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
熟练掌握Python的内置函数,加快编程速度
内置函数概览 Python 2.7 的所有内置函数共有80个。熟练记住和使用这些内置函数,将大大提高写Python代码的速度和代码的优雅程度。 以下代码示例用的是ipython,一个比官方解释器好很多的解释器,值的学习和使用。 数学相关的内置函数 abs(x) 返回一个数字的绝对值 In [18]: abs(3.14) Out[18]: 3.14 In [19]: abs(-3.14) Out[19]: 3.14 complex(real[, imag]) 生成一个复数 In [135]: complex(1,3) Out[135]: (1+3j) divmod(x, y) 返回x除以y的商和余数 In [143]: divmod(12, 7) Out[143]: (1, 5) max(iterable[, key]) 返回一个序列的最大元素 In [157]: max([(1,2,3), (4,5,6), (23,4,1,)], key=lambda a: a[-1]) Out[157]: (4, 5, 6) In [158]: max(1,2,3,4,4,5) Out[158]: ...
- 下一篇
如何使用Redis让周期异步任务变得Fault-tolerant且Dynamic
Python技术栈的同学一定都非常了解Celery——基于消息队列的分布式任务调度系统。(具体用法介绍不在此赘述)。通过Celery可以快速高效的将大规模的任务实时分发到众多的不同的机器上,让用户只关注每个单独任务的处理,而非调度分配任务本身。另外,Celery中有一个非常好用的周期任务发生器Beat,通过此进程可以帮助我们快速开发出大规模的周期任务,也就是任务的生产者。例如我们当前的应用每天就会产生15万以上的周期任务,但是与之相伴随的就是一个非常重要的问题,原生Beat在Celery中是一个单点进程,不具备容错能力。所以如何让周期任务发生器变得具有容错性(Fault-tolerant)——即周期任务产生器进程Beat挂掉后(或者机器宕机)快速恢复进程,是必须要考虑的问题。Celery在某种程度上是具有容错性的,
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Red5直播服务器,属于Java语言的直播服务器
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启