equals()与==的区别与实际应用
来源:互联网 发布:富二代 知乎 编辑:程序博客网 时间:2024/06/07 04:59
equals()与 == 在Java编程或系统实际可发中都会用到,但是二者又有实际的区别。千万不要理所当然地认为equals()与==的作用就是一样的,下面就一步步来阐述二者的区别。
phone.java
新建phone类,有两个私有的成员变量price与memory,在构造器中对其进行初始化。
package testPackage;public class phone { private float price;//价格 private int memory;//内存 public phone(float price, int memory) { super(); this.price = price; this.memory = memory; }}testPhone.java
新建两个手机对象,两个私有成员变量都赋一样值,用equals()进行比较
package testPackage;public class testPhone { public static void main(String[] args){ phone p1 = new phone(4000f,16);//4000元,16G内存的手机p1 phone p2 = new phone(4000f,16);//4000元,16G内存的手机p2 if(p1.equals(p2)){//如果p1等于p2 System.out.println("p1与p2相同"); } else{//p1不等于p2 System.out.println("p1与p2不相同"); } }}
运行结果:
p1与p2不相同
结果分析:
尽管两个手机对象的私有成员变量全部相同,equals()运行结果显示这两个对象是不相同的。这是为什么呢?
还有,phone类中并没有定义equals()方法,这个equals()方法哪里来的?
相信大家都知道java中的所有类都继承了Object.class,因此,所有类都继承了Object类中的equals()方法,要想知道运行结果的本质原因必须查看Object.class的源码。
打开Object.class的源码找到定义equals()方法的位置:
public boolean equals(Object obj) { return (this == obj);}
发现Object.class给出equals()方法的定义,竟然只是简单地通过==去实现判断。而==在java中用于判断存储在栈中的值是否相等。我们的基本数据类型像int的比较都用==,因为基本数据类型就存放在栈中,同样存放在栈中的,还有引用数据类型的引用,而真正的对象本身则存放在堆中。因此,这里给出的equals()方法就只是比较两个对象在内存中的引用(即地址)是否相等。本例中新建了两个对象,在内存中就新开辟了两个内存空间,引用地址当然是不一样的,程序运行结果当然是不相同。
但是我们想通过两个手机的价格与内存相同就判断手机是相同的,确实实际开发中我们都是这样想的,那应该怎么办呢?重写equals()方法。
package testPackage;public class phone { private float price;//价格 private int memory;//内存 public phone(float price, int memory) { super(); this.price = price; this.memory = memory; } @Override public boolean equals(Object obj){ if(this == obj){//如果引用地址是相同的,证明是同一个对象,那当然相同 return true; } if(obj ==null){//如果对象是空的,没有比较的必要,直接返回false return false; } if(!(obj instanceof phone)){//如果obj不是phone的一个对象实例,直接返回false return false; } phone p = (phone)obj;//编译需要,强制类型转换 if( this.price==p.price && this.memory==p.memory ){ return true; } else{ return false; } }}
重新运行testPhone.java,查看运行结果:
运行结果:
p1与p2相同
结果分析:
通过重写equals()实现了通过私有成员变量判断两个手机对象是否相等,若prize与memory都相等,则两个手机对象就相等。
看到这里,相信大家对equals()与==的区别都有一定理解了,但是显然还不够,关于二者的区别,还有值得了解的地方。
新建testString.java进行字符串测试
package testPackage;public class testString { public static void main(String[] args){ String s1 = "我是手机1"; String s2 = new String("我是手机1"); System.out.println(s1==s2); System.out.println(s1.equals(s2)); }}
运行结果:
false
true
结果分析:
在java中,字符串是引用数据类型,以实例对象的形式存在。因此,虽然s1与s2看上去定义方式不同,但是它们都新建了对象,本质其实是一样的。
如上所说,==比较的是引用数据类型在栈中的地址是否相同,s1与s2都新建了两个字符串对象,当然开辟了两个不同的内存空间,结果返回false当然是意料之中的。
但是s1.equals(s2)为什么返回true呢?按上面所说Object.class不也是直接通过==进行判断的吗?结果应该是false吧?这时不妨大胆打开String的源码。
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }发现String.class给出了对Object.class中equals()方法的重写,重写后equals()要判断两个字符串的字符是否全部相等。
这是修改一下s2的字符再重新测试:
public static void main(String[] args){ String s1 = "我是手机1"; String s2 = new String("我是手机2"); System.out.println(s1==s2); System.out.println(s1.equals(s2)); }
运行结果:
false
false
结果分析:
由于s1与s2的字符不完全相同,因此equals()方法返回false
到这里,给出在实际应用中equals()与==的使用技巧:
- 若是两个基本数据类型的比较,例如int a = 1,b = 2;比较a是否等于b。使用==
- 若要通过比较成员变量判断两个对象是否相等(对象不是字符串),例如自己写的phone对象,要重写从Object类继承来的equals()方法实现。
- 若是比较两个字符串,直接用equals()方法。
- equals()与==的区别与实际应用
- equals()与==的区别与实际应用
- equals与==,equals与hashcode的区别
- equals与==的应用
- equals(Object) 与 == 的区别
- ==与equals的区别
- equals(Object) 与 == 的区别
- equals()与==的区别
- ==与equals()的区别
- equals与==的区别
- Java ==与equals()的区别
- equals(Object) 与 == 的区别
- ==与equals()的区别
- == 与 equals() 的区别
- equals(Object)与==的区别
- c# equals与==的区别
- equals()方法与==的区别
- ==与equals的区别
- (2)奇偶排序
- (转载)有空整理
- 数学优化与凸集4(斯坦福凸优化笔记4)
- Golang实现的Web服务扫描工具
- Hadoop学习心得
- equals()与==的区别与实际应用
- Codeforces 816B-Karen and Coffee
- Oracle数据库基础信息查询
- linux服务器的日志管理
- QT中的定时器使用
- react-native 定时器
- HTML:用递归的方法计算1+2+3+4...+10
- Java设计模式(二):工厂方法模式
- 位运算符