对象的比较:
1:比较身份: ==
2:比较值:equals(要注意需要用户手动重写才能够按照值比较,如果没有手动重写,默认执行的是Object版本中的equals,此时也是在比较身份)
3:比较类型:instanceof
class Card {
public String rank;//点数
public String suit;//花色
public Card(String rank, String suit) {//构造方法
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object obj) {//可以作为模板来用
//按照值来比较 this 和 obj
//1.自己和自己比较的情况
if (this == obj) {
return true;
}
//2.obj 为 null认为结果为false
if (obj == null) {
return false;
}
//3.obj这个类型是不是当前 Card 类型
if (!(obj instanceof Card)) {
return false;
}
//4.真正的比较内容
Card other = (Card)obj;
return this.rank.equals(other.rank) && this.suit.equals(other.suit);
}
}
public class TestCompare {
public static void main(String[] args) {
Card p = new Card("3","♠");
Card q = new Card("3","♠");
Card o = p;
System.out.println(p == o);//true,身份相同
System.out.println(p == q);//false,身份不同,因为new出两个对象
System.out.println("===========");
System.out.println(p.equals(o));//比较值
System.out.println(p.equals(q));//比较值
}
}
使用Comparable接口的时候,最好指定泛型参数,那么编译器就会自动的完成类型校验工作,如果不写泛型参数,默认的compareTo方法的参数类型就是Object类型,需要程序员手动进行类型转换。
使用Comparable的时候,你必须让要比较的类实现Comparable接口。(需要在待比较的类上进行修改)
使用 Comparator的时候,你是重新创建一个新的类实现Comparator接口,不需要修改待比较类的代码。
为啥有了Comparable还需要有一个Comparator呢?
1:Comparable使用的时候必须要修改待比较类的代码,实际开发中不是所有的类都能修改源码~~(这个类是库或者其他组的人提供)
2:Comparable只能定义一种比较规则,Comparator可以定义多种比较规则(实现多种Comparator类)
泛型
以能阅读java集合源码为目标学习泛型
Java中的泛型属于细节比较琐碎,设计的比较奇怪,完全依赖类型转换,编译器自动帮我们生成Object和指定类型之间相互转换的代码。上界,下界,通配符…这些细节都是为了让编译器做更多的校验。(即使没有校验,代码一样能跑,只是有了校验之后,代码出错的概率会降低一些),实际开发中泛型本来就很少用到,其他细节的约束更少。
泛型的限制:
- 泛型类型参数不支持基本数据类型
- 无法实例化泛型类型的对象
- 无法使用泛型类型声明静态的属性
- 无法使用instanceof判断带类型参数的泛型类型
- 无法创建泛型类数组
- 无法create,catch,throw一个泛型类异常(异常不支持泛型)
- 泛型类型不是形参一部分,无法重载