java学习随笔——queue

来源:互联网 发布:淘宝店装饰教程 编辑:程序博客网 时间:2024/06/07 18:13

随笔

PriorityQueue如果泛型为自己定义的类(例如类名为A),则添加元素至队列里时需要先重写compare方法来规定A的排序规则。否则会出现 java.lang.ClassCastException :XXX cannot be cast to java.lang.Comparable错误。贴下源码:
private void siftUp(int k, E x) {        if (comparator != null)            siftUpUsingComparator(k, x);        else            siftUpComparable(k, x);    }
如果comparator (用户自定义排序)为空,则调用siftUpComparable()方法,该方法排序调用的是自然规则。siftUpComparable()源码如下:
private void siftUpComparable(int k, E x) {        Comparable<? super E> key = (Comparable<? super E>) x;        while (k > 0) {            int parent = (k - 1) >>> 1;            Object e = queue[parent];            if (key.compareTo((E) e) >= 0)                break;            queue[k] = e;            k = parent;        }        queue[k] = key;    }    
自然规则排序使用的是先将参数转化为Comparable<? super E>类型再使用compareTo进行排序,而用户自定义类型无法强转为Comparable<? super E>类型,所以会报之前的那个错误。
原创粉丝点击