[String] string类型对象的指向问题

文章讨论了Java中String类型的对象创建和比较的问题。s1和s3指向常量池中的同一地址,而s2和s4由于使用`new`关键字,分别在堆中创建,所以它们的地址不同。使用`==`比较的是对象的内存地址,而`equals`方法比较的是内容。因此,对于内容相同的String对象,应使用`equals`进行比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string类型对象的指向问题

先创建三个String对象

public class Test02 {
  public static void main(String[] args) {
    String s1 = "abcd";
    String s2 = new String("abcd");
    String s3 = "abcd";
    String s4 = new String("abcd");
  }
}

接下来我们来做下判断

    System.out.println(s1 == s3);//true
    System.out.println(s1 == s2);//false
    System.out.println(s2 == s4);//false

那么问题来了:
为什么会出现这种情况呢?是不是大家很疑惑,没错,我最开始也很纳闷,按照我们的想法,这三个都应该为true才对呀

真相只有一个,请看下图:
在这里插入图片描述
因为引用类型==比较的是地址,s2,s4都new了一下,所以他们两哥们分别指向堆里面不同的地址;s1,s3他俩这种创建方式是指向常量池里的地址,常量池里面相同内容是同一个地址的

所以应该这样:

    System.out.println(s1.equals(s2));//true
    System.out.println(s2.equals(s4));//true

equals比较的是内容,他们内容相同,所以相等,所以这才为true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值