==和equals()的用法
2016-04-09 13:24
274 查看
先看一段代码:
运行该程序,会打印出以下信息:
a == b? true
c == b? false
可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但它们仍然不同。
why??
要知道,对于这两个引用类型变量c和d,它们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。
注意啦,重要结论:
对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象。
****************************************************************************************
那么如何比较对象的值是否相等呢?
在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改:
运行后可得一个true,这是因为,(重写后的)方法equals()进行的是“深层比较”,它会去比较两个对象的值是否相等。
那么,你或许会问:“这个equals()方法是由谁来实现的呢?”
我们知道,java中所有类的父类是Object类,在Object中,已经定义了一个equals()方法,但是这个默认的equals()方法实际上也只是测试两个变量引用是否指向同一对象(即与 == 功能一样)。所以它并不一定能得到你所期望的效果。通常我们需要自己将定义的类(就是上面的TestEqual)中的equals()进行重写。像Integer封装类就已经重写了Object中的equals()方法,直接可以拿来比较引用类型c和d指向的对象的值。
在Object类当中定义的equals方法:
需要重写!需要重写!需要重写!
****************************************************************************************
equals的作用:
好了,相信你一定耐心地看到了这里,我们来总结一下:
== 和equals()两种比较方法,在使用时要注意:
1、如果要比较两个基本类型的数值是否相等,则一定要用“==”来比较;
2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
3、如果要比较两个引用变量是否指向同一对象,则使用“==”来进行比较;
还有,对于自定义的类,应该根据情况重写其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。
最后,String是一个特殊的引用类型,既可以用String s1 = "java"定义,也可以用String s1 = new String("java")定义。(equals()方法在java.lang.String里面已经重写)
例一:指向数据段中的字符串常量对象
例二:指向堆中的字符串对象
public class TestEqual{ public static void main(String [ ] args){ //基本类型比较 int a = 100; int b = 100; System.out.println("a == b?" + (a == b)); //引用类型比较 Integer c = new Integer(100); Integer d = new Integer(100); System.out.println("c == d?" + (c == d)); } }
运行该程序,会打印出以下信息:
a == b? true
c == b? false
可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但它们仍然不同。
why??
要知道,对于这两个引用类型变量c和d,它们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。
注意啦,重要结论:
对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象。
****************************************************************************************
那么如何比较对象的值是否相等呢?
在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改:
Integer c = new Interger(100); Integer d = new Interger(100); System.out.println("c equals d?" + (c.equals(d) ));
运行后可得一个true,这是因为,(重写后的)方法equals()进行的是“深层比较”,它会去比较两个对象的值是否相等。
那么,你或许会问:“这个equals()方法是由谁来实现的呢?”
我们知道,java中所有类的父类是Object类,在Object中,已经定义了一个equals()方法,但是这个默认的equals()方法实际上也只是测试两个变量引用是否指向同一对象(即与 == 功能一样)。所以它并不一定能得到你所期望的效果。通常我们需要自己将定义的类(就是上面的TestEqual)中的equals()进行重写。像Integer封装类就已经重写了Object中的equals()方法,直接可以拿来比较引用类型c和d指向的对象的值。
在Object类当中定义的equals方法:
public boolean equals(Object obj) { return (this == obj); }
需要重写!需要重写!需要重写!
****************************************************************************************
equals的作用:
好了,相信你一定耐心地看到了这里,我们来总结一下:
== 和equals()两种比较方法,在使用时要注意:
1、如果要比较两个基本类型的数值是否相等,则一定要用“==”来比较;
2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
3、如果要比较两个引用变量是否指向同一对象,则使用“==”来进行比较;
还有,对于自定义的类,应该根据情况重写其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。
最后,String是一个特殊的引用类型,既可以用String s1 = "java"定义,也可以用String s1 = new String("java")定义。(equals()方法在java.lang.String里面已经重写)
例一:指向数据段中的字符串常量对象
String s1 = "java"; String s2 = "java"; System.out.println(s1==s2); //true System.out.println(s1.equals(s2)); //true
例二:指向堆中的字符串对象
String s1 = new String("java"); String s2 = new String("java"); System.out.println(s1==s2); //false System.out.println(s1.equals(s2)); //true
相关文章推荐
- Oracle用户管理和角色管理
- jquery伸缩框
- ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
- ASP.NET之通过JS向服务端(后台)发出请求(__doPostBack is undefined)
- android.hardware.camera2使用指南
- 汇编指令【下】
- 查找最大元素(HDU2025)
- latex学习3:教你如何在word中像LaTex那样打公式
- Android 增强版百分比布局库 为了适配而扩展
- Mysql中使某个用户只能访问指定的数据库
- 读[查询优化改写 技巧与案例]一书有感
- Netty in Action (九) 第四章节 第二部分 transport API
- java中调用xml的方法:DocumentBuilderFactory
- 三年的你应该这样
- ISBN号码
- 新的小组信息以及项目名称与介绍
- oracle imp dmp
- 递归算法&求数组最大值、求N阶乘
- Camel Splitter分配器以及Aggregate聚合器使用实例
- 《JAVA并发编程实践》学习笔记(第十.十一章)