String 中的 equals() 和 ==

https://blog.csdn.net/ZLK1142/article/details/86094325

  1. 为什么两个值相等的普通对象使用equals()比较,返回的是false,而两个String对象使用equals() 比较,返回的却是
    true ?

    原因是两个普通对象所使用的equals()是超类(Object类)中的方法, 而String对象使用的是它自己的equals()方法,在String类的底层重写了超类(Object类)的equals() 和 hashCode()
    方法。

  2. 从 String 类中的 equals() 方法可看出,String类的equals() 方法比 Object 类的equals()方法多了一个值判断;

  • 在 String 类中,equals()方法只要两个String
    引用指向同一个对象,或两个String对象的值是一样的,即返回true;

  • 在 Object 类中,equals()
    方法只能是两个引用指向同一个对象,才返回true,没有对值进行比较;

    3.== (双等号)

  • 对于基本数据类型,== 号比较的是值;

  • 对于引用类型, == 号比较的是两个对象的地址值是否一样,即两个引用指向的是否是同一个对象

public void run1() {
    String str1 = "a" + "b" + "c" + 1 + 2 + 3;
    String str2 = "abc123";
    String str3 = new String("abc123");

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

String str1 = “a” + “b” + “c” + 1 + 2 + 3; 由于"a" + “b” + “c” + 1 + 2 + 3 都 是常量值,所以在编译阶段会被编译成str2 = “abc123”; 如果在常量池中没有该字符串,JVM会将其字符串放入常量池;

再到 str2 = “abc123” 时,由于常量池中已有该字符串,所以不会再生成新的字符串,str2 指向的就是常量池中的那个 “abc123”, 所以 str1 == str2 返回 true;
str3 使用 new 来创建字符串对象,JVM 会在堆中开辟一块内存来存放该字符串对象,所以 str3 存放的是堆中的该对象地址,而不是常量池中的(abc123)字符串。str2 指向的是常量池中的字符串,str3 指向的是堆中的对象,所以str2 == str3 返回 false。

String 类重写了equals() 方法,只要两个String 引用指向同一个对象,或两个String对象的值是一样的,即返回true,str2 和 str3 中的值是一样的,所以str2.equals(str3) 返回 true;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值