java == & equals

一直以为 == 就是比较地址 equals 就是比较值

下面的排版有点小乱 主要写了一下几个方面:
== ( 基本数据类型(Integer), 引用数据类型)
equals (举了String Date 的栗子)

==
基本数据类型: byte,short,char,int,long,float,double,boolean
比较值 (因为基本数据类型是存放在栈里, 当两个基本数据类型的值相等时,地址也是相等的)

	int c = 227;
	int d = 227;
	System.out.println(c == d);  //true

特殊的:基本数据类型的封装型:
例如Integer:

	Integer a = new Integer(12);
	Integer b = new Integer(12);
	System.out.println(a == b);  //肯定是false 毕竟是两个对象
	Integer a1 = 127;
	Integer b1 = 127;
	System.out.println(a1 == b1);
	Integer a2 = 128;
	Integer b2 = 128;
	System.out.println(a2 == b2);
	
	// 两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false,	
	
	Integer a3 = -128;
	Integer b3 = -128;
	System.out.println(a3 == b3);
	Integer a4 = -129;
	Integer b4 = -129;
	System.out.println(a4 == b4);

这跟Integer.valueOf()的缓冲对象有关, 直接看源代码:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
// 如果 i 是在IntegerCache.low和 IntegerCache.high之间的话, 直接从缓存中取出,否则new 一个对象!!!
摘自[点击此处](https://www.polarxiong.com/archives/Java-Integer%E7%94%A8-%E6%AF%94%E8%BE%83%E6%97%B6127%E7%9B%B8%E7%AD%89128%E4%B8%8D%E7%9B%B8%E7%AD%89%E7%9A%84%E5%8E%9F%E5%9B%A0.html)
  • 引用数据类型:仅仅比较地址
class People{
	public String name;
	public String sno;
}
public class Test01 {
	public static void main(String[] args) {
		People p1 = new People();
		p1.name = "张三";
		p1.sno = "1111";
		People p2 = p1;
		System.out.println(p1 == p2);  // true
		p2.sno = "2222";
		System.out.println(p1 == p2);  // true 
		// 后来反应过来  两个地址相同的数据  所对应的值也是相等的.......
	}
}

================================================================

equals

在Object 类中equals方法:

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

所以对于一般的没有重写(覆盖)equals方法的类 在使用equals方法的时候和使用 == 的效果是一样的 即比较两个对象的地址

有一些类重写了Object类的equals 方法 例如:String、Date、Integer

String:

// 如果地址相同 返回true
// 如果类型相同  且 其值相同 返回true
    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;
    }

Date:

扫描二维码关注公众号,回复: 4126541 查看本文章
    public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }

总结:

== 比较两个对象的地址 ; 没有重写equals方法的类的对象比较效果与使用双等号相同, 如果重写了equals 方法 就按照重写的规则。

猜你喜欢

转载自blog.csdn.net/zf2015800505/article/details/84193700