JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池。

1.String赋值的两种方式

第一种:String str = "test";

以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象。如果存在,直接把实例池中"test"的地址返回给str;如果不存在,则会在实例池中创建"test"对象,并把该对象的地址返回给str。

public class Test {public static void main(String[] args) {String str1="test";String str2="test";System.out.println(str1==str2);}
}

执行上述代码,其输出结果为:

true

str1,str2指向的是同一地址,所以返回true

第二种:String str = new String("test");

以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象。若不存在则会在实例池中创建"test"对象,同时在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str;若实例池存在则直接在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str。

public class Test {public static void main(String[] args) {String str1=new String("test");String str2=new String("test");System.out.println(str1==str2);}
}

执行上述代码,其输出结果为:

false

这时str1和str2分别指向堆中不同的地址,所以返回false

2.String的两种比较方式

1. "=="这里的比较是针对两个String类型的变量的引用,也就是说如果两个String类型的变量,他们所引用的是同一个string对象(指向同一个内存堆),即返回true。
2. 用Object对象的equals()方法String对象继承自Object,并且对equals方法进行了重写,用此方法进行比较时,其实是对String对象封装的字符串内容进行比较,相同返回true

下面是比较的5种情况:

String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);//true
System.out.println(str1.equals(str2));//true
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true
String str1 = new String("aaa");
String str2 = "aaa";
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true
String str1 = "a"+"b"+"c";
String str2 = "abc";
System.out.println(str1 == str2);//true
System.out.println(str1.equals(str2));//true
String s = "ab";
String str1 = "abc";
String str2 = s + "c";
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true

特别需要注意的是第5个示例:因为s是变量,那么s无论是和常量还是和其他变量相+,在源码里面得到的新串,都是new出来的一个新的String,这个String是放在堆里面的。既然是new 出来的,那自然不是同一个对象。

总结:

equals比较的引用类型的话,比较的是引用类型的地址,比较字符串类型的话,比较的是内容,不能比较基本类型

==比较引用类型的话,比较的是引用类型的地址,比较基本类型的话,比较的是数值

String类的equals()与==的区别相关推荐

  1. JavaSE学习总结(八)常用类(上)Object类==与equals方法的区别浅克隆的特点Scanner类String类String两种创建对象方式的区别String类的各种功能

    JavaSE学习总结(八)常用类(上)/Object类/==与equals方法的区别/浅克隆的特点/Scanner类/String类/String两种创建对象方式的区别/String类的各种功能 常用 ...

  2. StringBuffer类和String 类的 equals 和 ==

    注意: equals(Object obj)equals方法的参数是任意对象  Object类的equals方法就是用==判断的,即判断两个对象是否为同一个对象  StringBuffer类没有重写e ...

  3. Java基础---API概述---常用类(Object类/String类)---equals和==

    API概述 API:application programming interface,应用程序编程接口 用于规定方法名称的规则集合,定义了方法的修饰符.返回值类型.方法的名称.方法的参数列表.方法的 ...

  4. JAVA基础-Object类(简单说明),String类,.equals()方法

    Object类 1.object类是所有Java类的根父类; 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性 ...

  5. 大数据技术之_31_Java 面试题_02_== 和 equals 有什么区别 + String 相关 + 多态 + 传值 + static 加载机制 + 线程

    大数据技术之_31_Java 面试题_02 1.== 和 equals 有什么区别? 2.为什么需要同时覆写 hashCode 和 equals 方法? 3.为什么用 eclipse 重写 hashC ...

  6. String类重写的equals方法

    equals方法分析 equals方法默认等同于"==",都是判断两个对象的地址是否相等,因为String类对equals方法进行了重写,所以只要内容一样,就是相等的. 例:Str ...

  7. String类及其构造器和常用方法

    String类时lang包的内置类,使用时不需要引用. 一.构造器 String():通过new方法创建字符串 String(byte[] byte):把字节数字转换为字符串 异同比较: String ...

  8. Java基础之equals和==的区别深入解析

    Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...

  9. String 类详解

    public final class String 继承自java.lang.Object类. 实现了接口: java.io.Serializable, Comparable<String> ...

最新文章

  1. Safari、IE浏览器出现允许改写地址栏的漏洞
  2. Netflix 付费用户达2亿、苹果VR眼镜、抖音电子钱包、虚幻引擎用于电影制作等|Decode the Week...
  3. python win+r时不成功_Win与R(不使用Anaconda的情况下)
  4. stl vector 函数_vector :: at()函数以及C ++ STL中的示例
  5. Windows系统下搭建Git本地代码库
  6. sdut 取数字问题(深搜,动态规划)
  7. HTML5笔记1——HTML5的发展史及标签的改变
  8. 明了 | 看了这篇文章,多年不能理解的分布式事物,终于看懂了!
  9. 所谓工作能力强,就看这5件事
  10. Java取得操作系统的临时目录
  11. linux mint 19新功能,Linux Mint 19.3将在2019年12月正式发布,附新功能简介
  12. 电子书格式问题的本质
  13. 机器视觉:远心镜头使用规则
  14. 华尔街英语核心价值观综合视频发布
  15. 学了C语言,能开发什么项目?
  16. html根据ip和mac地址,关于怎么通过IE浏览器获取客户端的IP地址和Mac地址
  17. mac电脑用计算机名共享打印机,MAC与Windows7共享打印机的设置方法
  18. 博弈美业SAAS系统,美业系统源码-主要功能
  19. CIPP翻转内衬法整体修复技术简介
  20. Android6.0 MTK 需求文档(六)

热门文章

  1. Java基础视频笔记(四):泛型
  2. Invalid byte 2 of 2-byte UTF-8 sequence解决方案
  3. PHP Lumen Laravel 解决validate方法自定义message无效的问题
  4. 【报告分享】企业出海全知道.pdf(附80页pdf下载链接)
  5. 推荐系统的公平性:用户侧与生产侧
  6. 【报告分享】2020直播电商生态白皮书.pdf(附下载链接)
  7. c++ primer练习题 第七章 类 (Class)
  8. 基于jsp的失物招领系统_基于Java web的校园失物招领系统
  9. 中国跨境进口电商跨入“万亿时代”,海外购用哪个跨境电商平台更好?
  10. 2021年Tiktok用户增长和使用模式?