String Integer 和 自定义类 equals 与 == 的区别详谈

==可以适用于基本数据类型比较,比较的基本类型时比较的是其值

而equals是Object类的一个方法,基本类型无法调用

==比较引用数据类型的时候,比较的是两引用是否指向同一个对象

注意:在Object类的默认equals方法,参见API可知 默认equals方法就是 "=="

即:默认equals()方法和==意义是一致的.

而相等的对象,必须有相同的哈希码(hashCode),所以在覆盖equals方法的时候,一般也要覆盖hashCode,保证对象行为的一致性.所以我们自定义的类的equals方法,如果实现了这个目标,则equals比较的是对象的内容是否全部相同

以普遍提到的String类为例,根绝源码,String的equals方法首先也是利用"=="判断两对象引用是否相同,然后判断是否是同一个类,最后判断String中的所有char是否相同(char基本类型比较使用==).

故而一般可以说,

比较对象引用时,==比较的是两对象引用是否指向同一个对象,即指向的对象地址是否相同

equals比较的是对象的内容,即便对象所在地址不同,也可能返回true

一般自定义类重写equals()方法的顺序 boolean equals(Object object)

    1、先this==object 判断是否指向同一个对象 是的话直接return true

    2、判断object是否为空,是的话直接返回false

    3、判断object对象是否是该类的一个对象 object instance of X (对象相等至少所属类要相等)

    4、判断对象的所有属性域是否相等(为了简便 一般使用中间变量将object强制转为类型为当前类的other对象) 依次对域使用==或者equals操作 将结果&&

下面举一些常见使用例子,以及一些需要注意的问题

基于JVM了解的不深,只能粗略谈谈String,考虑到GC,heap分为3种,新生代、旧生代即永生代。字符串String为了解决重复问题,故而存在于永生代中。故而如果我们没有使用new操作,比如String a = "abc",其并没有创建一个对象出来,在jvm内原本就有这个对象.

对于new操作新建一个对象,则必然分配了一个区域。

注:对于String,new操作可以创建一次对象,也可以创建两次对象(此时是常量池中原先没有new的String对象故而也会创建一份)---->面试有时候问到

一些String常见的==和equals

String str1 = new String("ABC");
String str2 = new String("ABC");//创建两个对象
System.out.println(str1==str2);//false 因为对象所在区域不同
System.out.println(str1=="ABC");//false 同上
String str3 =String.valueOf("ABC"); //没有创建对象  唯独String.valueOf(String)返回当前对象,其他重载都创建新的对象
System.out.println(str3=="ABC");//true 原因见上
String str4 = String.valueOf(1);//创建了新的String对象
System.out.println(str4=="1");//false 
System.out.println(str4.equals("1"));//true 内容相同(hashCode相同)
String s1 = "A", s2 = "B",s3 = "A"+"B",s4 = "AB";Strings5 = s1+"B";
System.out.println(s3==s4);// true     
System.out.println(s3==s5);// false 因为s5没有在编译的时候就被确定为"AB"

对于int和Integer 参见api  值为-128~127的Integer,如果不是new操作,获取的对象是从cache中获取的,int类型的自动装箱调用的是valueOf,如果在这个范围内,则不创建新对象,如果不在,则会new一个Integer出来.

Integer和Integer进行equals比较比较同Object的比较,比较的是对象的值

Integer==int 会对Integer拆箱 转为基本类型的==比较  比较的值

Integer.equals(int) 对int装箱 结果还是比较的值

Integer  a= Integer.valueOf(127);//同Integer a = 127; 不会创建新的对象
Integer b = 128;
Integer  c = 128;//装箱 也是调用valueOf  会创建新的对象
int d = 128;//基本数据类型
System.out.println(a.equals(127));//--->true int类型进行装箱比较的是值
System.out.println(a==127);//true 先会对a进行拆箱处理 然后转为基本类型的==比较
System.out.println("bequals(c)?"+b.equals(c));//true Integer的equals比较的值
System.out.println(b==c);//false 大于127创建的是两个对象		System.out.println(b==d);//true 和b==128一致

总结:参见源码,Integer的equals方法就是比较的值intValue

对int和Integer的比较,除了两对象之间的==比较是比较对象的存储位置,其他情况的==和equals都是比较值








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值