【喵"的Android之路】【番外篇】关于==和equals

【喵"的Android之路】【番外篇】关于==和equals

在实际的编程当中,经常会使用==和equals来判断变量是否相同。但是这两种比较方式也常常让人搞得云里雾里摸不着头脑。下面是我个人做的总结,希望能起到拨云见日的作用。

【讲前普及】

请阅读

【喵"的Android之路】【基础篇(一)】【Java面向对象基础】数据类型与运算符

了解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在栈内的内容
1 //Code:
2 int a = 1000;
3 Integer b = 1000;
4 Integer c = new Integer(1000);
5
6 //Result:
7 a == b:true
8 a == c:true

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

  • a、b不兼容,无法比较
  • a、b兼容,则比较的是对象a、b在栈内保存的地址(不考虑null情况)
 1 // 简单说,就是比较a、b是否指向的是同一个实例(内存块)。
 2 Code:
 3 String a = "Test";
 4 String b = "Test";
 5 String c = new String("Test");
 6 String d = new String("Test");
 7
 8 Integer x = 1000;
 9 Integer y = new Integer(1000);
10 Integer z = new Integer(1000);
11
12 Result:
13 a == b:true
14 a == c:false
15 c == d:false
16
17 x == y:false
18 y == z:false
19 // 上例中,"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在堆内存中的值是否相同
1 //Code:
2 int a = 1000;
3 Integer b = 1000;
4 Integer c = new Integer(1000);
5
6 //Result:
7 b.equals(a):true
8 c.equals(a):true

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

  • 如果a、b不是相同实例,则结果必为false
1 //Code:
2 Object a = new String("Test");
3 Object b = new StringBuilder("Test");
4
5 //Result:
6 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

本文系Nodin原创,转载请注明出处!http://www.cnblogs.com/monodin/p/3841219.html

【喵"的Android之路】【番外篇】关于==和equals,布布扣,bubuko.com

时间: 2024-12-26 07:51:59

【喵"的Android之路】【番外篇】关于==和equals的相关文章

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

很多天之前就安装了visual studio community 2015,今天闲着么事想试一下Apache Cordova,用它来开发跨平台App.在这之前需要配置N多东西,这里找到了一篇MS官方文章:配置 Visual Studio Tools for Apache Cordova.看着这片文章开始一个个安装,nodejs.chrome.Git.Apache Ant.Oracle Java.Android SDK等,然后又是配置环境变量.最后呢,我们可以使用VS自带的检测工具来检测一下依赖环

云架构在甲方的落地之路-番外篇之企业安全

本来准备直接就云架构定义开启新的篇章.但是在仔细斟酌之后发现,将一整套云基础架构搬出来讲解,从技术角度来说其实并不是难事,但是这样就体现不出甲方IT在设计架构整个过程中的考量.正如在背景篇中介绍的,一个甲方的IT在思考架构或者方案时必定需要和企业自身的组织架构,业务需求结合在一起,并不是看到别人上个新颖的概念或者系统我们就必须依样画葫芦. 在云架构的设计中有至关重要的一项那就是云安全.说到云安全,许多同志们我估计第一反应就是IPS,IDS,FW, DLP, anti-virus,WAF等一整套全

【喵"的Android之路】【番外篇】有关于null的一些知识点

[喵"的Android之路][番外篇]有关于null的一些知识点 1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象.因此,下面的做法是错误的: int a = null; 但: Object obj = null; 是可以的,因为null表示Object类型的一个空对象引用,符合其用意. [注1]引用类型使用null声明对象变量后,无法使用该变量访问对象的成员.例如上述obj对象如果使用obj.toString()

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

原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析monkey事件注入源码之前先了解下在android系统下事件注入的方式,翻译一篇国外文章如下. Method 1: Using internal APIs 方法1:使用内部APIs This approach has its risks, like it is always with intern

Android好奇宝宝_番外篇_看脸的世界_05

上一篇番外篇讲了一个炒鸡炒鸡简单的自定义ProgressBar,这一篇基于上一篇的基础扩展为SeekBar,没看过上一篇的,请先看一遍:传送门 先上效果图(2G内存的机子运行模拟器,所以有点卡): 这个效果之前不知道在哪里看到过,我也忘了. 下面进入正题: 测量大小和绘制部分沿用上一篇ProgressBar的,不清楚的请走上面的传送门. 对比上一篇的扩展: (1)SeekBar能通过触摸改变刻度 (2)SeekBar上方添加一个显示当前刻度的浮动View(后面用FloatView表示) (1)通

编程珠玑番外篇之番外篇-O 中间语言和虚拟机漫谈(ZZ)

http://blog.youxu.info/2014/05/11/language-and-vm/ 导言 编程语言的发展历史,总的来说,是一个从抽象机器操作逐步进化为抽象人的思维的过程.机器操作和人的思维如一枚硬币的两面,而语言编译器就像是个双面胶,将这两面粘在一起,保证编程语言源程序和机器代码在行为上等价.当然,人本身并不是一个完美的编译器,不能无错的将思维表达为高级语言程序,这种偏差,即Bug.因为编译器的帮助,我们可以脱离机器细节,只关心表达思维和程序行为这一面. 编程语言的发展日新月异

iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook(转载)

作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动安全方向的论文(BlackHat.AsiaCCS等),去过10多个不同的国家做论文演讲. 曾帮助Apple公司修复了多处iOS安全问题,并且Apple在官网表示感谢.同时也是蓝莲花战队和Insight-labs的成员,在业余时间多次参加信息安全竞赛(Defcon.AliCTF.GeekPwn等),并取得优异

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因为一行简单的配置之后, 你就可以像使用本机文件一样使用远程的任何文件. 无论是想编辑, 查看还是删除重命名, 都和本机文件一样的用. 这么神奇的功能到底如何

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.