JAVA零基础入门系列Day15 对象的比较
Posted 弗兰克的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA零基础入门系列Day15 对象的比较相关的知识,希望对你有一定的参考价值。
最近一直有事,博客也停笔了一段时间,十分抱歉。
这一篇主要讲讲对象的比较,什么是对象的比较,我们知道两个数值类型只需要用“==”符号即可进行相等判断,但如果是两个Goods对象呢?如何进行比较?这时候,我们的equals方法就派上用场了。equals方法是类的祖先Object类的另一个protected方法,既然是protected方法(能被同一个包里的所有类所访问, 能被该类的子类所访问,子类可以和父类不在一个包中),子类是可以直接访问的,但如果没有覆盖该方法,那么使用的只是Object的原始比较方法,return(this==obj) ,仅仅比较两个对象的地址是否一致。
对于String类型,已经设计好了equals方法,所以我们只需要拿来用就可以了,如果是我们自定义的类,那就得重写该方法来进行覆盖,下面还是用Goods类来举一个小栗子:
public class Goods { private String title; private double price; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } //构造器 public Goods(String title, double price) { this.title = title; this.price = price; }
}
这是简化版的Goods类,有两个私有成员变量以及它们的设置器,访问器,还有一个构造器,下面我们来重写父类的equals方法,判断两个Goods是否相等,逻辑上,我们只需要两者标题和价格一致即可认为两个商品是相等的(当然可以根据实际情况进行调整),下面我们来设计一下equals方法:
/** * @author Frank * @create 2017/11/20 * @description 被测试类,测试equals方法 */ public class Goods { private String title; private double price; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } //构造器 public Goods(String title, double price) { this.title = title; this.price = price; } //覆盖equals方法 @Override public boolean equals(Object obj) { Goods tmp = (Goods) obj; if (price == tmp.getPrice() && title.equals(tmp.getTitle())){ return true; }else { return false; } } }
这里我们覆盖了父类的equals方法,在equals方法中将obj强制类型转换为Goods类,再比较两者价格和标题是否相等,只要都相等,则返回true,否则返回false,这也符合我们的需求,下面测试一下:
/** * @author Frank * @create 2017/11/20 * @description 测试类,用于测试equals方法 */ public class Test { public static void main(String[] args) { Goods a = new Goods("Java",100); Goods b = new Goods("C++",100); Goods c = new Goods("Java",100); System.out.println(a.equals(b)); System.out.println(a.equals(c)); } }
输出结果为:false ture
这样我们就简单的实现了equals方法,但是,这个equals方法并不完美,首先,由于我们传入的是Object对象,所以并不知道它原本的类型是否为Goods类型,如果不是Goods类型,当然不能拿来比较,于是我们得先进行一下类型判断:
@Override public boolean equals(Object obj) {//类型判断 if (obj.getClass() != this.getClass()){ return false; }else { Goods tmp = (Goods) obj; if (price == tmp.getPrice() && title.equals(tmp.getTitle())){ return true; }else { return false; } } }
仍旧不完美,如果比较的对象就是自身或者两者指向同一个对象的话,直接返回true即可:
@Override public boolean equals(Object obj) { //先检测是否为自比较 if ( this == obj || obj == null){ return true; } //类型判断 if (obj.getClass() != this.getClass()){ return false; }else { Goods tmp = (Goods) obj; if (price == tmp.getPrice() && title.equals(tmp.getTitle())){ return true; }else { return false; } } }
现在就好很多了,那么此时我们调用equals方法跟使用”==“比较符号有什么区别呢,来看一个栗子:
public class Test { public static void main(String[] args) { Goods a = new Goods("Java",100); Goods b = new Goods("C++",100); Goods c = new Goods("Java",100); Goods d = a; System.out.println(a.equals(b)); System.out.println(a.equals(c)); System.out.println(a.equals(d)); System.out.println(a==b); System.out.println(a==c); System.out.println(a==d); } }
输出如下:
false true true false false true
对于前三个输出应该没什么问题,主要看后三个,这里用相等比较符时,判断的仅仅是两个变量存储的内容是否一致,由于a、b、c、d均为引用类型,所以比较的仅仅是它们是否指向相同的对象,这里只有a跟d指向的是相同的对象,c虽然title和price都与a相同,但是跟a是两个完全不同的对象,因此没有返回的是false。
另外,有人也许会问,做类型判断的时候,为什么不用instanceof或者isInstance方法,这里简单说明一下原因。instance判断的是a对象是否和b对象属于同一个类,或者有同一个父类,或者实现了同一个接口。isinstance方法则判断两种类型是否可以进行强转。
由于这个小栗子并没有相关上下文,所以还是直接用getClass方法进行判断比较稳妥,当然,以后可以根据具体实际情况进行修改。
至此,equals方法讲解完毕,很简单吧。之后还是会继续更新的,欢迎大家继续关注!
以上是关于JAVA零基础入门系列Day15 对象的比较的主要内容,如果未能解决你的问题,请参考以下文章