Java探索之旅(12)——equals方法及其覆盖
2014-11-11 14:50
393 查看
1.Object中的equals方法
java中的的基本数据类型:byte,short,char,int,long,float,double,boolean。==比较的是值。❶作用:对于复合类型来说,equal判断两个引用变量是否指向同一个对象,即判断地址(等同“==”)。返回true,否则返回false。并没有实际检查是否内容相同。默认实现为:public boolean equals(Object obj) {return (this==obj);}[java] viewplaincopypublic class Animal{........}Animal animal1=new Dog();Animal animal2=new Cat();Animal animal3=animal1;animal1==animal2 (False)animal1.equals(animal2) (False)animal1==animal3 (True)animal1.equals(animal3) (True)
❷JDK类中有一些类覆盖了Object类的equals()方法。比较规则为:如果两个对象的类型一致且内容一致,则返回true。这些类有:java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double)。
相反,“==”此时不具备内容比较功能。[java] viewplaincopyInteger int1=new Integer(1);Integer int2=new Integer(1);String str1=new String("hello");String str2=new String("hello");int1==int2;//false,不同引用对象int1.equals(int2);//TRUE,相同内容str1==str2;//False,不同引用对象str1.equals(str2);//True,相同内容❸可自定义覆盖object类的equals()方法,重新定义比较规则。
下面Person类的equals()比较规则为:只要两个对象都是Person类,并且他们的属性name都相同,则比较结果为true,否则返回false[java] viewplaincopypublic class Person{private String name;Person(String name){this.name=name;}public boolean equals(Object o){if (this==null) return true;else if (!o instanceof Person) return false;final Person other=(Person)o;if (this.name().equals(other.name()))return true;elsereturn false;}}注意:在重写equals方法时,要注意满足离散数学上的特性
①自反性:对任意引用值X,x.equals(x)的返回值一定为true. ②对称性:当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true; ③传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ④一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变 ⑤非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
2.例子
String s1 = "Monday";String s2 = "Monday";s1 == s2;//trues1.equal(s2);//trueString s1 = "Monday";String s2 =new Sring( "Monday");s1 == s2;//falses1.equal(s2);//trueString s1 = "Monday";String s2 = new String("Monday");s2 = s2.intern();s1 == s2;//trues1.equal(s2);//true//程序在运行的时候会创建一个字符串缓冲池。当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序///中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1将s2引用s1所引用的对象"Monday"//第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同。//intern()检查字符串池里是否存在某个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会将其添加到字符串池中,然后再返回它的引用。3.if语句下的错误
public class Test {public static void main(String[] args) {int x;boolean setToTen = false;if (setToTen) {x = 10;}if (!setToTen) {x = 0;}System.out.println(x);}}Java运行报错。此时系统检测不到x初始化,输出报错。尽管我们人为能够看出来。同样的情况出现在两个if下分别return的情况,此时Java也检测不到return语句。应该使用if-else避免这一错误。
相关文章推荐
- Java探索之旅(12)——equals方法及其覆盖
- java equals方法的覆盖
- 2015年7月4日解决问题:eclipse连接access数据库问题//java五中布局及其应用方法//equals()与==的区别等
- java.lang.Object 对象中 hashCode 和 equals 方法详解及其延伸
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- 《问题总结》JAVA什么时候要覆盖toString()、equals()、hashCode()方法??为什么要覆盖呢? 《通俗回答》
- Effective Java Item8-在覆盖equals(Object类的nonfinal方法)时遵循接口规范
- Java equals方法覆盖
- 探索Java中的equals()和hashCode()方法_动力节点Java学院整理
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Java 覆盖equals和hashCode方法
- Java学习笔记(44)----------探索equals()和hashCode()方法
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- java对象通用方法之覆盖equals时请遵守通用约定、覆盖equals时总要覆盖hashCode、始终要覆盖toString、考虑实现Comparable接口
- 覆盖 equals 方法时应同时覆盖 hashCode 。(java)
- JAVA拾遗 - 如何正确地覆盖equals方法
- Java进阶 —— 覆盖equals方法的技巧
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- 关于Java覆盖equals方法时必须覆盖hashCode方法