服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - java Long==Long有趣的现象详解

java Long==Long有趣的现象详解

2021-05-30 14:46smxknife Java教程

这篇文章主要给大家介绍了关于java Long==Long有趣的现象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

long数据类型是64位有符号的java原始数据类型。当对整数的计算结果可能超出int数据类型的范围时使用。

long数据类型范围是-9,223,372,036,854,775,808至9,223,372,036,854,775,807(-2^63至2^63-1)。

long数据类型范围内的所有整数称为long类型的整数字面量。long类型的整数常数总是以大写l或小写l结尾。

1. 描述

首先,这里应该声明一下,long等对象类型判断是否相等,采用long == long这种形式是错误的。

可以采用以下方式:

?
1
2
3
4
5
6
7
8
long left = 100l;
long right = 100l;
 
// 方法1:
system.out.println(left.doublevalue() == right.doublevalue());
 
// 方法2:
system.out.println(left.compareto(right));

输出结果:

true
0

1.1 实验1

如果你亲自操刀,动手做了以下实验,也许你会突然得到一个让你困惑的结果:

?
1
2
3
4
long left = 100l;
long right = 100l;
 
system.out.println(left == right);

输出结果:

true

没错,采用 == 竟然也能得出true,也许这时候你可能会误以为jvm在自动拆箱(我以前也是这样以为,有点小白!!!)。

1.2 实验2

那么请你再做下面这个实验:

?
1
2
3
4
5
6
7
8
9
10
11
long left = 1000l;
long right = 1000l;
 
// 方法1:
system.out.println(left.doublevalue() == right.doublevalue());
 
// 方法2:
system.out.println(left.compareto(right));
 
// 错误的方法:
system.out.println(left == right);

输出结果

true
0
false

等会,什么情况,怎么又为false?

1.3 实验3

不急,再做一个实验。

?
1
2
3
4
5
6
7
for (int i = -200; i < 200; i++) {
      long left = long.valueof(i);
      long right = long.valueof(i);
 
      system.out.println("long left = " + i + ", long right = " + i
          + ", left == right :" + (left == right));
    }

输出结果

long left = -200, long right = -200, left == right :false
long left = -199, long right = -199, left == right :false
long left = -198, long right = -198, left == right :false
long left = -197, long right = -197, left == right :false
long left = -196, long right = -196, left == right :false
long left = -195, long right = -195, left == right :false
long left = -194, long right = -194, left == right :false
long left = -193, long right = -193, left == right :false
long left = -192, long right = -192, left == right :false
long left = -191, long right = -191, left == right :false
long left = -190, long right = -190, left == right :false
long left = -189, long right = -189, left == right :false
long left = -188, long right = -188, left == right :false
long left = -187, long right = -187, left == right :false
long left = -186, long right = -186, left == right :false
long left = -185, long right = -185, left == right :false
long left = -184, long right = -184, left == right :false
long left = -183, long right = -183, left == right :false
long left = -182, long right = -182, left == right :false
long left = -181, long right = -181, left == right :false
long left = -180, long right = -180, left == right :false
long left = -179, long right = -179, left == right :false
long left = -178, long right = -178, left == right :false
long left = -177, long right = -177, left == right :false
long left = -176, long right = -176, left == right :false
long left = -175, long right = -175, left == right :false
long left = -174, long right = -174, left == right :false
long left = -173, long right = -173, left == right :false
long left = -172, long right = -172, left == right :false
long left = -171, long right = -171, left == right :false
long left = -170, long right = -170, left == right :false
long left = -169, long right = -169, left == right :false
long left = -168, long right = -168, left == right :false
long left = -167, long right = -167, left == right :false
long left = -166, long right = -166, left == right :false
long left = -165, long right = -165, left == right :false
long left = -164, long right = -164, left == right :false
long left = -163, long right = -163, left == right :false
long left = -162, long right = -162, left == right :false
long left = -161, long right = -161, left == right :false
long left = -160, long right = -160, left == right :false
long left = -159, long right = -159, left == right :false
long left = -158, long right = -158, left == right :false
long left = -157, long right = -157, left == right :false
long left = -156, long right = -156, left == right :false
long left = -155, long right = -155, left == right :false
long left = -154, long right = -154, left == right :false
long left = -153, long right = -153, left == right :false
long left = -152, long right = -152, left == right :false
long left = -151, long right = -151, left == right :false
long left = -150, long right = -150, left == right :false
long left = -149, long right = -149, left == right :false
long left = -148, long right = -148, left == right :false
long left = -147, long right = -147, left == right :false
long left = -146, long right = -146, left == right :false
long left = -145, long right = -145, left == right :false
long left = -144, long right = -144, left == right :false
long left = -143, long right = -143, left == right :false
long left = -142, long right = -142, left == right :false
long left = -141, long right = -141, left == right :false
long left = -140, long right = -140, left == right :false
long left = -139, long right = -139, left == right :false
long left = -138, long right = -138, left == right :false
long left = -137, long right = -137, left == right :false
long left = -136, long right = -136, left == right :false
long left = -135, long right = -135, left == right :false
long left = -134, long right = -134, left == right :false
long left = -133, long right = -133, left == right :false
long left = -132, long right = -132, left == right :false
long left = -131, long right = -131, left == right :false
long left = -130, long right = -130, left == right :false
long left = -129, long right = -129, left == right :false
long left = -128, long right = -128, left == right :true
long left = -127, long right = -127, left == right :true
long left = -126, long right = -126, left == right :true
long left = -125, long right = -125, left == right :true
long left = -124, long right = -124, left == right :true
long left = -123, long right = -123, left == right :true
long left = -122, long right = -122, left == right :true
long left = -121, long right = -121, left == right :true
long left = -120, long right = -120, left == right :true
long left = -119, long right = -119, left == right :true
long left = -118, long right = -118, left == right :true
long left = -117, long right = -117, left == right :true
long left = -116, long right = -116, left == right :true
long left = -115, long right = -115, left == right :true
long left = -114, long right = -114, left == right :true
long left = -113, long right = -113, left == right :true
long left = -112, long right = -112, left == right :true
long left = -111, long right = -111, left == right :true
long left = -110, long right = -110, left == right :true
long left = -109, long right = -109, left == right :true
long left = -108, long right = -108, left == right :true
long left = -107, long right = -107, left == right :true
long left = -106, long right = -106, left == right :true
long left = -105, long right = -105, left == right :true
long left = -104, long right = -104, left == right :true
long left = -103, long right = -103, left == right :true
long left = -102, long right = -102, left == right :true
long left = -101, long right = -101, left == right :true
long left = -100, long right = -100, left == right :true
long left = -99, long right = -99, left == right :true
long left = -98, long right = -98, left == right :true
long left = -97, long right = -97, left == right :true
long left = -96, long right = -96, left == right :true
long left = -95, long right = -95, left == right :true
long left = -94, long right = -94, left == right :true
long left = -93, long right = -93, left == right :true
long left = -92, long right = -92, left == right :true
long left = -91, long right = -91, left == right :true
long left = -90, long right = -90, left == right :true
long left = -89, long right = -89, left == right :true
long left = -88, long right = -88, left == right :true
long left = -87, long right = -87, left == right :true
long left = -86, long right = -86, left == right :true
long left = -85, long right = -85, left == right :true
long left = -84, long right = -84, left == right :true
long left = -83, long right = -83, left == right :true
long left = -82, long right = -82, left == right :true
long left = -81, long right = -81, left == right :true
long left = -80, long right = -80, left == right :true
long left = -79, long right = -79, left == right :true
long left = -78, long right = -78, left == right :true
long left = -77, long right = -77, left == right :true
long left = -76, long right = -76, left == right :true
long left = -75, long right = -75, left == right :true
long left = -74, long right = -74, left == right :true
long left = -73, long right = -73, left == right :true
long left = -72, long right = -72, left == right :true
long left = -71, long right = -71, left == right :true
long left = -70, long right = -70, left == right :true
long left = -69, long right = -69, left == right :true
long left = -68, long right = -68, left == right :true
long left = -67, long right = -67, left == right :true
long left = -66, long right = -66, left == right :true
long left = -65, long right = -65, left == right :true
long left = -64, long right = -64, left == right :true
long left = -63, long right = -63, left == right :true
long left = -62, long right = -62, left == right :true
long left = -61, long right = -61, left == right :true
long left = -60, long right = -60, left == right :true
long left = -59, long right = -59, left == right :true
long left = -58, long right = -58, left == right :true
long left = -57, long right = -57, left == right :true
long left = -56, long right = -56, left == right :true
long left = -55, long right = -55, left == right :true
long left = -54, long right = -54, left == right :true
long left = -53, long right = -53, left == right :true
long left = -52, long right = -52, left == right :true
long left = -51, long right = -51, left == right :true
long left = -50, long right = -50, left == right :true
long left = -49, long right = -49, left == right :true
long left = -48, long right = -48, left == right :true
long left = -47, long right = -47, left == right :true
long left = -46, long right = -46, left == right :true
long left = -45, long right = -45, left == right :true
long left = -44, long right = -44, left == right :true
long left = -43, long right = -43, left == right :true
long left = -42, long right = -42, left == right :true
long left = -41, long right = -41, left == right :true
long left = -40, long right = -40, left == right :true
long left = -39, long right = -39, left == right :true
long left = -38, long right = -38, left == right :true
long left = -37, long right = -37, left == right :true
long left = -36, long right = -36, left == right :true
long left = -35, long right = -35, left == right :true
long left = -34, long right = -34, left == right :true
long left = -33, long right = -33, left == right :true
long left = -32, long right = -32, left == right :true
long left = -31, long right = -31, left == right :true
long left = -30, long right = -30, left == right :true
long left = -29, long right = -29, left == right :true
long left = -28, long right = -28, left == right :true
long left = -27, long right = -27, left == right :true
long left = -26, long right = -26, left == right :true
long left = -25, long right = -25, left == right :true
long left = -24, long right = -24, left == right :true
long left = -23, long right = -23, left == right :true
long left = -22, long right = -22, left == right :true
long left = -21, long right = -21, left == right :true
long left = -20, long right = -20, left == right :true
long left = -19, long right = -19, left == right :true
long left = -18, long right = -18, left == right :true
long left = -17, long right = -17, left == right :true
long left = -16, long right = -16, left == right :true
long left = -15, long right = -15, left == right :true
long left = -14, long right = -14, left == right :true
long left = -13, long right = -13, left == right :true
long left = -12, long right = -12, left == right :true
long left = -11, long right = -11, left == right :true
long left = -10, long right = -10, left == right :true
long left = -9, long right = -9, left == right :true
long left = -8, long right = -8, left == right :true
long left = -7, long right = -7, left == right :true
long left = -6, long right = -6, left == right :true
long left = -5, long right = -5, left == right :true
long left = -4, long right = -4, left == right :true
long left = -3, long right = -3, left == right :true
long left = -2, long right = -2, left == right :true
long left = -1, long right = -1, left == right :true
long left = 0, long right = 0, left == right :true
long left = 1, long right = 1, left == right :true
long left = 2, long right = 2, left == right :true
long left = 3, long right = 3, left == right :true
long left = 4, long right = 4, left == right :true
long left = 5, long right = 5, left == right :true
long left = 6, long right = 6, left == right :true
long left = 7, long right = 7, left == right :true
long left = 8, long right = 8, left == right :true
long left = 9, long right = 9, left == right :true
long left = 10, long right = 10, left == right :true
long left = 11, long right = 11, left == right :true
long left = 12, long right = 12, left == right :true
long left = 13, long right = 13, left == right :true
long left = 14, long right = 14, left == right :true
long left = 15, long right = 15, left == right :true
long left = 16, long right = 16, left == right :true
long left = 17, long right = 17, left == right :true
long left = 18, long right = 18, left == right :true
long left = 19, long right = 19, left == right :true
long left = 20, long right = 20, left == right :true
long left = 21, long right = 21, left == right :true
long left = 22, long right = 22, left == right :true
long left = 23, long right = 23, left == right :true
long left = 24, long right = 24, left == right :true
long left = 25, long right = 25, left == right :true
long left = 26, long right = 26, left == right :true
long left = 27, long right = 27, left == right :true
long left = 28, long right = 28, left == right :true
long left = 29, long right = 29, left == right :true
long left = 30, long right = 30, left == right :true
long left = 31, long right = 31, left == right :true
long left = 32, long right = 32, left == right :true
long left = 33, long right = 33, left == right :true
long left = 34, long right = 34, left == right :true
long left = 35, long right = 35, left == right :true
long left = 36, long right = 36, left == right :true
long left = 37, long right = 37, left == right :true
long left = 38, long right = 38, left == right :true
long left = 39, long right = 39, left == right :true
long left = 40, long right = 40, left == right :true
long left = 41, long right = 41, left == right :true
long left = 42, long right = 42, left == right :true
long left = 43, long right = 43, left == right :true
long left = 44, long right = 44, left == right :true
long left = 45, long right = 45, left == right :true
long left = 46, long right = 46, left == right :true
long left = 47, long right = 47, left == right :true
long left = 48, long right = 48, left == right :true
long left = 49, long right = 49, left == right :true
long left = 50, long right = 50, left == right :true
long left = 51, long right = 51, left == right :true
long left = 52, long right = 52, left == right :true
long left = 53, long right = 53, left == right :true
long left = 54, long right = 54, left == right :true
long left = 55, long right = 55, left == right :true
long left = 56, long right = 56, left == right :true
long left = 57, long right = 57, left == right :true
long left = 58, long right = 58, left == right :true
long left = 59, long right = 59, left == right :true
long left = 60, long right = 60, left == right :true
long left = 61, long right = 61, left == right :true
long left = 62, long right = 62, left == right :true
long left = 63, long right = 63, left == right :true
long left = 64, long right = 64, left == right :true
long left = 65, long right = 65, left == right :true
long left = 66, long right = 66, left == right :true
long left = 67, long right = 67, left == right :true
long left = 68, long right = 68, left == right :true
long left = 69, long right = 69, left == right :true
long left = 70, long right = 70, left == right :true
long left = 71, long right = 71, left == right :true
long left = 72, long right = 72, left == right :true
long left = 73, long right = 73, left == right :true
long left = 74, long right = 74, left == right :true
long left = 75, long right = 75, left == right :true
long left = 76, long right = 76, left == right :true
long left = 77, long right = 77, left == right :true
long left = 78, long right = 78, left == right :true
long left = 79, long right = 79, left == right :true
long left = 80, long right = 80, left == right :true
long left = 81, long right = 81, left == right :true
long left = 82, long right = 82, left == right :true
long left = 83, long right = 83, left == right :true
long left = 84, long right = 84, left == right :true
long left = 85, long right = 85, left == right :true
long left = 86, long right = 86, left == right :true
long left = 87, long right = 87, left == right :true
long left = 88, long right = 88, left == right :true
long left = 89, long right = 89, left == right :true
long left = 90, long right = 90, left == right :true
long left = 91, long right = 91, left == right :true
long left = 92, long right = 92, left == right :true
long left = 93, long right = 93, left == right :true
long left = 94, long right = 94, left == right :true
long left = 95, long right = 95, left == right :true
long left = 96, long right = 96, left == right :true
long left = 97, long right = 97, left == right :true
long left = 98, long right = 98, left == right :true
long left = 99, long right = 99, left == right :true
long left = 100, long right = 100, left == right :true
long left = 101, long right = 101, left == right :true
long left = 102, long right = 102, left == right :true
long left = 103, long right = 103, left == right :true
long left = 104, long right = 104, left == right :true
long left = 105, long right = 105, left == right :true
long left = 106, long right = 106, left == right :true
long left = 107, long right = 107, left == right :true
long left = 108, long right = 108, left == right :true
long left = 109, long right = 109, left == right :true
long left = 110, long right = 110, left == right :true
long left = 111, long right = 111, left == right :true
long left = 112, long right = 112, left == right :true
long left = 113, long right = 113, left == right :true
long left = 114, long right = 114, left == right :true
long left = 115, long right = 115, left == right :true
long left = 116, long right = 116, left == right :true
long left = 117, long right = 117, left == right :true
long left = 118, long right = 118, left == right :true
long left = 119, long right = 119, left == right :true
long left = 120, long right = 120, left == right :true
long left = 121, long right = 121, left == right :true
long left = 122, long right = 122, left == right :true
long left = 123, long right = 123, left == right :true
long left = 124, long right = 124, left == right :true
long left = 125, long right = 125, left == right :true
long left = 126, long right = 126, left == right :true
long left = 127, long right = 127, left == right :true
long left = 128, long right = 128, left == right :false
long left = 129, long right = 129, left == right :false
long left = 130, long right = 130, left == right :false
long left = 131, long right = 131, left == right :false
long left = 132, long right = 132, left == right :false
long left = 133, long right = 133, left == right :false
long left = 134, long right = 134, left == right :false
long left = 135, long right = 135, left == right :false
long left = 136, long right = 136, left == right :false
long left = 137, long right = 137, left == right :false
long left = 138, long right = 138, left == right :false
long left = 139, long right = 139, left == right :false
long left = 140, long right = 140, left == right :false
long left = 141, long right = 141, left == right :false
long left = 142, long right = 142, left == right :false
long left = 143, long right = 143, left == right :false
long left = 144, long right = 144, left == right :false
long left = 145, long right = 145, left == right :false
long left = 146, long right = 146, left == right :false
long left = 147, long right = 147, left == right :false
long left = 148, long right = 148, left == right :false
long left = 149, long right = 149, left == right :false
long left = 150, long right = 150, left == right :false
long left = 151, long right = 151, left == right :false
long left = 152, long right = 152, left == right :false
long left = 153, long right = 153, left == right :false
long left = 154, long right = 154, left == right :false
long left = 155, long right = 155, left == right :false
long left = 156, long right = 156, left == right :false
long left = 157, long right = 157, left == right :false
long left = 158, long right = 158, left == right :false
long left = 159, long right = 159, left == right :false
long left = 160, long right = 160, left == right :false
long left = 161, long right = 161, left == right :false
long left = 162, long right = 162, left == right :false
long left = 163, long right = 163, left == right :false
long left = 164, long right = 164, left == right :false
long left = 165, long right = 165, left == right :false
long left = 166, long right = 166, left == right :false
long left = 167, long right = 167, left == right :false
long left = 168, long right = 168, left == right :false
long left = 169, long right = 169, left == right :false
long left = 170, long right = 170, left == right :false
long left = 171, long right = 171, left == right :false
long left = 172, long right = 172, left == right :false
long left = 173, long right = 173, left == right :false
long left = 174, long right = 174, left == right :false
long left = 175, long right = 175, left == right :false
long left = 176, long right = 176, left == right :false
long left = 177, long right = 177, left == right :false
long left = 178, long right = 178, left == right :false
long left = 179, long right = 179, left == right :false
long left = 180, long right = 180, left == right :false
long left = 181, long right = 181, left == right :false
long left = 182, long right = 182, left == right :false
long left = 183, long right = 183, left == right :false
long left = 184, long right = 184, left == right :false
long left = 185, long right = 185, left == right :false
long left = 186, long right = 186, left == right :false
long left = 187, long right = 187, left == right :false
long left = 188, long right = 188, left == right :false
long left = 189, long right = 189, left == right :false
long left = 190, long right = 190, left == right :false
long left = 191, long right = 191, left == right :false
long left = 192, long right = 192, left == right :false
long left = 193, long right = 193, left == right :false
long left = 194, long right = 194, left == right :false
long left = 195, long right = 195, left == right :false
long left = 196, long right = 196, left == right :false
long left = 197, long right = 197, left == right :false
long left = 198, long right = 198, left == right :false
long left = 199, long right = 199, left == right :false

通过这个超长的输出结果,你会发现,存在一个区间[-128, 127],在这个区间里通过 == 这种方式返回的是true ,其他返回的都是false。

2. 总结

其实,通过源码分析:

?
1
2
3
4
5
6
7
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);
  }

在128~127这些数的对象在内存中被缓存起来,在内存中提供重用,这些数获取的时候就会自动获取缓存中的数,而不是new出来的对象。

所以,这与自动打包拆包无关。

再所以…,判读long对象是否相等的时候建议不要采用 == 的形式,程序中无法绝对的判断参数值是否会在这个区间内,如果不在,那就出现让你摸不着头脑的问题。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://www.smxknife.com/2018/03/22/Long-Long有趣的现象/

延伸 · 阅读

精彩推荐