深入java面向对象一:==和equals详解
来源:互联网 发布:猪八戒考试出题软件 编辑:程序博客网 时间:2024/05/17 10:28
本文从多篇博客笔记融合而来,系转载,非原创,参考:
1. http://www.cnblogs.com/e241138/archive/2012/09/16/2687981.html
2. http://blog.csdn.net/xiaoya629/article/details/5549159
3.《疯狂java讲义》
一、 关于==和equals方法
Java中判断变量相等一般使用==运算符和equals方法。
其中,关于“==”,当我们使用==来比较基本数据类型时,比较的是其值,只要他们的值相同,==就可以返回true。当用==比较引用类型时,比较的是的地址,二者是否引用同一个堆内存空间,如果是,则返回true。即便二引用变量引用的堆内存中的内容完全相同,只要是不同的两个堆内存,也只会返回false。
而equals是Object中的方法,用来比较留个对象是否相等,程序员可以通过覆写该方法,定义自己的对象比较规则。String类已经覆写了该方法,用于比较字符串序列内容是否相等。
如果我们自定义了某个类,且此类需要进行对像是否相同的比较,那我们需要覆写equals方法,定义自己的比较规则,而不能直接调用Object的equals方法。
二、 ==比较运算符
==比较的是两个基本数据类型的值是否相等,或者两个对象的引用地址是否一样。
如下代码:
public static void main(String args[]) { int a = 1000, b = 1000; System.out.println(a == b); Integer c = 1000, d = 1000; System.out.println(c == d); Integer e = 100, f = 100; System.out.println(e == f); }运行的结果为:true false true
原因:
(1)a和b都是基本数据类型,值也相等,所以 a==b 为true
(2)Integer c = 1000 是将一个基本数据类型的值赋给对象的引用。这里涉及到了装箱的概念,
就是把把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。
编译器用的是public static Integer valueOf(int i)方法。
来看下它的源码:
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); }当i的值在[-128,127]之间时,返回的是IntegerCache缓存的对象的已用,否则返回的是新的对象的引用。
因此,c 和 d 是两个不同的对象, e 和 f 是两个相同的对象。
通过调试也可以看到他们的id值也说明了这一点。
所以,c==d 为 false ,e==f 为 true。
三、 equals运算符
equals比较的是两个对象是否相等。由于每个类都是使用Object作为超类的,所以所有对象(包括数组)也实现这个类方法。
对于Object类的equals方法源代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到它调用的就是 == 比较运算符。因此下面的代码结果就很容易看出为false了。
覆写equals判断对象是否相同需要注意以下几点:
1. equals的参数类型应该为Object,Object可以接收一切类型的对象;
2. 接受之可以先通过==进行判断,看二对象应用的地址是否相同,相同则直接返回true;
3.在以上不成立的情况下进行进一步判断。通过instanceof判断此对象是否是此类的实例。同一个类的实例才可以进行比较,不同类的实例自然不会相同。
4.最后对两对象的每个属性的值进行比较,相同则两对象相同,不同则两对象不同。
现按以上思路覆写equals方法,代码如下:
class Person{private String name;private String idStr;public Person(){}public Person(String name , String idStr){this.name = name;this.idStr = idStr;}//此处省略name和idStr的setter和getter方法。//name属性的setter和getter方法public void setName(String name){this.name = name;}public String getName(){return this.name;}//idStr属性的setter和getter方法public void setIdStr(String idStr){this.idStr = idStr;}public String getIdStr(){return this.idStr;}//重写equals方法,提供自定义的相等标准public boolean equals(Object obj){// 如果两个对象为同一个对象if (this == obj)return true;//只有当obj是Person对象if (obj != null && obj.getClass() == Person.class){Person personObj = (Person)obj;//并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等if (this.getIdStr().equals(personObj.getIdStr())){return true;}}return false;}}public class OverrideEqualsRight{public static void main(String[] args) {Person p1 = new Person("孙悟空" , "12343433433");Person p2 = new Person("孙行者" , "12343433433");Person p3 = new Person("孙悟饭" , "99933433");//p1和p2的idStr相等,所以输出trueSystem.out.println("p1和p2是否相等?" + p1.equals(p2));//p2和p3的idStr不相等,所以输出falseSystem.out.println("p2和p3是否相等?"+ p2.equals(p3));}}
总结:
1. ==通常用于判断基本类型数据是否相等; 等它用于比较引用类型数据时,表示比较的引用变量所指向的堆内存空间是一致的。
2. equals方法是Object中的,用于比较两个对象是否相等; 程序员可以通过覆写该方法,定义自己的对象比较规则。
- 深入java面向对象一:==和equals详解
- 从Java的equals和==初识面向对象
- java面向对象的深入理解(一)
- 七、java的面向对象程序设计(详解equals方法)
- java equals和==的详解
- Java之equals和==详解
- java中equals和==详解
- Java-equals()和toSting()用法(面向对象编程思想)
- Java面向对象7——toString和equals
- 深入了解java equals 和 == 的区别
- Java源码解析:深入理解==和equals()
- Java面向对象深入
- JAVA 面向对象一:类和对象
- Java语言深入:深入研究Java equals方法,equals,==,equals用法
- Java中对象的比较 == 和 equals()
- java中的对象比较 == 和equals
- java :两个对象相等equals和==的区别
- Java中对象的比较 == 和 equals()
- linux下快速检查alert日志
- drop再重建表后对应的权限缺失问题
- JAVA 反射机制 在运行时使用反射分析对象
- Tomcat 基本配置
- 01-C++中重载、重写(也称覆盖)、隐藏
- 深入java面向对象一:==和equals详解
- 最基础的mysql分页存储过程
- 我也遇到INSTALL_FAILED_CONTAINER_ERROR
- IE 8以下兼容模式问题
- js中addEventListener中第3个参数 更多的情况研究
- jsp页面调用打印功能
- 关于winform的地址联级编程
- Android闹钟程序周期循环提醒源码(AlarmManager)
- java.io.FileNotFoundException: Template /template/ajax/head.ftl not found.