zoukankan      html  css  js  c++  java
  • 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类中它被改写成了比较字符串内容也就不奇怪啦。

      

  • 相关阅读:
    Linux根目录各个文件夹介绍及说明
    CentOS7 yum方式安装MySQL5.7
    spring-boot 启动图标修改-启动彩蛋
    Android 4.4从图库选择图片,获取图片路径并裁剪
    Android开发之获取相册照片和获取拍照照片二
    Android开发之获取相册照片和获取拍照照片
    httpclient 发送文件和字符串信息
    HttpURLConnection 发送 文件和字符串信息
    Android中使用HTTP服务
    android http json请求3种不同写法
  • 原文地址:https://www.cnblogs.com/z1014601153/p/12763697.html
Copyright © 2011-2022 走看看