对象的比较:

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和指定类型之间相互转换的代码。上界,下界,通配符…这些细节都是为了让编译器做更多的校验。(即使没有校验,代码一样能跑,只是有了校验之后,代码出错的概率会降低一些),实际开发中泛型本来就很少用到,其他细节的约束更少。
泛型的限制:

  1. 泛型类型参数不支持基本数据类型
  2. 无法实例化泛型类型的对象
  3. 无法使用泛型类型声明静态的属性
  4. 无法使用instanceof判断带类型参数的泛型类型
  5. 无法创建泛型类数组
  6. 无法create,catch,throw一个泛型类异常(异常不支持泛型)
  7. 泛型类型不是形参一部分,无法重载