一、Long和String类型如何做比较
String a = "101";
Long b = 101L;
System.out.println("a.equals(b):"+a.equals(b));
System.out.println("Long.parseLong(a)==b:"+(Long.parseLong(a)==b));
System.out.println("a.equals(b+\"\"):"+a.equals(b+""));
System.out.println("a.equals(b.toString()):"+a.equals(b.toString()));
发现:两者做比较的时候需要转化成同一类型做比较才可以
比较方法 | 结果 |
a.equals(b) | false |
Long.parseLong(a)==b | true |
a.equals(b+"") | true |
a.equals(b.toString()) | true |
二、Long和String类型中的equals比较原理
最近写代码,发现一个小知识点,不注意就进坑了,原因是在比较对象的时候,没有注意其数据类型,而仅仅是看到了其字符串的值,就想当然的认为使用equals比较,Java会只比较其值,而不比较其数据类型。
打开源码后才发现了equals方法是先比较其数据类型的。
1.编写测试代码,重现问题出现的过程。定义一个String字符串101,定义一个Long类型的101,然后使用equals比较两者是否相同,使用syso输出比较结果。
刚开始我想的是,这难道不是去比较值吗,还会考虑数据类型吗?^_^最后发现我错了。
从输出结果可以看出两个比较都是输出的false,说明两者确实不相等。
2.打开上面的equals方法,发现是调用的String类重写的equals方法:(有一个关键字instanceof,下面专门写个例子测试)
一:他是先看两个引用是否相同,如果相同则表示两者完全是同一个东西没什么好说的。
二:如果两者不是同一个对象,则查看anObject是不是String类的对象,如果不是,则表示两者不等。
三:如果anObject是String类的对象,则比较亮着字符串是否相同。
3.打开第二个equals方法,发现是调用的Long类重写的equals方法:
一:判断obj是否是Long类型
二:如果是:则直接比较两者的值是否相等
4.从这里就可以看出,两者肯定不同,原因就是其数据类型不同。即有一个instanceof判断,instanceof的意思就是左边的对象是否是右边类的实例。当然这里面还隐含着一种特殊的情况,即左边的对象是右边类的子类的实例,也是成立的。且看测试代码
5.测试这两种情况:①左边的对象是右边类的实例;②左边的对象是右边类的子类的实例。
(1)首先写一个类Father,再写一个类Son继承Father。
(2)编写测试类
6.查看输出结果,两个true,也就证实了我上面所说的。
instanceof操作符满足下面两种情况就是true:①左边的对象是右边类的实例;②左边的对象是右边类的子类的实例。
本文转载至:https://jingyan.baidu.com/article/5bbb5a1bd9f3b013eba179b4.html