java 学习记录——equals和“==”

1.object类中的equals() 和 == 一样

这是object中关于equals()方法的源码

public boolean equals(Object obj) {
    return (this == obj);
}

equals()和" == " 一样,比较变量值相不相等,但是equals()只用在比较对象, “==”比较对象和基本类型。
比较基本类型 例如 int, float,char,long,double ,就是直接比较值一不一样。
比较引用类型,其实也是比较值一不一样,只不过引用变量的值比较特殊,这个值我们知道就是指向对应对象的内存地址。简言之,就是比较两个引用类型是不是指向同一块堆内存地址

2.在String类中,equals()方法被重写过

先看Stringl类中equals()的源码

  public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

也就是说,String里的equals()是真的在比较两个引用变量指向的字符串对象,它们之间是不是每个字符都一样。实际上,很多时候都需要重写equals(),毕竟我们不是只想比较两个引用类型变量是不是指向同一块儿地址。

3. 字符串的另一种创建方式

我们知道String的创建方式有很多,例如下面两种,涉及到常量池

		String str1 = new String("str");
        String str2 = new String("str");
        System.out.println(str1.equals(str2)); //true 因为String类中重写了equals()方法,会真的比较字符串中的内容
        System.out.println((str1==str2));//false 因为引用变量 str1  和str2 指向的堆中内存地址不一样
        
        //第二种方法
        String str11 = "strrrrrrrrrrrr";
        String str22 = "strrrrrrrrrrrr";
        //当执行String str11 = “strrrrrrrrrrrr”;这条语句时,
        // 会在堆中的字符常量池里找”strrrrrrrrrrrr”这个字符串
        // 若没有找到,则将”strrrrrrrrrrrr”这个字符串放入字符串常量池中.
        // 而在栈中开辟一块名为str11的空间存放”strrrrrrrrrrrr”这块空间的引用.
        // 当执行String str22 = “strrrrrrrrrrrr”;这条语句时,
        // 会在堆中的字符串常量池里找”strrrrrrrrrrrr”这个字符串,
        // 很显然,可以找到,于是便把字符常量池里”strrrrrrrrrrrr”这个字符串的引用地址赋给s2,
        // 因此str11与str22存放的都是堆中字符常量池中的同一个”strrrrrrrrrrrr”的引用
        System.out.println(str11.equals(str22));//true
        System.out.println((str11==str22));//true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值