==
比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
equal
1.在重写equal方法的时候,一定要重写hashcode方法,因为两个对象相同的话,它们的hashcode值一定相同,反之,不一定相同,
2.equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
3.在自己写的Javabean中如果要比较对象的值是否相同,就一定要重写equal和hashcode,由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的
次数。
4.String类重写了equal和hashcode。
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
从上面的代码可以看出,String a = new String(“ab”);如果常量池中没有ab这个字符串,如果不存在,则在常量池中开辟一个空间存储,在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“ab”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。而再一次String b = new String(“ab”);时,又会在对堆内存中创建一块内存,存放ab字符串,a和b指向对象中存放的内容是相同的,但是他们指向的对象的地址值不同。而String aa = “ab”;则是在常量池中创建了一块内存放字符串ab,当 再一次String bb = “ab”;时,引用会去常量池中找是否有ab这个字符串,如果有的话,bb引用就会指向这个字符串,即复制一份值的引用,此时,aa和bb指向的是同一个对象,当bb没有在常量池中找到ab这个字符串时,则会在常量池中创建一块区域存放ab字符串。