深入java面向对象一:==和equals详解
本文从多篇博客笔记融合而来,系转载,非原创,参考:
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相等,所以输出true
System.out.println("p1和p2是否相等?"
+ p1.equals(p2));
//p2和p3的idStr不相等,所以输出false
System.out.println("p2和p3是否相等?"
+ p2.equals(p3));
}
}
程序输出:
总结:
1. ==通常用于判断基本类型数据是否相等; 等它用于比较引用类型数据时,表示比较的引用变量所指向的堆内存空间是一致的。
2. equals方法是Object中的,用于比较两个对象是否相等; 程序员可以通过覆写该方法,定义自己的对象比较规则。
深入java面向对象一:==和equals详解的更多相关文章
- Java面向对象之各种变量详解
在Java中一定有很多变量让大家头疼,成员变量.类变量.局部变量等等,今天就来分别认识认识他们吧! Java面向对象之各种变量详解 前言 在 Java语言中, 根据定义变量位置的不同,可以将变量分成两 ...
- java中hashCode()与equals()详解
首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...
- Java面向对象的三大特征详解
一.封装(Encapsulation) 封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保 ...
- Java面向对象中this关键字详解 意义+实例讲解【hot】
this关键字 >>>便于理解简单的定义 this关键字可以简单的理解为,谁调用this所在的方法,this就是谁. 类的构造函数与getter.setter方法常用到this关键字 ...
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型
Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...
- java.util.ResourceBundle国际化用法详解
java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...
- Java之函数式接口@FunctionalInterface详解(附源码)
Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...
- JAVA反射概念及使用详解(超详细)
JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: ...
随机推荐
- jquery文字上下滚动--单行 批量多行 文字图片上下翻滚 | 多行滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- vue自定义全局公共函数
单独零散的函数 在main.js里进行全局注册 Vue.prototype.ajax = function (){} 在所有组件里可调用 this.ajax() 多个函数定义在一个对象里 // xx. ...
- DOM事件机制
前言 本文主要介绍DOM事件级别.DOM事件模型.事件流.事件代理和Event对象常见的应用,希望对你们有些帮助和启发! 本文首发地址为GitHub博客,写文章不易,请多多支持与关注! 一.DOM事件 ...
- KiCad 元件值 F4NNIU 规范(2019-10-10)
目录 KiCad 元件值 F4NNIU 规范 电阻 电容 电感 二极管 三极管 MOSFET IC 文件历史 KiCad 元件值 F4NNIU 规范 为方便物料统计以及规范物料,在制造 BOM 时可以 ...
- BZOJ 3057圣主的考验题解
老师居然考这么毒瘤的题目!!!!! 很容易想到dp,f[i][j]表示有i个节点,左子树的最深深度为j的方案数 枚举左子树有多少节点然后转移,复杂度为n^3 T飞~ 我们考虑到有深度为h的树的节点有多 ...
- 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度
题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...
- Asterisk 代码架构概述
from:http://blog.csdn.net/yetyongjin/article/details/7594447 近日分析Asterisk 1.8源码.Asterisk trunk上有这篇架构 ...
- Failed to delete access_log
重复build 关闭已经开启的tomcat terminal 再次开启即可
- KiCad EDA 5.1.4 发布了
KiCad EDA 5.1.4 发布了 KiCad EDA 自豪地宣布 KiCad 5 系列最新稳定版发布.5.1.4 稳定版修复了来自 5.1.2 和 5.1.3 版本的关键错误修复和其他一些小改进 ...
- AT3728 Squirrel Migration
AT3728 Squirrel Migration 就是给每个点分配两个匹配点(自环除外) 考虑最大值 考虑极限情况:每个边的贡献是min(sz[u],sz[v])*2 证明存在方案: 发现,如果哪边 ...