从头再学java系列之【equals方法和==的区别】及其源码分析

equals方法和"=="的区别

前言

equals()方法和“==”判断,可能在某些时候,我们难以区别开来他们的作用,所以,这里我就记录下自己的一点点学习心得。

解释

1.equals()方法比较的是两个对象的内容
2.==是比较地址的

        String a="123";
        String b="123";
        System.out.println(a.equals(b));//true
        System.out.println(a==b);//true

        String c=new String("123");
        String d=new String("123");
        System.out.println(c.equals(d));//ture
        System.out.println(c==d);//false

在这里插入图片描述
以上代码,我们看a,b。我们知道【假设知道】,字符串不是基本数据类型,所以它是一种引用数据类型,所以a.quuals(b)的结果为true,是可以理解的,但是为什么a==b的结果还是true呢?这个就涉及到字符串在内存中的存储问题了。
1.简单来讲,虽然字符串是引用类型,所以,这个a和b存储的不是字符串本身的值,而是对应内容的地址。就是a和b储存的是 “123” 字符串在内存中的地址。而我们创建字符串,jvm是不会立即去创建一个新的字符串的,它会去内存里面的堆里面找,看看有没有 “123” 这个字符串,如果有的话,那么就把字符串的地址指向给b【这个时候打印a和b,他们是相等的】。
2.再来看看c和d,他们的都是重新创建一个字符串对象【所以不会去堆内存里面寻找了】,所以,他们在内存中的地址肯定是不一样的,但是他们的内容都是 “123”,所以,这个时候, c.equals(d) 的结果是 true,但是 c ==d的结果是false就可以解释了。

源码

equals()方法的源码:

private final char value[];//String类源码中value的定义

public boolean equals(Object anObject) {
//如果两个对象的地址相等,那么就直接返回true【地址相等,内容一定相等】
        if (this == anObject) {
            return true;
        }
// instanceof 是一个方法,判断前面的对是不是后面类的对象
        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;
                //长度想等的话遍历所有字符,有一个不相等,返回false,否则返回true
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                //不相等那就返回false
                return true;
            }
        }
        return false;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值