Java 杂谈Java

深入探究Java中equals()和==的区别是什么

2019-05-21  本文已影响0人  4553675200ad

相等判断符"=="介绍

"=="相等判断符用于比较基本数据类型和引用类型数据. 当比较基本数据类型的时候比较的是数值, 当比较引用类型数据时比较的是引用(指针).

"=="判断基本类型是否相等.

"=="判断引用类型数据是否相等

public static void main(String[] args) {
    String s1 = "hello";    //s1指向常量池中的"hello"字符串
    String s2 = "hello";    //s2也指向常量池中的"hello"字符串
    System.out.println(s1 == s2);   //true

    String s3 = new String("hello");   //s3指向的是堆内存中的字符串对象 
    System.out.println(s1 == s3);   //false
}

判断是否相等-equals()方法介绍.

equals()和==有着本质的区别, ==可以看作是对操作系统比较数据手段的封装, 而equals()则是每个对象自带的比较方法.

看下面的例子:

public static void main(String[] args) {
    String s1 = "hello";
    String s3 = new String("hello");    
    System.out.println(s1.equals(s3));  //true
}
public boolean equals(Object anObject) {
    if (this == anObject) { //先比较两个字符串的引用是否相等(是否指向同一个对象), 是直接返回true
        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()方法?

//Object类中的equals()方法源码
public boolean equals(Object obj) {
    return (this == obj);
}

补充: 关于基本数据类型包装类的比较

由于Java中万物皆对象, 就连基本数据类型也有其对应的包装对象, 那么它们对应的比较策略是什么呢?

public static void main(String[] args) {
    int a = 3;
    Integer b = new Integer(3);
    System.out.println(b.equals(a));    //true, 自动装箱
}

//Integer类中的equals方法
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

上一篇下一篇

猜你喜欢

热点阅读