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()方法:是否为同一个对象的 ...
随机推荐
- Android标题头滑动渐变,Titlebar滑动渐变,仿美团饿了么标题头渐变;
原理就是滑动中改变透明度: 核心代码: rv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public vo ...
- linux:安装mysql管理工具phpmyadmin
1.下载phpmyadmin,下载地址:http://www.phpmyadmin.net/ 2.解压到/var/www/html/phpmyadmin/ 3.修改配置 cd /var/www/htm ...
- Linux服务器安装Nginx
Nginx 安装 一.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel 二.首先 ...
- js保留两位小数点
var temp = 2.222222222; temp.toFixed(2); //得出结果2.22
- 认识JDBC
内容: 1.JDBC介绍 2.JDBC入门 3.JDBC工具类实际使用 4.预处理对象 5.JDBC连接池 1.JDBC介绍 (1)基本概念介绍 什么是JDBC: JDBC(Java DataBase ...
- DOM常用的属性和方法
之前一直傻傻分不清DOM和JavaScript究竟有什么区别,随着相关工作时间的增长,开始逐渐区分DOM和JavaScript了,最近,也一直在复习有关DOM方面的知识,<JavaScript ...
- 【Selenium-WebDriver自学】Log4J的设置(十五)
==================================================================================================== ...
- ios判断当前设备类型
代码如下: + (NSString*) deviceString { // 需要#import "sys/utsname.h" struct utsname systemInfo; ...
- python获取指定日期的前N天日期和后N天日期
#encoding:utf-8from datetime import date, datetime, timedelta day = date.today()now = datetime.now() ...
- Maven的下载和配置
一.下载 打开 链接地址 http://maven.apache.org/download.cgi 下载 Maven, 下载加压打开以后目录: 二.配置环境变量 我的电脑 -> 属性->高 ...