四川專門做招聘酒的網(wǎng)站網(wǎng)頁制作公司排名
文章目錄
- 源碼是如何插入的?
- 擴容
- 向上調整
- 實現(xiàn)大根堆
- 代碼:
源碼是如何插入的?
擴容
在擴容的時候,如果容量小于64,那就2倍多2的擴容;如果大于64,那就1.5倍擴容。
還會進行溢出的判斷,如果決定的新容量大于給的數(shù)組最大容量,那就將其限制在數(shù)組最大容量
:
向上調整
在進行向上調整的時候,會對傳進來的comparator進行判斷,如果不為空,那就使用程序員傳進來的比較器接口,如果為空,那就說明調用者并未實現(xiàn)比較器,那么就使用java自己提供的函數(shù)
siftUpComparable(k, x);
傳進來的x就是要插入的值e。
這是使用程序員自己傳進來的比較器進行比較,調用了compare接口進行比較,所以要想初始化一個大根堆,那就得自己寫出一個compare函數(shù)然后傳進去。
在使用自己寫的compare函數(shù)時,會讓x強轉為Comparable類型,如果這個x不是可以比較的(未實現(xiàn)Comparable接口,那就會拋出類型轉換異常)
實現(xiàn)大根堆
值得說明的是:
比較器函數(shù)是Comparator而不是Comparable。
代碼:
import java.util.Comparator;
import java.util.PriorityQueue;class IntCmp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {// 當然,寫o1.compareTo(o2)仍然是小根堆return o2.compareTo(o1);}
}public class Test {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(3);priorityQueue.offer(4);System.out.print(priorityQueue.poll());System.out.print(priorityQueue.poll());System.out.print(priorityQueue.poll());System.out.println(priorityQueue.poll());// 1 2 3 4,可以發(fā)現(xiàn)java中提供的默認堆是小根堆System.out.println("======");PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>(new IntCmp());priorityQueue1.offer(1);priorityQueue1.offer(2);priorityQueue1.offer(3);priorityQueue1.offer(4);System.out.print(priorityQueue1.poll());System.out.print(priorityQueue1.poll());System.out.print(priorityQueue1.poll());System.out.print(priorityQueue1.poll());// 4 3 2 1,變?yōu)榇蟾?/span>}
}