多语言展示
当前在线:1605今日阅读:27今日分享:41

分析Long和String类型中的equals比较方法

最近写代码,发现一个小知识点,不注意就进坑了,原因是在比较对象的时候,没有注意其数据类型,而仅仅是看到了其字符串的值,就想当然的认为使用equals比较,Java会只比较其值,而不比较其数据类型。打开源码后才发现了equals方法是先比较其数据类型的。且看问题的发现及处理过程。
工具/原料
1

equals

2

Long、String

方法/步骤
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:①左边的对象是右边类的实例;②左边的对象是右边类的子类的实例。

推荐信息