🐼
type
status
date
slug
summary
tags
category
icon
password
Property
在银行柜台办业务时,假设只有一个柜台在办理业务,但是办理业务的人很多,怎么办?
可以每个人先取一个号,例如:
A1
、A2
、A3
……然后,按照号码顺序依次办理,实际上这就是一个Queue
。如果这时来了一个VIP客户,他的号码是
V1
,虽然当前排队的是A10
、A11
、A12
……但是柜台下一个呼叫的客户号码却是V1
。要实现“VIP插队”的业务,用
Queue
就不行了,Queue
会严格按FIFO的原则取出队首元素,需要的是优先队列:PriorityQueue
。PriorityQueue
和Queue
的区别在于,它的出队顺序与元素的优先级有关,对PriorityQueue
调用remove()
或poll()
方法,返回的总是优先级最高的元素。要使用
PriorityQueue
,就必须给每个元素定义“优先级”:放入的顺序是
"apple"
、"pear"
、"banana"
,但是取出的顺序却是"apple"
、"banana"
、"pear"
,这是因为从字符串的排序看,"apple"
排在最前面,"pear"
排在最后面。因此,放入
PriorityQueue
的元素,必须实现Comparable
接口,PriorityQueue
会根据元素的排序顺序决定出队的优先级。🐼
type
status
date
slug
summary
tags
category
icon
password
Property
EnumMap
因为
HashMap
是一种通过对key计算hashCode()
,通过空间换时间的方式,直接定位到value所在的内部数组的索引,因此,查找效率非常高。如果作为key的对象是
enum
类型,那么,还可以使用Java集合库提供的一种EnumMap
,它在内部以一个非常紧凑的数组存储value,并且根据enum
类型的key直接定位到内部数组的索引,并不需要计算hashCode()
,不但效率最高,而且没有额外的空间浪费。以
DayOfWeek
这个枚举类型为例,为它做一个“翻译”功能:使用
EnumMap
的时候,我们总是用Map
接口来引用它,因此,实际上把HashMap
和EnumMap
互换,在客户端看来没有任何区别。TreeMap
HashMap
是一种以空间换时间的映射表,它的实现原理决定了内部的Key是无序的,即遍历HashMap
的Key时,其顺序是不可预测的(但每个Key都会遍历一次且仅遍历一次)。