# Java源码分析

# 阅读源码

  • 好处:能学习到更优秀的代码,提高代码架构能力,深入理解代码设计思想,理解框架设计
  • 原则:
    • 文档:先阅读官方文档,标记不理解的地方,和期望深入了解的地方,着重理解设计思路和关键技术
    • 定焦:抓主线,带着文档中的问题,找到相关代码,再深入阅读
    • 宏观:站在上帝视角,关注整体设计思路,不要试图去深入每一个细节
  • 方法、技巧:
    • 断点
    • 反调(Find Usages)
    • 经验(例如源码看多了,就知道某些命名的方法是用来干什么的)

# PriorityQueue

offer处的源码

private void siftUpUsingComparator(int k, E x) {
    while (k > 0) {
        int parent = (k - 1) >>> 1;
        Object e = queue[parent];
        if (comparator.compare(x, (E) e) >= 0)
            break;
        queue[k] = e;
        k = parent;
    }
    queue[k] = x;
}

k是数组最后的位置,也就是二叉树的最后新增节点,x表示insert的元素;

若x与其父节点相比,小于其父节点,继续循环比较,直到大于等于其父节点,默认二叉树构成小顶堆。

pq默认的comparator实现为:

public int Comparator.compare(int insertValue, int parentValue) {
	return insertValue - parentValue;
}

第一个入参为插入值,因此自实现Comparator时,如果需要将小优先,也就实现insertValue-parentValue。如果大的优先,则反过来。

修改于: 8/11/2022, 3:17:56 PM