Java字符串==和equals的区别
首先我们来了解一下String类,Java的字符串是一旦被赋值之后无法更改的(这里的无法更改是指不能将字符串中单个或一段字符重新赋值),这也是Java虚拟机为了减少内存开销,避免字符串的重复创建设立的机制,也就是字符串池。
那么字符串池是干嘛的呢?先不急,我们先来回顾一下两种创建字符串的方式。
(1)直接赋值
String str1 = "abc";
这种创建方式JVM会在字符串池查找是否存在“abc”这样的对象,如果没有,就会在字符串池中创建这个对象,然后将该对象的引用地址返回给变量str1,此时str1就会指向字符串池中“abc”这个对象。
那么如果我们再创建一个相同的字符串呢?
String str2 = "abc";
因为之前已经创建过“abc”对象,所以这时候JVM就会发现字符串池中已经存在“abc”这个对象了,那就不需要再重复创建了,只需要把之前创建过的对象的引用地址返回给变量str2,此时str2就会指向字符串池中的“abc”对象。
(2)new
String str3 = new String("abc");
当new一个字符串对象时,JVM就会在字符串池中查找是否存在“abc”对象,我们这里假设之前还没创建过,那么字符串池中就会创建“abc”对象,并且还会在堆中开辟内存创建“abc”对象,并把堆中该对象的地址返回给变量str3,str3指向堆中的“abc”对象。
那么如果我们再创建一个相同的字符串呢?
String str4 = new String("abc");
这个时候由于字符串池中已经存在“abc”了就不重复创建,因为是new所以还是会在堆中创建“abc”对象,并把堆中该对象的地址返回给变量str4,str4指向堆中的“abc”对象.
好了现在我们把两种字符串创建方式搞清楚了,现在就该进入正题了。这里先直接给出字符串中==和equal的区别,然后再做解释。
- ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
- equals():比较的是两个字符串的内容,属于内容比较。
假设以上四行代码已经依次运行,我们观察下面代码的输出结果。
① System.out.println(str1 == str2); // true
② System.out.println(str1.equals(str2)); // true
③ System.out.println(str3 == str4); // false
④ System.out.println(str3.equals(str4)); // true
⑤ System.out.println(str1 == str3); // false
⑥ System.out.println(str1.equals(str3)); // true
① 由于str1和str2都指向字符串池中同一“abc”对象,也就是说这两个字符串的内存地址是相同的,所以为true。
② equals比较的是两个字符串的内容,显而易见str1 = str2 = "abc",所以为true。
③ 由于str3保存的是在堆中"abc”对象的内存地址,当new str4的时候堆中开辟了另一块内存创建"abc"对象,所以两个堆内存的地址是不同的,所以为false。
④ 内容相同,所以为true。
⑤ str1保存的是“abc”对象在字符串池中的内存地址,str3保存的是在堆内存中的内存地址,显然是不同的,所以为false。
⑥ 内容相同,所以为true。
其实不光光是字符串中的==和equals如此,Java的其他数据类型对于他们两基本也是这个差别,下面做一个简单的总结,也方便以后回顾。
(1)==
基本数据类型(如int、double、long等):比较值是否相等
引用数据类型(new出来的):比较内存(堆内存)中的存放地址(正常来说每new一次都会开辟一块新的内存)
(2)equals
引用数据类型:默认情况下比较地址值
但是这个方法是可以被改写的,所以String类中它被改写成了比较字符串内容也就不奇怪啦。
Java字符串==和equals的区别的更多相关文章
- java 的==和equals的区别(二)
java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...
- Java 中 == 和 equals 的区别
有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...
- Java中“==”与equals的区别以及equals方法的重写
一.“==”与equals的区别: (1)==代表比较双方是否相同: 基本数据类型表示值相等. 引用数据类型表示地址相等,即同一个对象. (2)Object中的equals()方法:是否为同一个对象的 ...
- JAVA中“==”与equals()方法区别
equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...
- Java中==与equals的区别及理解
区别: "==" 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致. 如果两个对象的引用相同时(指向同一对象时)," ...
- java 中 “==” 和 equals 的区别
转自https://www.cnblogs.com/www123----/p/7857298.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new Strin ...
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- Java中==与equals()的区别
声明转载来源:http://blog.csdn.net/striverli/article/details/52997927 ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系 ...
- JAVA ==号和equals()的区别
==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值: int x = 10; ...
随机推荐
- Spring应用上下文生命周期
Spring应用上下文生命周期整体分成四个阶段 ConfigurableApplicationContext#refresh,加载或者刷新持久化配置 ConfigurableApplicationCo ...
- 互联网公司技术岗实习/求职经验(实习内推+简历+面试+offer篇)
找工作的事基本尘埃落定了,打算把这大半年来积累的经验写下来,基本都是我希望当年找实习的时候自己能够知道的东西,帮师弟师妹们消除一点信息不平等,攒攒RP~ 不要像我当年那样,接到电话吓成狗,没接到电话吓 ...
- SwiftUI render WKWebView
SwiftUI render WKWebView // // ContentView.swift // webview-app // // Created by 夏凌晨 on 2020/10/27. ...
- JavaScript getter and setter All In One
JavaScript getter and setter All In One getter & setter JavaScript Object Accessors JavaScript A ...
- website captcha
website captcha 验证码 hCaptcha hCaptcha通过询问对人类来说很容易且对机器来说很困难的简单问题,可以帮助您喜欢的Web服务阻止机器人,垃圾邮件和滥用行为. https: ...
- Flutter & APP & UI Components
Flutter & APP & UI Components 下拉刷新或者上拉加载 https://github.com/OpenFlutter/flutter_screenutil h ...
- 谷歌地球服务器"失联"的替代方案
2020年11月下旬,谷歌地球开始无法连接.作为谷歌地球的替代方案,推荐使用国产软件"图新地球LSV".网址 http://www.tuxingis.com 下载"图新地 ...
- Python算法_斐波那契数列(10)
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 ...
- banner自用图床
放些常用的图做图床,也不在别的平台用.
- 自己的Scrapy框架学习之路
开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...