PriorityQueue<Integer> highQueue = new PriorityQueue<>(); // 小顶堆保存大数据部分 PriorityQueue<Integer> lowQueue = new PriorityQueue<>((Comparator<Integer>) (o1, o2) -> o2 - o1);// 大顶堆保存小数据部分 public void Insert(Integer num) { // 保持两个堆平衡即size之差为1(默认lowQueue比highQueue >= 1) lowQueue.offer(num);// 数据线往小堆扔 highQueue.offer(lowQueue.poll());// 保证存到大堆的永远是小队中的最大值(即保证数据被分为大、小两部分) if (highQueue.size() > lowQueue.size()) {// 若此时大堆容量大于小堆则移出大堆中最小数据至小堆 lowQueue.offer(highQueue.poll()); } } public Double GetMedian() { return lowQueue.size() == highQueue.size() ? ((lowQueue.peek() + highQueue.peek()) * 0.5) : Double.valueOf(lowQueue.peek()); }