equals和==详解

equals和==小结
1. ==简单介绍

== 比较的是两个比较对象的内存地址是否相同,当两个对象的内存地址相等时,返回 true,否则返回 false;
解释:

  • == 比较的是两端操作数(通常是对象的引用)是否是同一个对象,即在堆中是否有相同的内存地址,比较的是内存地址的
  • 基本数据类型中,比较值是否相等,如int i =10;
    double d= 10.0;
    (i==d)true
  • 两边的操作数必须是同一类型,或者父子类,否则不能通过编译
2. equals

equals 比较的是两个对象的实际内容是否相等,所有对象都适用,但是不适用于 基本类型,基本类型使用 ==!= 即可。
以下为 Object类中 的equals源码,可以发现equals方法默认返回的还是 ==的判断(即是否为同一对象),由于所有的类都继承java.lang.Object,所以使用 equals方法时,若没有重写equals方法,则equals==没有区别;

public boolean equals(Object obj) {
        return (this == obj)//注意
    }
3. String和自己创建的类

String 类型有两种初始化方法
①:String str = new String("xx");String str2 = "xxx";
这两种方法有着很大的不同,先看第一种,使用 new 来初始化 String 类,与其他普通对象没有区别,都是在堆中开辟一段内存空间,存储字符串 “xx”,str 指向此内存地址;
第二种方法,首先会在 JVM 内部发生字符串拘留,即当声明这样的一个字符串后,JVM 会在常量池中先查找有没有一个值为 “xxx” 的对象,如果有,就会把它赋给当前引用,如果没有,则在常量池中新创建一个 “xxx” 对象,当下一次还有使用这种方法初始化字符串为 “xxx”时,会直接将此字符串的引用执行之前的 “xxx” 对象,此时多个引用指向同一个对象

以下是使用 == 比较 String 对象

   @Test
   public void test1(){
       String str11 = new String("初始化字符串");
       String str12 = new String("初始化字符串");
       String str21 = "初始化字符串";
       String str22 = "初始化字符串";

       //使用 == 比较使用 new 关键字初始化的字符串对象是否为同一对象
       System.out.println(str11==str12);// false 非同一对象

       //使用 == 比较使用直接赋值初始化的字符串对象是否为同一对象
       System.out.println(str21==str22); // true 同一对象
   }

String 使用 equals 比较

public void test2(){
        String str11 = new String("初始化字符串");
        String str12 = new String("初始化字符串");
        String str21 = "初始化字符串";
        String str22 = "初始化字符串";

        //使用 equals 比较使用 new 关键字初始化的字符串对象 内容 是否相等
        System.out.println(str11.equals(str12));// true 内容相等

        //使用 equals 比较使用直接赋值初始化的字符串对象 内容 是否相等
        System.out.println(str21.equals(str22)); // true 内容相等

        //使用 equals 比较使用两种不同初始化的字符串对象 内容 是否相等
        System.out.println(str11.equals(str21));// true 内容相等
    }

因为 String 类重写了 equals 方法,所以使用 equals 比较时,比较的是实际内容是否相等,以下为 String 中重写的 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;
    }

自建一个类,但是不重写 equals 方法

class value {
        int i;
    }

    @Test
    public void test3() {
        //实例化两个自定义类对象
        value v1 = new value();
        value v2 = new value();

        //将两个对象的成员变量赋相同的初值
        v1.i = v2.i = 10;
        System.out.println(v1.equals(v2));//false
    }

因为自定义的类 value 未覆盖 Object 的 equals 方法,所以使用 equals 默认返回的是 == 的比较结果。

参考:https://www.cnblogs.com/Eason-S/p/5524837.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值