JAVA中==与equals()方法比较A
JAVA中==与equals()方法比较:
总结:
用(==)进行比较的时候, 比较的是他们在JVM中的存放地址 ,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为也是比较对象的内存地址,但在一些类库当中这个方法 被重写 了,如 String,Integer,Date 在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
例题
例题一:
TRUE FALSE TRUE
第一次String a="1234"时,会在常量池中创建一个常量1234,String b=1234时,常量池中已经有了该常量,所以直接取,a和b的地址一样,所以地址值相等
String c = newString("1234")重新new了对象,在堆内存中开辟了新的空间,所以地址值不想等,而equals方法比较的是值是否相等
拓展与总结:
在String中 == 是判断地址是否相等
关于equals这个方法,在String类中是被重写了的,可以先判断地址是否相同,再比较值是否相同
并不是所有类的equals都是比较值,例如object类的equals方法和==是一样的
注:instanceof是用来判断前后两个对象是否是一个家族中的,也就是判断是否有继承关系
例题二:
false,false,true
拓展与总结:
在Integer中,使用 == 来作比较两个对象时(和常数进行比较时,是直接比较值是否相同),需要注意的一点是:对Integer对象进行初始化赋值时,是通过调用valueOf来实现的。
而对于-128到127之间的数(最小值-128是确定了的,但是最大值127是可以通过虚拟机的配置文件来配置),Java会对其进行缓存。而超出这个范围则新建一个对象。
也就是说,如果第一次创建值时在缓存范围之内,第二次如果也是第一次相同的数,其实就是直接在缓存中取的,并没有新建对象,地址相同。
equals的源码↓