java面试之equals和==有什么区别

equals和==有什么区别?

   equals和==有什么区别是面试中经常被问的问题,也是必须要掌握的基础知识,基础知识没有掌握,很难通过面试拿到理想的offer,今天让我们来一起学习一下 equals和有什么区别吧!

基本概念

  对于基本数据类型,==比较的是他们的值。基本数据类型没有equal方法;
  对于引用数据类型,==比较的是它们的存放地址(是否是同一个对象)。equals()默认比较地址值,重写的话按照重写逻辑去比较。

这里提到提到了基本数据类型和引用数据类型
  基本数据类型我们都知道java中的基本类型为 byte、short、int、long、float、double、boolean、char。这些类型的变量比较时,其实就是值的比较,这里要用==来比较 而不能用equals。

  引用数据类型,像我们自己创建的类,还有基础类的包装类,String类等等这些类, == 比较的就是他们的地址。而equals()则是比较地址值。

  看一下源码中Object类的equals,发现是比较地址值。

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

  像经典的Integer,String类这些,其实equals方法都是被重写了。
Integer比较的时候 要用equals。Integer的equals源码如下,可以看见这里是取地址的值比较了。

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

  String比较的时候 也要用equals,String的equals源码如下,可以看见这里的逻辑,如果是String类型并且长度相同,则比较数组中的每一位

public boolean equals(Object anObject) {
    
    
		if (this == anObject) {
    
    
			return true;							//判断是否为同一对象
		}
		if (anObject instanceof String) {
    
    			//若当前传入的对象是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) {
    
                    //按照数组value中的每一位进行比较
					if (v1[i] != v2[i])                    
						return false;                      
					i++;                                   
				}                                          
				return true;                               
			}
		}
		return false;
	}
总结

  因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
  equals()不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。
  equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。
  关于值传递:无论是基本数据类型还是引用数据类型。这是因为 Java 中的所有数据类型都可以分为基本数据类型和引用数据类型,而方法调用时只会将变量的值复制一份传递给方法。值传递使得代码更加简洁、安全,并且能够提高程序的执行效率

猜你喜欢

转载自blog.csdn.net/qq_36378416/article/details/143318387