首先我们来了解一下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的区别的更多相关文章

  1. java 的==和equals的区别(二)

    java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...

  2. Java 中 == 和 equals 的区别

    有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...

  3. Java中“==”与equals的区别以及equals方法的重写

    一.“==”与equals的区别: (1)==代表比较双方是否相同: 基本数据类型表示值相等. 引用数据类型表示地址相等,即同一个对象. (2)Object中的equals()方法:是否为同一个对象的 ...

  4. JAVA中“==”与equals()方法区别

    equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...

  5. Java中==与equals的区别及理解

    区别: "==" 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致. 如果两个对象的引用相同时(指向同一对象时)," ...

  6. java 中 “==” 和 equals 的区别

    转自https://www.cnblogs.com/www123----/p/7857298.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new Strin ...

  7. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  8. Java中==与equals()的区别

    声明转载来源:http://blog.csdn.net/striverli/article/details/52997927 ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系 ...

  9. JAVA ==号和equals()的区别

    ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值: int x = 10; ...

随机推荐

  1. Spring应用上下文生命周期

    Spring应用上下文生命周期整体分成四个阶段 ConfigurableApplicationContext#refresh,加载或者刷新持久化配置 ConfigurableApplicationCo ...

  2. 互联网公司技术岗实习/求职经验(实习内推+简历+面试+offer篇)

    找工作的事基本尘埃落定了,打算把这大半年来积累的经验写下来,基本都是我希望当年找实习的时候自己能够知道的东西,帮师弟师妹们消除一点信息不平等,攒攒RP~ 不要像我当年那样,接到电话吓成狗,没接到电话吓 ...

  3. SwiftUI render WKWebView

    SwiftUI render WKWebView // // ContentView.swift // webview-app // // Created by 夏凌晨 on 2020/10/27. ...

  4. JavaScript getter and setter All In One

    JavaScript getter and setter All In One getter & setter JavaScript Object Accessors JavaScript A ...

  5. website captcha

    website captcha 验证码 hCaptcha hCaptcha通过询问对人类来说很容易且对机器来说很困难的简单问题,可以帮助您喜欢的Web服务阻止机器人,垃圾邮件和滥用行为. https: ...

  6. Flutter & APP & UI Components

    Flutter & APP & UI Components 下拉刷新或者上拉加载 https://github.com/OpenFlutter/flutter_screenutil h ...

  7. 谷歌地球服务器"失联"的替代方案

    2020年11月下旬,谷歌地球开始无法连接.作为谷歌地球的替代方案,推荐使用国产软件"图新地球LSV".网址 http://www.tuxingis.com 下载"图新地 ...

  8. Python算法_斐波那契数列(10)

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0,   F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 ...

  9. banner自用图床

    放些常用的图做图床,也不在别的平台用.

  10. 自己的Scrapy框架学习之路

    开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...