Java中 "equals"和"=

2019-02-14  本文已影响19人  积木Blocks

1.前言

在Java中,需要比较对象是否相等。则需要用到“equals”和“==”。一般来说比较基础数据类型值相等用“==”,比较引用数据类型值相等用“equals”。


2.基础数据类型

数据的值直接存储在内存的栈空间,没有“引用”的概念。

基础数据类型 所占字节数 值类型
byte 1 数值型整数
boolean 1 布尔型
char 1 字符型
short 2 数值型整数
int 4 数值型整数
long 8 数值型整数
float 4 数值浮点类型
double 8 数值浮点类型

3.引用数据类型

都是Object的子类,引用对象的首地址存储在内存中的栈空间,而对象的值存储在内存的堆空间。


4."=="

示例

public class MyTest {

    public static void main(String[] args) {
        int a = 0;
        int b = 0;
        MyTest test1 = new MyTest();
        MyTest test2 = new MyTest();
        System.out.println(a == b);
        System.out.println(test1 == test2);
    }
}

运行结果


上面的结果已经很明显了,a和b比较,由于都是基本数据类型,所以比较的是值,返回为true。而test1和test2,比较的是引用地址,这里是new了2个对象,在堆上开辟了2个不同的空间,所以地址不同,返回为false。
5.equals

其实在equals的默认比较中也是比较的引用地址。除非去重写equals方法。默认都是继承Object类中的equals。

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

基础数据类型的包装类和String类都重写了equals方法,可以直接进行值比较。其他对象在不修改的情况下还是比较引用地址。

String类修改equals方法,比较每个字符是否相等。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = length();
            if (n == anotherString.length()) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

6.相关面试题

1.下面程序的运行结果?

public class MyTest {

    public static void main(String[] args) {
        String a = "123";
        String b = "123";
        String c = new String("123");
        System.out.println(a == b);
        System.out.println(a.equals(b));
        System.out.println(a == c);
        System.out.println(a.equals(c));
    }
}

运行结果


相关文献

上一篇下一篇

猜你喜欢

热点阅读