在判断两个Long型数据是否相等的时候遇到了一个奇怪的现象
不废话直接上代码
@Test
public void testLong() {
long id1 = 1285453273490309121L;
Long id2 = 1285453273490309121L;
System.out.println("id1 == id2 : " + (id1 == id2));
System.out.println("id1.equals(id2) : " + (id1.equals(id2)));
long id3 = 1285453273490309121L;
long id4 = 1285453273490309121L;
System.out.println("id3 == id4 : " + (id3 == id4));
}
运行结果
id1 == id2 : false
id1.equals(id2) : true
id3 == id4 : true
@Test
public void testInt() {
Long id1 = 128L;
Long id2 = 128L;
System.out.println("id1 == id2 : " + (id1 == id2));
System.out.println("id1.equals(id2) : " + (id1.equals(id2)));
Long id3 = 127L;
Long id4 = 127L;
System.out.println("id3 == id4 : " + (id3 == id4));
System.out.println("id3.equals(id4) : " + (id3.equals(id4)));
}
运行结果
id1 == id2 : false
id1.equals(id2) : true
id3 == id4 : true
id3.equals(id4) : true
==为啥会有这么奇怪的现象呢
原来 java 中 Long 是包装类,long是关键字
包装类比较是需要用equals的
那为什么 id3 == id4 是 true呢
看Long的源码
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);
}
原来是放入了缓冲中
结论,包装类比较使用 equals 不要使用 ==
记录下