Android面试题详解之使用equals和==进行比较的区别

使用equals和==进行比较的区别

这道题想考察什么?

在开发中当需要对引用类型和基本数据类型比较时应该怎么做,为什么有区别。

考察的知识点

equals 的实现以及栈和堆的内存管理。

考生应该如何回答

==

对于不同的数据类型,使用==进行比较的意义不同:

  • 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。用==,比较的是他们的值;
  • 引用数据类型:用(==)进行比较的时候,比较的是地址。

对于引用类型,除非是同一个new出来的对象,他们的比较的结果为true,否则为false。因为每new一次,都会重新开辟堆内存空间,哪怕他们的值一致,但是也是在不同的地址存放。所以对于引用类型的值比较应该使用equals方法。

equals()方法介绍

equals 方法是 Object 中定义的一个方法,源码如下:

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

可以看到实际上就是用的 == 实现的,所以这个原始方法意义不大,一般在类中做比较的时候,都会重写这个方法,如String、Integer、Date等。

//Integer
public boolean equals(Object obj) {
    
    
	if (obj instanceof Integer) {
    
    
        //比较Integer中包装的int值
		return value == ((Integer)obj).intValue();
	}
	return false;
}
//String
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;
}

String的比较

public class StringDemo {
    
    
    public static void main(String args[]) {
    
    
        String str1 = "Hello";
        String str2 = new String("Hello");
        String str3 = str2; // 引用传递
        System.out.println(str1 == str2); // false
        System.out.println(str1 == str3); // false
        System.out.println(str2 == str3); // true
        System.out.println(str1.equals(str2)); // true
        System.out.println(str1.equals(str3)); // true
        System.out.println(str2.equals(str3)); // true
    }
}

栈和堆的内存分析图:

在这里插入图片描述

由此可见,equals 是比较字符串的内容是否一样,== 是比较字符串的堆内存地址是否一样。

结论

equals和==的区别,需要分情况讨论:

  1. 没有重写 equals ,则 equals 和 == 是一样的。
  2. 如果重写了 equals,则需看 equals 的方法实现。以 String 类为例:
    1. equals 是比较字符串的内容是否一样;
    2. == 是比较字符串的堆内存地址是否一样,或者说引用的值是否相等。

2.6 String s = new String(“xxx”);创建了几个String对象?

这道题想考察什么?

在开发中常用的字符串String

考察的知识点

Java基础,JVM常量池与对象内存分配

考生应该如何回答

首先代码String s = new String("xxx")中包含关键字new, 我们都知道此关键字是创建类的实例对象。JVM在运行期执行new指令因此这会在堆中创建一个String对象。

其次,在String的构造方法中传递了"xxx"字符串,此处的"xxx"是一个字符串常量。JVM会首先从字符串常量池中尝试获取其对应的引用。如果不存在,则会在堆中创建"xxx"的字符串对象,并将其引用保存到字符串常量池然后返回。

因此,如果xxx这个字符串常量不存在,则创建两个String对象;而如果存在则只会创建一个String对象。

更多面试题详解可以扫描二维码免费领取!

猜你喜欢

转载自blog.csdn.net/Misdirection_XG/article/details/131064802