==与equals区别

1. 使用 ==

1.1 基本类型比较
int a = 1;
int b = 1;
byte c = 1;
Integer d1 = new Integer(1);
Integer d2 = new Integer(1);
System.out.println(a == b); 
//结果:true
System.out.println(a == c); 
//结果:true
System.out.println(a == d1); 
//结果:true
System.out.println(d2 == a); 
//结果:true
System.out.println(d1 == d2); 
//结果:false

java中的基本类型,包含:int、long、short、byte、char、boolean、float、
double这8种,可以使用==号判断值是否相等。

如果出现了基本类型的包装类,比如:Integer,用一个基本类型和一个包装类,
使用号也能正确判断(a == d1),返回true,因为Integer和int比较时,会自动拆
箱,这是比较值是否相等。

 但如果有两个包装类(d1 == d2),使用==号判断的结果可能是false,因为
 两个Integer比较时,比较的是它们指向的引用(即内存地址)是否相等。
Integer d3 = 1;
Integer d4 = 1;
Integer d5 = 128;
Integer d6 = 128;
System.out.println(d3 == d4); 
//结果:true
System.out.println(d5 == d6); 
//结果:false

为什么结果不一样呢
答:因为Integer有一个常量池,-128~127直接的Integer数据直接缓存进入常量池。所以1在常量池,而128不在。

new的Integer对象不适用常量池(如d1 == d2)

1.2 字符串比较
String e = "abc";
String f = "abc";
String g = new String("abc");
String h = new String("abc");
System.out.println(e == f); 
//结果:true
System.out.println(e == g); 
//结果:false
System.out.println(g == h); 
//结果:false

普通的字符串变量,使用==号判断,也能返回正确的结果。

但如果一个普通的字符串变量,跟new出来的字符串对象使用 == 号判断时,
返回false。这一点,跟之前说过的用一个基本类型和一个包装类,
使用 == 号判断的结果有区别,字符串没有自动拆箱的功能,这一点需要特别注意。

此外,两个new出来的字符串对象使用 == 号判断时,也返回false,因为
他们比较比较的两个对象的内存地址,而不是内存地址所存放的值。

总结:使用 == 号,可以非常快速判断8种基本数据类型是否相等,除此之外,还能判断两个对象的引用是否相等。

2. 使用equals方法

那怎么判断两个new对象的值是否相等呢?
答:使用equals方法。但不是直接调用,需要重写equals。

equals方法其实是Object类中的方法:只判断两个对象的引用是否相等。

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

重写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;
}

它依然会先判断两个对象引用是否相等,如果相等返回true。接下来,会把两个字符串的挨个字符进行比较,只有所有字符都相等才返回true。

String g = new String("abc");
String h = new String("abc");
System.out.println(g.equals(h)); //重写的equals方法
//结果:true

3.总结:

== 的作用:
  基本类型:比较值是否相等
  引用类型:比较内存地址值是否相等
equals 的作用:
  引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值