【重走Android之路】【番外篇】关于==和equals
 
在实际的编程当中,经常会使用==和equals来判断变量是否相同。但是这两种比较方式也常常让人搞得云里雾里摸不着头脑。下面是我个人做的总结,希望能起到拨云见日的作用。
 
【讲前普及】
请阅读
了解Java基本数据类型和引用数据类型
 

1、"=="运算符

通俗点讲,==运算符比较的是两个变量在栈中的内容是否相同。
以a == b为例:

1.1 如果a,b都是基本数据类型

  • a,b不兼容,无法比较
  • a,b兼容,比较栈内的数值
//Code:
int a = 1000;
int b = 1000;

//Result:
a == b : true

1.2 如果a为基本数据类型,b为引用类型

  • a,b不兼容,无法比较
  • a,b兼容,则比较的仍然是a、b在栈内的内容
 //Code:
 int a = 1000;
 Integer b = 1000;
 Integer c = new Integer(1000);

 //Result:
 a == b:true
 a == c:true

1.3 如果a、b均为引用类型

  • a、b不兼容,无法比较
  • a、b兼容,则比较的是对象a、b在栈内保存的地址(不考虑null情况)
 // 简单说,就是比较a、b是否指向的是同一个实例(内存块)。
 Code:
 String a = "Test";
 String b = "Test";
 String c = new String("Test");
 String d = new String("Test");

 Integer x = 1000;
 Integer y = new Integer(1000);
 Integer z = new Integer(1000);

 Result:
 a == b:true
 a == c:false
 c == d:false

 x == y:false
 y == z:false
 // 上例中,"Test"被放在常量池中,对象a、b的地址均指向该常量。c和d则在堆内重新开辟内存分别存储"Test",所以c和d指向的内存地址也不相同。

2、equals方法

除去自定义的equals方法,和一些类对equals方法的特殊实现,一般情况下,equals比较的就是两个对象的实质内容是否相同。
还以b.equals(a)为例:

2.1 如果a、b都是基本数据类型,不可比较

2.2 如果a为基本数据类型,b为引用类型

  • 如果a、b不兼容,则结果必为false
  • 如果a、b兼容,则比较a在栈内的数值和b在堆内存中的值是否相同
 //Code:
 int a = 1000;
 Integer b = 1000;
 Integer c = new Integer(1000);

 //Result:
 b.equals(a):true
 c.equals(a):true

2.3 如果a、b均为引用类型

  • 如果a、b不是相同实例,则结果必为false
 //Code:
 Object a = new String("Test");
 Object b = new StringBuilder("Test");

 //Result:
 b.equals(a):false
  • 如果a、b是相同实例,则比较a、b在堆内存中的值是否相同
//Code:
String a = "Test";
String b = "Test";
String c = new String("Test");
String d = new String("Test");

Integer x = 1000;
Integer y = new Integer(1000);
Integer z = new Integer(1000);

//Result:
b.equals(a):true
c.equals(a):true
c.equals(d):true

y.equals(x):true
y.equals(z):true

【重走Android之路】【番外篇】关于==和equals的更多相关文章

  1. 【重走Android之路】【番外篇】有关于null的一些知识点

    [重走Android之路][番外篇]有关于null的一些知识点   1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象. ...

  2. 【重走Android之路】【路线篇(二)】知识点归纳

    [重走Android之路][路线篇(二)]知识点归纳   参考:http://blog.csdn.net/xujing81/article/details/7313507   第一阶段:Java面向对 ...

  3. 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

    [重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder   1.String String是Java中的一个final ...

  4. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  5. 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符

    [重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符   1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...

  6. 【重走Android之路】【开篇】序

    [重走Android之路][开篇]   [序]         本人Nodin,偶尔也叫MoNodin,朋友们都喜欢叫我丁,还有个笔名叫陌上幽人,文艺时叫恋风,发奋时叫不肯腐烂的土壤...也许你觉得我 ...

  7. 【重走Android之路】【路线篇(一)】路线图

    总结归纳了J2SE和Android的知识点,自己制订了一套详细的路线图,其中肯定有考虑不全和不合适的地方,欢迎各位大牛批评指正.   详细路线图如下:  

  8. Apache Cordova开发Android应用程序——番外篇

    很多天之前就安装了visual studio community 2015,今天闲着么事想试一下Apache Cordova,用它来开发跨平台App.在这之前需要配置N多东西,这里找到了一篇MS官方文 ...

  9. Monkey源代码分析番外篇之Android注入事件的三种方法比較

    原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析 ...

随机推荐

  1. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  2. kettle资源库配置

    资源库的作用:资源库是用来保存操作步骤和相关的日志,转换,JOB 等信息.用户通过图形界面创建的的转换任务可以保存在资源库中.资源库可以是各种常见的数据库,用户通过用户名/ 密码来访问资源库中的资源, ...

  3. mac Zip 常用命令

    最通俗的用法 zip -q -r -e -m -o [yourName].zip someThing -q 表示不显示压缩进度状态 -r 表示子目录子文件全部压缩为zip  //这部比较重要,不然的话 ...

  4. Poj2946-The Warehouse(bfs+哈希)

    题目我就不粘贴了... 题意:给出地图,最大8*8,出口用'E'表示,空地用'.'表示,数字表示此处有多少个箱子,主人公的起点应该是在有箱子的地方,他可以朝四个方向移动,但是只有两种方式 一种是他移动 ...

  5. (中级篇 NettyNIO编解码开发)第七章-java序列化

    相信大多数Java程序员接触到的第一种序列化或者编解码技术就是.Java的默认序列化,只需要序列化的POJO对象实现java.io.Serializable接口,根据实际情况生成序列ID,这个类就能够 ...

  6. python基础之七种运算符

    废话不多说,上节说的是数据类型,本篇讲讲数据运算. 在算式"1+2"中,"1"和"2"被称为操作数,"+"被称为运算符 ...

  7. Java设计模式之策略设计模式

    1.什么是-策略设计模式 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Ha ...

  8. mpvue学习笔记-之微信小程序数据请求封装

    简介 美团出品的mpvue已经开源出来很久了,一直说要进行一次实践,这不最近一次个人小程序开发就用上了它. 看了微信官方的数据请求模块--request,对比了下get和post请求的代码,发现如果在 ...

  9. mybatis 报The content of elements must consist of well-formed character data or markup. 语法格式错误

    最近在写sql的时候 同时使用到了 >= 和 <= 之前只使用一个的时候 没有什么问题,今天同时使用到了两个,结果xml出现了The content of elements must co ...

  10. XML生成XAMl扩展

    所有的WPF控件列为枚举 代码如: 1 public enum ControlType 2 { 3 Window_Resources, 4 Page_Resources, 5 Grid, 6 Stac ...