Java 中 == 和 equals 的区别
有一段时间,== 和 equals 的区别一直困扰着我。因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解。
== 和 equals 最大的区别就是 它们对比的东西不一样,前者对比的是 栈的一个地址。后者对比的是 栈中的值。不知道我这样说对不对,如果不对的话请指教,谢谢。
String a = "1";
String b = "1";
String c = new String("1");
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a==c);
System.out.println(a.equals(c));
上面这段代码的输出是 true true false true
这样的结果和我的理解相同,首先 声明一个变量 a 并赋值为 "1",在赋值的过程中,程序首先回去String缓冲池中寻找是否有"1"存在,如果发现没有,则新建一个。这时候,
声明了一个变量b,也赋值为"1" ,这时候String缓冲池中有"1",那么这时,b也指向了缓冲池中"1"的地址。这时,变量a和变量b就指向了同一个地址。所以前面两个判断都是
true。在声明第三个变量c的时候,程序写到新建一个存放"1"的内存空间,之前的那个变量c不要了。这时内存空间中就有两个存储"1"的地址,存储的地址不一样,但是值相同,
这就造成了 第三个输出语句为false,第四个为true。不得不说的是,变量c的做法很浪费,在实际开发过程中很少用到。最起码我没用到过,当然,可能是我资历还是不足。
这里,在用两个很形象的比喻来区别 == 和 equals 。 现在我要去肯德基吃午饭,三个同事a,b,c给了我三个不同的路线,于是按照这三条路线我都走了一遍,发现 a和b同事虽然
给了我不同的路线,但是按照路线走下来却是同一家KFC,c同事的路线走下来也是KFC,但是和之前的KFC不是同一家。结果我吃的都是KFC,但是a同事和b同事给的地址是同一家
KFC,c同事则是另一家KFC。
上面这个例子中,吃的是KFC 代表的是值,KFC的地址代表 内存中的地址。虽然吃的都是KFC,但是不是同一家店就对应代码中的虽然值相同,但值在内存中的地址不同,而变量
指向的地址也不同,这时候用==判断值是否相等的话就会出现错误。
Java 中 == 和 equals 的区别的更多相关文章
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- JAVA中“==”与equals()方法区别
equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...
- Java中==与equals的区别及理解
区别: "==" 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致. 如果两个对象的引用相同时(指向同一对象时)," ...
- Java中==与equals()的区别
声明转载来源:http://blog.csdn.net/striverli/article/details/52997927 ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系 ...
- java 中 “==” 和 equals 的区别
转自https://www.cnblogs.com/www123----/p/7857298.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new Strin ...
- java中==和equals的区别(转)
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ...
- JAVA中==与equals的区别
equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们“实际意义上相等”,比较的是内容,而不是引用地址.Java中S ...
- Java中==和equals()的区别
- Java中“==”与equals的区别以及equals方法的重写
一.“==”与equals的区别: (1)==代表比较双方是否相同: 基本数据类型表示值相等. 引用数据类型表示地址相等,即同一个对象. (2)Object中的equals()方法:是否为同一个对象的 ...
随机推荐
- mysql千万级数据库插入速度和读取速度的调整记录
一般情况下mysql上百万数据读取和插入更新是没什么问题了,但到了上千万级就会出现很慢,下面我们来看mysql千万级数据库插入速度和读取速度的调整记录吧. 1)提高数据库插入性能中心思想:尽量将数据一 ...
- TreeSet多字段排序
package st; public class PersonBean implements Comparable<Object>{ private String name; privat ...
- vue项目,npm install后,npm run dev报错问题
报错: ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! metools@1.0.0 dev: `node build/dev-server.js` npm ...
- 12纯 CSS 创作一种文字断开的交互特效
原文地址:https://segmentfault.com/a/1190000014719591 总结:三部分组成,原文透明,左右都与原文重叠(绝对定位),但左右各取相应一部分. HTML代码: &l ...
- Apache 服务器 基础知识小结
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软 ...
- Python中的字符串方法
Python中的字符串方法 字符串类即str提供了许多有用的方法来操纵字符串.具体来说,我们将讨论如下的方法. 搜索字符串内的子字符串. 测试字符串. 格式字符串. 转换字符串. 回顾前面的章节,方法 ...
- 【转】簡單講講 USB Human Interface Device
原地址http://213style.blogspot.com/2013/09/usb-human-interface-device.html 恩,發本文的原因是看到了以前畢業的朋友在旁邊的對話框問了 ...
- 解决idea启动项目报错:Unable to open debugger port(127.0.0.1:60157):java.net.SocketException"socket closed
原因分析: 1.可能是端口被占用导致,其他软件占用了tomcat的端口. 2.可能是在打开Tomcat的情况下关闭了Eclipse.idea等开发工具,或是Eclipse.idea非正常关闭(如电脑. ...
- Django-wed开发框架-练习题
https://www.cnblogs.com/pandaboy1123/p/9894981.html 1.列举Http请求常见的请求方式 HTTP协议是Hyper Text Transfer Pro ...
- git-搭建企业git服务器
1.安装 yum install git 2.增加用户 useradd git -d /home/git -g git 3.查看公钥鉴权文件是否存在 cat /home/git/.ssh/autho ...