1. 不同数据类型中 == 的含义
基本数据类型(原始数据类型) :byte,short,char,int,long,float,double,boolean。
在这些数据类型中,当他们用(==)进行比较的时候,比较的是他们的值是否相等。
复合数据类型(类):当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)是否相同。
注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果均为false。因为每new一次,都会重新开辟堆内存空间。
2. equals()方法
(1)Java中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址。
(2)由于在一些类库中equals方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了,用来比较的是两个对象的内容是否相等,。
(3)因此,对于复合数据类型之间进行equals比较,在没有重写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被重写,按照重写的要求来。
面试题:请解释字符串比较之中“==”和equals()的区别?
==:比较的是两个字符串内存地址的数值是否相等,属于数值比较;
equals():比较的是两个字符串的内容,属于内容比较。
以后进行字符串相等判断的时候都使用equals()。
面试题:两个对象值相同(x.equals(y) == true),但却可有不同的 hash code 说法 是否正确?
不对。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:
(1)如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;
(2)如果两个对象的 hashCode 相同,它们并不一定相同。
(3)重载 hashCode()是为了对同一个 key,能得到 相同的 Hash Code(内存地址),这样 HashMap 就可以定位到我们指定的 key 上。重载 equals()是为了向 HashMap 表明当前对象和 key 上所保存的对象是相等的。
3. 举例验证
注:String str=“abc"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。
String str = “abc”; 先在内存中找是不是有"abc"这个对象,如果有,就让str指向那个"abc”.如果内存里没有"abc",就创建一个新的对象保存"abc"。
String str=new String (“abc”) 就是不管内存里是不是已经有"abc"这个对象,都新建一个对象保存"abc"。
String类中重写了equals()方法。
public class demo01 {
public static void main(String[] args) {
String a = new String("abc"); //a为一个引用
String b = new String("abc"); //b为另一个引用,对象的内容一样
String aa="abc"; //放在常量池中
String bb="abc"; //从常量池中查找
System.out.println(a==b); //false,地址不一样
System.out.println(aa==bb); //true,地址一样
System.out.println(a.equals(b)); //true,值一样
System.out.println(aa.equals(bb)); //true,值一样
System.out.println(22==22); //true
System.out.println(22==22.0); //true
}
}