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; ...
随机推荐
- Debian8.1 安装samba与windows共享文件,在系统重启后samba服务无法自动启动
Debian8.1安装配置完成并成功与window共享文件后,系统重启后再次访问时出现如下问题 (图)的解决方法 手动重启samba sudo /etc/init.d/samba start 从win ...
- Python对excel的基本操作
Python对excel的基本操作 目录 1. 前言 2. 实验环境 3. 基本操作 3.1 安装openpyxl第三方库 3.2 新建工作簿 3.2.1 新创建工作簿 3.2.2 缺省工作表 3.2 ...
- CDN 工作原理剖析
CDN 工作原理剖析 CDN / Content Delivery Network / 内容分发网络 https://www.cloudflare.com/zh-cn/learning/cdn/wha ...
- 最新 Apple iPhone 12 价格 All In One
最新 Apple iPhone 12 价格 All In One 美版价格 Apple iPhone 12 mini $699 Apple iPhone 12 $799 Apple iPhone 12 ...
- codepen iframe theme id
codepen iframe theme id iframe css theme demos See the Pen css margin collapsing (1. 相邻兄弟元素) by xgqf ...
- Taro 框架实现原理
Taro 框架实现原理 小程序 H5 RN Web 多端框架 Taro 1.x & Taro 2.x 编译型架构, 语法编译转换 Taro 1/2 属于编译型架构,主要通过对类 React 代 ...
- Apple & iOS & Device Screen Sizes and Orientations & React Native
Apple & iOS & Device Screen Sizes and Orientations & React Native iOS devices https://de ...
- C++算法代码——你要乘坐的飞碟在这里[usaco]
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1056 题目描述 一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO. 这些不明 ...
- rar密码破解工具汇总
rar密码破解工具汇总 前言 假如酷爱在网络上找各种资源的你,经历千辛万苦终于找到了一个rar打包的文件,兴奋地慌忙点击,可打开才发现是加密的,相信这样的场景很多人都遇到过,今天就针对压缩文件密码的破 ...
- Prism -- 简介
Prism是一个开源框架,用于在WPF.Xamarin Forms.Uno/Win UI等应用中创建松耦合.可维护.可测试的XAML应用程序.Prism提供了一组设计模式的实现,这些设计模式有助于编写 ...