Java中equals和==的区别

1 简介

·equals ·方法是定义在 Object 类中的一个方法
具体可以看我的另一篇文章: Java中的equals方法

2 equals和==的区别

2.1 字符串

对于字符串来说:

  1. ==” 比较的是两个字符串在内存中的首地址
  2. equals” 比较的时候两个字符串的内容

/* Test1 */
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1.equals(s2) : " + s1.equals(s2));


Output:
s1 == s2 : true
s1.equals(s2) : true

s1 和 s2 的内容相同,都是"abc",所以 equals 的结果为 true

s1 和 s2 是两个对象,为什么 “==” 的结果也为 true 呢?
:在程序创建的时候,会创建一个字符串缓冲区,以 String s1 = "abc" 形式创建的字符串,程序会再缓冲区中寻找或创建值为 “abc” 的首地址并引用,当创建s2的时候,程序发现缓冲区中已经有相同的内容,所以 s2 直接引用这块地址,所以s1s2 引用了同一块地址,所以"=="为 true


/* Test2 */
String s1 = "abc";
String s2 = new String("abc");
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1.equals(s2) : " + s1.equals(s2));


Output:
s1 == s2 : false
s1.equals(s2) : true

在 Test2 中 “s1 == s2” 就不再为true 了,这是因为s2的声明方式为 String s2 = new String("abc"); 它的意思是请求在缓冲区中重新开辟一段内存在存放字符串 “abc” 所以它的 s1的 “abc” 虽然内容相同,但是它们的首地址不相同。


/* Test3 */
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1.equals(s2) : " + s1.equals(s2));


Output:
s1 == s2 : false
s1.equals(s2) : true

Test3 中 s1 和 s2 都是通过new 出来的字符串,结果与 Test2 一样,同理。


2.2 非字符串

对于非字符串对象来说

  1. equals 和 == 的作用相同,都是用来比较对象实例在内存中的首地址

那么有人就要问了,字符串也是对象,为什么和非字符串对象不同的?
:在一般情况下,equals方法定义在 Object 类中,所以一般类使用的是 “祖宗” 类 Object 类中的equals方法,查阅源码如下:

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

我们知道想要 equals 达到自己想要的效果,必须复写equals 方法,所以为什么 String 类的 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 方法后,很容易发现,复写的equals方法比较的是两个字符串的内容


2.3 基本类型

对于 Java 中的基本类型:

byte, short, char, int, long, float, double, boolean

1. 用 “==” 比较的是两者的值是否相同,如(其他类似):

int a = 1;
int b = 1;
System.out.println("a == b : " + (a == b));


Output:
a == b : true

需要注意的是:基本类型是没有equals方法的,如:a.equals(b) 是没有这种语法的。


2.4 包裹类型

对于Java中的包裹类型:

Boolean, Character, Byte, Shot, Integer, Long, Float, Double

1. “==” 是来比较两者的首地址是否相同
2. “equals” 是比较两者的内容是否相同

Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println("a == b : " + (a == b));
System.out.println("a.equals(b) : " + a.equals(b));


Output:
a == b : false
a.equals(b) : true

3 总结

本文只是列出了一些常用数据类型的浅显的区别,在类中是否复写了equals方法,则需要自己去查阅源码,其他的具体实现方法,需要查看jdk文档或者查阅源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值