在 Java 中,基本类型的对象可以直接比较大小,但自定义类型对象默认无法直接比较。这在使用 PriorityQueue 等容器时尤为明显,因为底层堆结构需要元素之间具备可比性。
PriorityQueue 插入对象的限制
优先级队列在插入元素时有个硬性要求:元素不能为 null,且元素之间必须能够进行比较。之前我们只插入了 Integer 类型,那能否插入自定义类型对象呢?
class Card {
public int rank; // 数值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
}
public class TestPriorityQueue {
public static void main(String[] args) {
PriorityQueue<Card> p = new PriorityQueue<>();
p.offer(new Card(1, "♠"));
p.offer(new Card(2, "♠"));
}
}
运行这段代码会抛出异常。优先级队列底层使用堆,向堆中插入元素时,为了满足堆的性质,必须进行元素的比较。此时 Card 类没有实现比较逻辑,因此无法直接比较。
对象的比较机制
引用类型与 == 运算符
对于引用类型的变量,直接使用 > 或 < 进行编译会报错。虽然 == 可以编译成功,但它比较的是两个引用变量的地址,而不是对象的内容。
class Card {
public int rank;
public String suit;
public Card {
.rank = rank;
.suit = suit;
}
}
{
{
(, );
(, );
c1;
System.out.println(c1 == c2);
System.out.println(c1 == c3);
}
}


