`
ihyperwin
  • 浏览: 425946 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Long == 操作符 的陷阱

阅读更多

当两个对象进行比较的时候,我们应该使用equals方法,但是由于基础类型在1.5以前的jdk,大家已经习惯了 == 的方式,所以有时候,会马虎大意依然使用 ==  进行比较,那么这样会有什么问题吗?结果是什么?

1
2
3
4
5
6
7
8
9
10
11
Long a2 = 127L;
Long b2 = 127L;
System.out.println(a2 == b2);
 
结果是true,竟然是true???
 
Long a3 = 128L;
Long b3 = 128L;
System.out.println(a3==b3);
 
结果是false

这样结果的原因是Long类型内部有一个内部类,维护了一个cache,

见Long源码 552行

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);
}

见Long源码 528行

1
2
3
4
5
6
7
8
9
10
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里,不会创建新的对象,所以==比较的时候,结果是正确的,

当超过这个范围,因为是创建的新对象,所以自然不会相等

分享到:
评论

相关推荐

    控制光驱的自动运行功能(VB6.0源代码编写)Const REG_DWORD As Long = 4

    控制光驱的自动运行功能(VB6.0源代码编写)Const REG_DWORD As Long = 4 Const HKEY_LOCAL_MACHINE = &H80000002 Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias _ "RegSetValueExA" (ByVal hKey...

    java操作符

    表达式中有一个操作元是long型,则结果是long型的问题总结; 应该调用String的equals()方法,而不用“==”操作符的注意; java虚拟机对变量初始化为默认值。

    Java基础知识之数据类型和操作符

    Java支持多种类型的操作符,包括算术操作符(如+、-、*、/)、比较操作符(如==、!=、&gt;、&lt;)、逻辑操作符(如&&、||、!)和赋值操作符(如=)。此外,Java还提供了一些特殊的操作符,如三元操作符(? :)和位操作符...

    [API] 透明提示框

    Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" _ (pcWndClassEx As WNDCLASSEX) As Integer Declare ...

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

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

    VB程序如何检测到U盘的插拔

    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ...

    我的第一次java面试题

    五个有关java程序员的面试题 二分法、实现连接池功能、SQL语句、js考题、单子模式

    Jsoncpp支持longlong

    c++的Json支持源码,支持longlong、int、double等基础类型。

    java面试题

    long l=oxfff; C. float f=0.23; D. double d=0.7E-3; 3、将 Olympiad.java 编译好在命令行运行如下:java Olympiad One World One Dream 那么在 Olympiad 类的main方法里面,参数args[2]的值是多少? ( ) A....

    java中long类型转换为int类型-java long转int.pdf

    long转int 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一、强制类型转换 [java] long ll = ...

    断开网络 断开网络 VB源代码

    dwSize As Long hRasConn As Long szEntryName(256) As Byte szDeviceType(16) As Byte szDeviceName(129) As Byte 'extra byte added for alignment in VB5 End Type Private Type RASCONNSTATUS 'version ...

    C++ 读取bmp图片示例程序

    //位图宽,单位为象素LONG=long(有符号) long bmpHeight;//位图高,单位为象素LONG=long(有符号) unsigned short BitCount;//每个象素所占用的比特位WORD=unsigned short long BytesPerLine;//位图每行数据...

    单片机问答long 单片机问答long 单片机问答long

    单片机问答long 单片机问答long 单片机问答long

    实现平滑实时图片旋转及透明缩放等

    Private Declare Function rotatedc Lib "rotate.dll" Alias "rotatedc@60" (ByVal aHDC As Long, ByVal Angle As Single, ByVal X As Long, ByVal Y As Long, ByVal W As Long, ByVal H As Long, ByVal PicDC As ...

    long型转换为int型-kaic

    long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 long型转换为int型 ...

    List<Long>转一维数组 Long[](csdn)————程序.pdf

    List<Long>转一维数组 Long[](csdn)————程序

    ORA-01461 仅可以为插入 LONG 列的 LONG 值赋值”解决办法

    “ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”

    VB SQL 摄像头照相模块源代码

    ByVal nID As Long) As Long Private Const WS_CHILD = &H40000000 Private Const WS_VISIBLE = &H10000000 Private Const WM_USER = &H400 Private Const WM_CAP_START = &H400 Private Const WM_CAP_EDIT_COPY =...

    oracle文本导入导出工具-ozoradts

    long = 最大长字段长度,8192-65534 (默认8192) feedback = 每 x 行显示处理进度 (默认500000) Import采用直接路径方式,等同于sqlldr的Direct方式导入(DIRECT=TRUE),nolog参数等同于sqldr的UNRECOVERABLE参数 ...

    解决时间戳long转换int溢出(即转换值为负数) long转int

    long转int 踩坑系列《十三》解决时间戳long转换int溢出(即转换值为负数)

Global site tag (gtag.js) - Google Analytics