java字符串equals_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类中它被改写成了比较字符串内容也就不奇怪啦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值