java学习——equals()和==的比较
2015-06-29 11:25
645 查看
equals 方法是 java.lang.Object 类的方法。
下面从两个方面来说明equals()和==的差别:
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
【例子】
【注意】
在字符串构建中有个特殊字符串类型StringBuffer,StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较“地址”的。所以会有如下情形出现:
(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
【总结】:
1. equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。
2. equals 方法是 java.lang.Object 类的方法,Object类中的equals方法是用来比较“地址”的,但是String类中重新定义了equals这个方法,而且比较的是值,而不是地址。
3. 如果是基本类型(byte, short, int, long, float, double, char,boolean)比较,那么只能用==来比较,不能用equals();
4. 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。
5. 注意一个基本的原则:在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法。
重写equals()方法的一般规则:
a、先用“==”判断是否相等(是否指向同一对象)。
b、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。
c、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。
d、判断类的成员是否对应相等。往下就随意发挥了。
【例子】判断被比较对象user的username 属性和待比较对象的username相等:
下面从两个方面来说明equals()和==的差别:
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
【例子】
String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"); s2 = new String("abc"); s1==s2; //false,两个变量的内存地址不一样,也就是说它们指向的对象不 一样 s1.equals(s2); // true,两个变量所包含的内容是abc,故相等。 s1 == s3; //false s1.equals(s3); //true s3 == s4; //true,字符串常量所生成的变量,存放于常量池中,故其中所存放的内存地址是相等的 s3.equals(s4); //true
【注意】
在字符串构建中有个特殊字符串类型StringBuffer,StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较“地址”的。所以会有如下情形出现:
StringBuffer s1 = new StringBuffer("a"); StringBuffer s2 = new StringBuffer("a"); s1.equals(s2) //false
(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
A obj1 = new A(); A obj2 = new A(); obj1==obj2; //false obj1.equals(obj2); //false A obj1 = new A(); obj2 = obj1; obj1==obj2; //true obj1.equals(obj2); //true
【总结】:
1. equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。
2. equals 方法是 java.lang.Object 类的方法,Object类中的equals方法是用来比较“地址”的,但是String类中重新定义了equals这个方法,而且比较的是值,而不是地址。
3. 如果是基本类型(byte, short, int, long, float, double, char,boolean)比较,那么只能用==来比较,不能用equals();
4. 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。
5. 注意一个基本的原则:在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法。
重写equals()方法的一般规则:
a、先用“==”判断是否相等(是否指向同一对象)。
b、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。
c、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。
d、判断类的成员是否对应相等。往下就随意发挥了。
【例子】判断被比较对象user的username 属性和待比较对象的username相等:
public class User { private String username; @Override public boolean equals(Object obj){ if(obj == null){ return false; }else { if(this.getClass() == obj.getClass()){ User u = (User) obj; if(this.getUsername().equals(u.getUsername())){ return true; }else{ return false; } }else{ return false; } } } }
相关文章推荐
- LeetCode_64---Minimum Path Sum
- eclipse利用maven创建Sevlet3.0项目
- Java getResourceAsStream() 方法会缓存文件的问题
- Spring注解
- Java map排序(TreeMap,LinkedHashMap)
- spring mvc与struts的区别
- 【Spring学习笔记-MVC-13】Spring MVC之文件上传
- Java反射机制(以数据库读取为例)
- java 访问url
- spring mvc DispatcherServlet详解之前传---前端控制器架构
- java swing实现简单图片显示(测试生成图片快捷方式)
- Java多态的内存分析——高淇Java300学习笔记
- 《Java程序设计》第16周周五:数据库连接 与 随机数的使用
- struts2上传工具类
- Myeclipse安装配置优化
- Java读书笔记二(封装类)
- java 单链集合实现
- Java OOM的种类
- Java 归并排序(MergeSort)算法实现
- Eclipse软件快捷键大全