Java-String中equals()方法与“==“比较字符串的区别

本文探讨了Java中字符串比较时`==`和`equals()`方法的不同。`==`判断对象引用是否相同,而`equals()`关注内容是否相等。当字符串常量池中已有相同内容时,`==`返回true,否则false。通过实例代码解释了字符串池的工作原理,展示了不同创建方式下字符串对象的内存分布。文章适合Java初学者,有助于理解字符串对象的内存管理和比较机制。
摘要由CSDN通过智能技术生成

String

当我们对String类型进行操作时,往往都会用到equal()方法比较两个字符串的内容是否相等,那么问题来了,为什么我们能不能用"=="判断2个字符串内容是否相等呢?

实践是检验真理的唯一标准

代码

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="aaa";
		String str_01="aaa";
		System.out.println(str==str_01);
		System.out.println(str.equals(str_01));
		String str_02="bbb";
		System.out.println(str==str_02);
		System.out.println(str.equals(str_02));
		String str_03=new String("aaa");
		System.out.println(str==str_03);
		System.out.println(str.equals(str_03));
	}

结果

请添加图片描述

分析

通过上述代码,我们可以发现str= =str_01和 str= =str_03的值截然不同,前者为true 后者为false,但两者的内容都是aaa,这是为什么呢?而调用equals()方法得到的两次结果都是true,这又是为什么呢?equals()方法与==在判断字符串是否相等时,究竟有何区别?
其实,这涉及到堆栈区以及字符串池的知识。

堆栈和字符串池

请添加图片描述
当str=“aaa” 代码被执行时,str的变量名存储在栈区,在字符串池中就会开辟一个空间存储aaa字符串的地址(内容),当str_01=“aaa"该行代码被执行时,也会在字符串池中存储"aaa”,但是字符串池首先会判断当前池中是否已经存在str_01需要存储的内容(排斥),很显然,已经存在,则不会再开辟空间让str_01存储,而是直接使用之前的存储值(地址).
所以显而易见,此时 str和str_01都共同指向一个地址 ,所以str和str_01可以理解为同一个东西,因此无论用==还是调用equal方法 肯定都为true,毕竟不可能自己都不是自己吧,哈哈。
请添加图片描述
再看该图片,因为str=“bbb"代码执行时,“bbb"在字符串池中没有对应的字符串,因此新开辟一个空间存储字符串bbb。所以,很明显的可以看出,str和str_02指向了不同的地址,所以当使用”= =“判断是否相等时候,结果当然为false,毕竟一个是用玻璃杯装的水,另一个是用塑料杯装的酒,材料都不一样,怎么可能相等。当然equals()方法也为false,毕竟一个装水,另一个装酒,总不能说酒是水吧。
请添加图片描述
str_03=new String(“aaa”)改行代码的执行过程其实分为两步,第一步会先在字符串池中存储"aaa”(蓝色部分),当然也遵循之前讲的规律,因为已存在,所以不再开辟空间存储。第二步:因为使用了new关键字,依次最后会在堆区开辟一个空间存储字符串"aaa”,从而str_03指向堆区,很明显str和str_03指向了不同地址,因此“= =”的结果肯定为false,那equlas()是true还是false呢?当然为true,因为它只需要管str和str_03中装的是什么东西,不管他们是由什么制作的。

创建了几个字符串对象?

对于创建了几个字符串对象,最简单的方法就是我们只需要看字符串池和堆中有几个字符串即可,例如下面图中则有3个字符串对象

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="aaa";
		String str_01=new String("bbb");
		System.out.println(str==str_01);
		System.out.println(str.equals(str_01))
	}

请添加图片描述
初学String类,若有错误,还望谅解并给予指出,谢谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值