equals 与 == 的区别:
在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。
一、 简单认识equals与==的区别
String a = "hello";
//字面量,隐式创建对象,由JAVA虚拟机隐含创建的。数据 hello 存储在堆中的串池 (String table);
String b = new String("hello");
//在栈中创建一个变量b,也会在堆中创建一个String对象,b中得到的是 地址值;
System.out.print(b.equals(a));
//result ==> ture
System.out.print(b == a);
//result ==> flase
//当然如果再定义一个
String c = "hello";
//先在 堆中的 串池(String table)中寻找是否已经有指向这个内容的地址了,没有就创建,有就直接复用 复用能节约内存;
System.out.print(c==a);
result ==> ture
String a ; //只是在栈中创建了一个 String 类的对象引用变量 a;
String b = new String("hello") ;
//不仅在栈中创建了一个String类的对象引用变量 b,同时在堆中开辟了一个新空间存放新建的String 对象 "hello",变量 b 指向堆中新建的 String 对象 "hello";
//使用运算符==,它们的地址是不一样的。对象进行 new 操作后,系统都为我们开辟了堆区空间,虽然值一样,但地址不一样。
二、hashcode和equals的介绍
1.hashCode介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。
这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
2.equals介绍
equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,等价于“==”。
同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。
简单认识二者之间的区别:
equals和hashCode方法主要的区别在于:性能,可靠性;
equals方法:因为hashCode并不是完全可靠的,有时候不同的对象生成的hashCode也可能一样(生成hashCode值的公式可能存在问题),所以hashCode并不是完全可靠的,只能通过equals保证两个对象确实相等。
hashCode方法:因为重写equals方法比较复杂,调用equals方法比较对象是否相等的效率比较低,而利用hashCode进行对比,只需要生成一个hash值进行比较就可以,效率较高。