Open venaissance opened 4 years ago
栈的本质是以后进先出LIFO方式插入删除元素的数据结构
队列的本质是以先进先出方式插入删除元素的数据结构
双端队列的本质是栈+队列,同时支持先进先出和后进先出
优先队列的本质是入队与队列相同,出队按优先级顺序出队,底层实现可能是堆、平衡二叉树等
栈、队列、双端队列的的插入删除时间复杂度都是O(1),搜索和遍历时间复杂度都是O(n)
优先队列的插入时间复杂度是O(1),取出的时间复杂度是O(logn)
Priority Queue是通过数组实现一个堆,元素在queue数组中并不是完全有序的,仅堆顶元素最大或最小。
poll方法,实际上是获取堆顶元素,然后调整堆。
调整堆的方法(大顶堆为例):
1.判断是否传入comparator,有则按照comparator顺序,否则按照自然顺序排序
2.取节点左右孩子节点的最大值,与父节点交换
根据键的hashCode值存储数据,访问时间复杂度近似O(1),但遍历顺序不确定
非线程安全,任意时刻可以有多个线程同时写HashMap,可能会导致数据混乱,如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
为了解决哈希冲突,Java采用链地址法(另一种方法是开放地址法),底层实现是数组+链表+红黑树的组合
一、栈、队列、双端队列、优先队列本质
栈的本质是以后进先出LIFO方式插入删除元素的数据结构
队列的本质是以先进先出方式插入删除元素的数据结构
双端队列的本质是栈+队列,同时支持先进先出和后进先出
优先队列的本质是入队与队列相同,出队按优先级顺序出队,底层实现可能是堆、平衡二叉树等
栈、队列、双端队列的的插入删除时间复杂度都是O(1),搜索和遍历时间复杂度都是O(n)
优先队列的插入时间复杂度是O(1),取出的时间复杂度是O(logn)
二、哈希表、映射、集合本质
三、Queue 和 Priority Queue源码分析
Priority Queue是通过数组实现一个堆,元素在queue数组中并不是完全有序的,仅堆顶元素最大或最小。
poll方法,实际上是获取堆顶元素,然后调整堆。
调整堆的方法(大顶堆为例):
1.判断是否传入comparator,有则按照comparator顺序,否则按照自然顺序排序
2.取节点左右孩子节点的最大值,与父节点交换
四、Java HashMap总结
根据键的hashCode值存储数据,访问时间复杂度近似O(1),但遍历顺序不确定
非线程安全,任意时刻可以有多个线程同时写HashMap,可能会导致数据混乱,如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
为了解决哈希冲突,Java采用链地址法(另一种方法是开放地址法),底层实现是数组+链表+红黑树的组合
参考