一、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,说明两者确实不相等。

StringTemplate大于小于 string比较大小原理_System

2.打开上面的equals方法,发现是调用的String类重写的equals方法:(有一个关键字instanceof,下面专门写个例子测试)

一:他是先看两个引用是否相同,如果相同则表示两者完全是同一个东西没什么好说的。

二:如果两者不是同一个对象,则查看anObject是不是String类的对象,如果不是,则表示两者不等。

三:如果anObject是String类的对象,则比较亮着字符串是否相同。

StringTemplate大于小于 string比较大小原理_StringTemplate大于小于_02

3.打开第二个equals方法,发现是调用的Long类重写的equals方法:

一:判断obj是否是Long类型

二:如果是:则直接比较两者的值是否相等

StringTemplate大于小于 string比较大小原理_数据类型_03

4.从这里就可以看出,两者肯定不同,原因就是其数据类型不同。即有一个instanceof判断,instanceof的意思就是左边的对象是否是右边类的实例。当然这里面还隐含着一种特殊的情况,即左边的对象是右边类的子类的实例,也是成立的。且看测试代码

StringTemplate大于小于 string比较大小原理_StringTemplate大于小于_04

5.测试这两种情况:①左边的对象是右边类的实例;②左边的对象是右边类的子类的实例。

(1)首先写一个类Father,再写一个类Son继承Father。

(2)编写测试类

StringTemplate大于小于 string比较大小原理_equals_05

6.查看输出结果,两个true,也就证实了我上面所说的。

instanceof操作符满足下面两种情况就是true:①左边的对象是右边类的实例;②左边的对象是右边类的子类的实例。

StringTemplate大于小于 string比较大小原理_System_06