首页 > 其他分享 >"==" 与 equals 比较字符串对象

"==" 与 equals 比较字符串对象

时间:2022-12-24 19:24:24浏览次数:39  
标签:abc String 对象 equals System println 字符串

"==" 与 equals 在字符串比较中的不同

"==" 比较的是字符串的地址值,是不是同一份内存空间的地址(相同引用)
equals 比较的是字符串的内容,同一个内存空间地址里值(相同内容)

例如:

public static void main(String[] args) {
    String str1 = new String("abc");
    String str2 = new String("abc");
    String str3;
    str3 = str1;

    System.out.println(str1 == str2);//false
    System.out.println(str1.equals(str2));//true
    System.out.println(str1 == str3);//true
    System.out.println(str1.equals(str3));//true
    System.out.println(str1.equals(null));//false
}  

str1 与 str2 会在堆内存中创建字符串对象,两者有不同的内存地址(0x0001与0x0002),但是用equals比较两者存储的内容时一致的,新定义的变量str3指向了str 相同的内存地址(0x0001),所以无论是比较内存地址和字符串内容都相等,注意任何字符串与null常量比较都是false.

我们再看以下代码:

    String str4 = "abc";
    String str5 = "abc";
    System.out.println(str4==str5);//true
    System.out.println(str4.equals(str5));//true
    String str6 = new String("abc");
    System.out.println(str6==str4);//true  

那么这里为什么输出true呢,因为字符串"abc"是字符串常量池中取出来的.

什么是String Pool(String池):

专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时JVM会首先检查字符串常量池,如果该字符已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

所以采用直接创建String类型对象的方法创建对象时,JVM首先会去字符串常量池中查找是否存在"abc" 这个对象,如果不存在,则在字符串常量池中创建”abc“这个对象,然后将池中”abc“对象的引用地址返回给对象str4,这样str4的地址就在常量池中;
如果存在,则不创建任何对象,直接将存在的“abc”的地址返回给对象str5。这就是为什么str4等于str5的原因。

而通过new方法创建的str6对象,创建的字符串是放在堆当中的,将堆当中的字符串地址返回赋值给str6,str4和str6的存放地址不相同,一个在字符串常量池中,一个在堆当中,因此返回的值是false。

标签:abc,String,对象,equals,System,println,字符串
From: https://www.cnblogs.com/OKGOsky/p/17003231.html

相关文章

  • Java字符串
    提取字符串的某个位置用charAt();提取字符串的长度length();判断大写字母,小写字母和数字个数大写   >='A'&&<='Z'小写   >='a'&&<='z'数字   >='0'&......
  • 字符串处理函数 相关函数: strstr
    相关函数:strstr头文件 :#include<string.h>函数原型:char*strstr(constchar*haystack, constchar*needle);函数说明:在字符串haystack中查找字符串needle......
  • spring mvc——SpringMVC常用注解——ModelAttribute注解——(在控制器方法之前执行,保
                    ===========================================================================================     有......
  • 121_逆序输出字符串
    题干:编程实现将输入的字符串逆序输出。#逆序输出字符串str_data[::-1]#递归实现逆序,不能用占位defrev_str(str_data):str_length=len(str_data)ifstr_len......
  • 【C语言】strstr() - 在一个字符串中查找另外一个字符串。
    前言在前面的文章 strlen()、strcpy()、strcat()、strcmp() 的四个字符串函数、这四个是最基本也是我们最常用的字符串函数、接下来我们要介绍的可能很多小伙伴比较陌生的......
  • 【C语言】strtok() - 切割字符串。
    前言在前面的文章 strlen()、strcpy()、strcat()、strcmp() 的四个字符串函数、这四个是最基本也是我们最常用的字符串函数、接下来我们要介绍的可能很多小伙伴比较陌生的......
  • JAVA面向对象
    JAVA面向对象面向对象编程(OOP,Object-OrientedProgramming)以类的方式组织代码,以对象的形式封装数据三大特性封装继承多态类与对象的关系类是一种抽象的数据类......
  • 1754. 构造字典序最大的合并字符串
    1754.构造字典序最大的合并字符串题解:每次从word1和word2中取首字符添加到merge字符串中,使得merge字符串字典序最大比较word1和word2的首字符,谁大用谁的如果w......
  • 4.面向对象编程(上)
    学习面向对象内容的三条主线Java类及类的成员面向对象的三大特征其它关键字一、面向过程与面向对象面向过程(POP)与面向对象(OOP)面向过程,强调的是功能行为,以函数为最小......
  • 5.面向对象编程(中)
    一、面向对象特征之二:继承性(inheritance)为什么要有继承?多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类......