对象值相等的比较
“==”和equals
p == q 表示的是 p 和 q 两个引用指向同一个对象
p.equals(q) 表示 p 指向的对象 和 q 指向的 对象是否是值语义相等的
equals如果没有手动重写,默认执行的就是Object版本中的equals。比较规则和“==”一样
结果
手动重写equals
运行结果
有了下面这个条件,则可以使
String str = null;
“hehe”.equals(str)不会出现空指针异常
大于、等于、小于的比较
使用Comparable接口的时候,最好指定泛型参数。编译器自动的完成类型效验工作,如果不写泛型参数,默认的comparaTo方法的参数类型就是Object类型。需要手动进行类型转换
对compareTo进行重写
使用Comparable的时候,你必须让要比较的类实现Comparable接口(需要修改这个类的代码)
结果
Comparator的使用
使用Comparator的时候,你是重新创建一个新的类实现Comparator接口,不需要修改待比较的代码
结果
equals 和 Comparable 是两个互不相干的东西
Comparable 与 Comparator 比较
使用Comparable的时候,你必须让要比较的类实现Comparable接口(需要修改这个类的代码)
直接让Card这个类实现Comparable接口
使用Comparator的时候,你是重新创建一个新的类实现Comparator接口,不需要修改待比较的代码
重新写了一个类,他的泛型参数是Card
覆写的方法
Object.equals :
因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与否
Comparable.compareTo:
需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于
内部顺序
Comparator.compare:
需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性
强