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()方法:是否为同一个对象的 ...
随机推荐
- Java - 31 Java 发送邮件
Java 发送邮件 使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) . 你可以在 ...
- Android 打开高德地图、百度地图进行导航;打开第三方App去导航;
抽成工具类了,复制下来就能直接用了,直接看代码吧: 高德地图Url Api: http://lbs.amap.com/api/amap-mobile/guide/android/navigation ...
- SQL获取连续数字中断数字
表A -- 创建结果表 create table #u(LostA int) declare @minA int,@maxA int set @minA=(select min(ID) from A) ...
- windows 下安装 docker
1. 使用阿里云的镜像进行安装: http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 2. 安装完成后点击图标 “Dock ...
- JVM总结-垃圾回收(下)
大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间. 之所以要提到这个假设,是因为它造就了 Java 虚拟机的分代回收思想.简单来说,就是将堆空间划分为两 ...
- Linux中设置vi编辑器的编码格式以及使用
vi ~/.vimrc set fileencodings=utf-8,gbk set termencoding=utf-8 set encoding=utf-8 vim的多行移动 一.连续的十几行到 ...
- Mysql 多字段去重
使用group by去重现在有如下表 id name age1 张三 232 李四 343 张三 234 李四 32 需求 : 按照name和age字段联合去重 sql如下 select * from ...
- 温故而知新-robots.txt语法教程
用几个最常见的情况,直接举例说明: 1. 允许所有SE收录本站:robots.txt为空就可以,什么都不要写. 2. 禁止所有SE收录网站的某些目录: User-agent: * Disall ...
- a.每个 HTML 文件里开头都有个<!DOCTYPE>
<!DOCTYPE> 位于文档中最前面的位置,告诉浏览器以哪个HTML版本进行解析. 在 HTML5 中只有一种:<!DOCTYPE html> .
- python 生成器 的send
>>> def f(): c=yield 5 print c d=yield c+5 print d >>> b=f() >>> b.send(N ...