在Object类中实现的equals()方法是与 == 等价的,都是比较的地址;
当没有重写equals()方法时,默认调用的就是Object类中的equals()方法;
在这里我们说一下
== 和重写后的equals()的不同之处:
“==”:
- 在比较基本数据类型的时候,比较的就是两个数的值是否相等
- 但是在比较引用类型时候,比较的是两个引用类型的对象的地址是否相等
equals():
- 重写后的equals()方法比较的是内容是否相等
Integer中的==和equals():
Integer是一个包装类,包装类是基本数据类型与引用类型之间的桥梁;
Integer初始化有两种方式,一种是显式装箱(调用构造方法)例如:Integer num = new Integer(55);一种是自动装箱(底层调用java.Integer.valueOf()方法)例如:Integer num = 55;自动装箱的这种方式在存储是会有一个存储的栈,在-128~12之间的数在存储时,先会在这个栈中查询有没有该数,有的话,直接拿来用而不会再存储一遍,没有的时候才会存储到栈里(Interger对象是在IntegerCache.cache产生,会复用已有的对象),超过那个范围的数在存储时会存储到堆上,new一个对象出来。
==:
当**Intager类与基本数据类型相比较**的时候:
包装类会自动拆箱为基本数据类型,再与基本数据类型进行比较;
当**Integer与Integer相比较**时:
在-128~127之间的数比较时,比较的就是数值,因为它们相同数的地址都是相同的,二在这个范围之外的数进行比较的时候,比较的就是地址了,这时候的地址是new在堆上的对象地址的比较;
equals():
比较的是内容是否相同,即只比较数字是否相同;
例如:
public class Text {
public static void main(String[] args) {
Integer a = 127;
Integer b =127;
Integer e = 128;
Integer e2 = 128;
Integer a1 = new Integer(127);
Integer a3 = new Integer(127);
int c = 127;
int d =127;
System.out.println(a == b);//true
System.out.println(a == c);//true
System.out.println(a == a1);//false
System.out.println(a1 == a3);//false
System.out.println(e == e2);//false
System.out.println(a.equals(a1));//true
System.out.println(c == d);//true
}
}
String类中的== 和equals():
String类在设计的时候采用了共享的设计模式,即JVM底层会自动维护一个字符串对象池,如果采用直接赋值的方式进行String类的实例化时,这时候的字符串内容将保存在这个对象池中,如果下次依然使用直接赋值的模式,会先在对象池中查找,如果有的话就直接进行引用,没有的话,会将新的字符串保存在对象池中供以后使用;而如果采用构造方法实例化的时候,这时候的字符串会保存在堆上,不会入池,除非人为的将它入池;
== 方法比较的是对象的地址,常量池中的字符串可以用该方法直接比较;
equals()方法比较的是字符串的内容;
例如:
public class Text {
public static void main(String[] args) {
String a = "hello";
String a1 = "hello";
String b = new String("hello");
String b2 = new String("hello");
String c = "hi";
System.out.println(a==a1);//true
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
System.out.println(b==b2);//false
System.out.println(b.equals(b2));//true
System.out.println(a==c);//false
System.out.println(a.equals(c));//false
}
}