【java面试题】 == 和 equals

【java面试题】 == 和 equals

 

"=="比较的机制:== 对比的是栈中的值

基本数据类型是变量值,也就是 int i = 1;在栈中存放的是 i = 1,== 比较的也是这个数值1

引用类型是堆中内存对象的地址 ,String str = new String("hello"); 通过new在堆中开辟了空间,str指向堆中的空间的内存地址,也就是在栈中str等于堆中空间的地址,比如:0x2223,==比较的就是这个地址的值

如果是使用这种形式定义: String name = "张三"; 它是在常量池中定义了”张三“,并且在栈中的name指向的就是常量池中”张三“的地址

 

equals的比较机制:默认也是采用”==“比较,如果不重写equals,它和”==”相同,但通常会重写

在Object类的equals方法的源码中是用的“==”:

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

 

但是在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;
}

实现原理是把字符串中的每一个字符拿出来比较,如果都相等则说明这两个字符串相等

 

面试题:

public class Demo01 {
    public static void main(String[] args) {
        String name = "zhangsan";
        String name1 = new String("zhangsan");
        String name2 = name1;
        System.out.println(name == name1);
        System.out.println(name == name2);
        System.out.println(name1 == name2);
        System.out.println(name.equals(name1));
        System.out.println(name.equals(name2));
        System.out.println(name1.equals(name2));
    }
}

 

image-20220815115911133

 

name == name1 比较的是在栈中存的地址,name的地址是在堆中,name1的地址是在常量池中,所以它们不相等,但如果用equals,那么比较的就不是地址了,比较的是字符串的内容是否相等

当把name1 赋值给 name2 时,就是把name1的地址赋值给了name2,所以用 == 比较结果是true

posted @ 2022-08-15 12:03  GrowthRoad  阅读(86)  评论(0编辑  收藏  举报