1. 首先说==和equals()方法的区别:
==号在比较基本数据类型,比如int作比较的时候比较的是值。而当去比较两个对象的时候,便成了比较两个对象的地址,在开始的时候也说Long类型是long的包装类因此当用==比较的时候便会发生错误。
equals()方法存在于Object类当中,Object是所有类的直接和间接父类,Object类当中的equals源码当中写了,当没有重写equals()方法时,equals()和==的效果是一样的,但是像Long这种包装类都是重写了equals()方法的。
2. 怎么去比较两个Long类型的数据:
第一种方法使用Long类型的longValue()方法,这个方法作用是:取到Long类型当中的值,然后我们就可以正常的用==去比较,例如:
Long a = new Long(345);
Long b = new Long(345);
System.out.println(a.longValue()==b.longValue());
第二种方法使用Long类型的equals()方法,这个方法我们可以去查看一下源码,源码如下:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
查看源码我们可以发现,Long类型的equals()方法当中,也调用longValue()方法然后再去比较大小。
因此在使用过程当中我们可以采用这两种方式去进行比较Long对象(类型)的大小。
其实一开始也解释了,Long属于对象,对于对象来讲大家都知道不能直接用==去比较。
注意:这可能是让人费解的一个地方,请看如下代码
Long i = 12L;
Long j = 12L;
System.out.println(i==j);//true
很神奇,比较i和j的时候是Long类型,然后取比较打印的结果是true,之所以会产生这种现象是因为Long类型内部有一个内部类,维护了一个cache。源码当中是这样写的:
//552行
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
//528行
private static class LongCache {
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
也就是说在-128到127的值,都放在了cache中,不会新创建对象,因此==是成立的,当超过了这个范围,便无法使用==进行判断了。
原文链接:https://blog.csdn.net/youzi749/article/details/81483439