Java - == 和 equeals

in TCEHJava with 0 comment

==

1.摘自《Java编程思想》一书中的原话:

“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”
== 是比较两个变量的值,如果是基本数据类型,那么就是比较的基本数据的大小值。

举例如下

package com.back.web;

public class TestDataTypes {

    private byte byte1 = 50;
    private Byte byte2 = new Byte(byte1);
    private short short1 = 50;
    private Short short2 = new Short(short1);
    private int int1 = 50;
    private Integer int2 = new Integer(int1);
    private long long1 = 50;
    private Long long2 = new Long(long1);
    private float float1 = 50.5f;
    private Float float2 = new Float(float1);
    private double double1 = 50.55;
    private Double double2 = new Double(double1);
    private char char1 = 'A';
    private Character char2 = new Character(char1);
    /**除基本数据类型以外的类型示例**/
    private String string1 = "test";
    private String string2 = "test";
    private String string3 = new String(string1);
    private String string4 = new String(string2);

    public static void main(String[] args) {
        TestDataTypes test = new TestDataTypes();
        System.err.println(test.byte1 == test.byte2);
        System.err.println(test.short1 == test.short2);
        System.err.println(test.int1 == test.int2);
        System.err.println(test.long1 == test.long2);
        System.err.println(test.float1 == test.float2);
        System.err.println(test.double1 == test.double2);
        System.err.println(test.char1 == test.char2);

        System.err.println(test.string1 == test.string2);
        System.err.println(test.string1 == test.string3);
        System.err.println(test.string3 == test.string4);
        //以上运行结果除最后俩项外,其余全部为true。string1和string2存储的是同一个常量字符串,
        //地址也一样,因此结果为true。而string3、string4存储的是各自的引用对象地址,因而为false。
    }
}

2.比较对象

package com.back.web;

public class TestDataTypes {

    public static void main(String[] args) {
        TestDataTypes test = new TestDataTypes();
        TestDataTypes test1 = new TestDataTypes();
        System.err.println(test == test1);
        //以上运行结果为false,因为此时比较的值指的是引用对象的地址,而不像基本数据类型直接存值。 
    }
}

equeals

1.equals是Object的方法,在默认实现下其实就是==,也就是说和==是一样的。但是其子类重写后有其不同的实现。

基本数据类型还是基于 ==
如java.lang.Integer类的equals方法

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

如java.lang.Double类的equals方法

    public boolean equals(Object obj) {
        return (obj instanceof Double)
               && (doubleToLongBits(((Double)obj).value) ==
                      doubleToLongBits(value));
    }

其余基本数据类型类似。

2.特例如java.lang.String类的equals方法。取出值,再拆分成基本数据类型char,逐个进行比较。

    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;
    }
Comments are closed.