==与equals()的区别
==
= =是直接比较两个对象的堆地址,如果相等,那么这两个引用实际上指向同一个对象的地址。
= = 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
对于基本数据类型(byte、short、char、int、float、double、long、boolean)他们是作为常量在方法区中的常量池以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过= = 来直接比较的。
另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种都是实现了常量池的,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。
Integer a=127; Integer b=127; System.out.println(a=b); Integer c=128; Integer d=128; System.out.println(c=d);
结果是true,false。
因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。
equals
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
在Object类中定义的equals方法
public boolean equals(Object obj) { return (this == obj); }
在Object类型的equals方法是直接通过= =来比较的
那么为什么又要说equlas和= =的区别呢?是因为equals方法是可以由我们自己重写的。