`
CSunDNan
  • 浏览: 6593 次
  • 来自: 杭州
社区版块
存档分类
最新评论

“比较”有意思

阅读更多

 

  • 你来猜?

Integer i = 127;

Integer j = 127;

 

i == j 答案是true还是false呢?如果是128呢?

昨晚在书上看到这么一个问题,感觉很有意思,呵呵。书上没有答案,我默算肯定两者都是true,后来跑了一下代码,奇迹出现了,还果然出了我的料。前者竟然是true,而后者是false。心理不踏实,便探个究竟。直接javap –verbose TestEqual这个类,发现对应的jvm指令基本上一致。没发现啥特殊之处,我想两者区别不应该体现在指令层面。虽然如此,但我发现有这个一个地方:

 

即,127被赋值给变量i或者j的时候,装箱成为了Integer,从上图中很容易看出调用Integer.valueOf(int)这个方法,返回值为Integer。所以我从这里展开追踪,哈哈。有了:

 

 

其中:IntegerCache.low = -128

  1. 注意到这里有个范围的控制,似乎是在这个范围中的数字,直接从缓存(Integer.cache)中取,而在范围之外的采用new的方式。关于new的方式我们都知道,会有一个新地址的出现。
  2. 从上面断言assert IntegerCache.high >= 127;强制要求high的下界为127,同时这个数值也是缓存的上界

现在继续,来看这个缓存的设置:

 

 

在缓存初次被使用的时候,就会被初始化了,如果没有通过设置属性来控制最大数值默认最大的数值为127。所以jvm为了性能的目的,将-128127 Integer数值缓存起来了。i == j,只要是属于这个区间的肯定返回true,因为虽然==比较的是地址( ),但他们确实是同一个地址。呵呵。所以我们最初问题的答案到这里便揭晓了,呵呵。

  • 不妨多想一下,看看ByteShortLongFloatDouble有没有同样的缓存机制呢?

看了一下jdk源码,发现ByteShortLong采用同样的机制,唯一不同的地方就是上界128是写死的。而FloatDouble没有采用该机制。

  • 既然说可以通过配置来扩大Integer的缓存上界,那就体验一把吧。

通过这个选项皆可以扩容了,呵呵。-XX:AutoBoxCacheMax=500,于是乎我在eclipse中配置了vm参数:

 

 

 

结果出现:

俺不懂了,于是乎上网查了一下,原来这个参数适应于server模式,不适合client模式,哈哈。好吧,改为:

 

-server -XX:AutoBoxCacheMax=500

 

哈哈,大功告成了:

Integer i = 128 Integer j = 128, 相等了。

 

分享到:
评论

相关推荐

    网上看到的比较有意思的动态打字效果的菜单

    网上看到的比较有意思的动态打字效果的菜单

    一些比较有意思的Java小程序

    "一些比较有意思的Java小程序"这个标题暗示了我们将会探讨一系列趣味性强、易于理解的Java代码示例,这些示例通常适合Java初学者用来学习和实践编程概念。 在描述中提到的“不错的Java小程序”可能包括各种实用的小...

    SW-DOC:分享一些我写过的比较有意思的软件文档(不提供源码)

    软件文档分享一些我写过的比较有意思的软件文档(不提供源码)搜车记用户手册一个二手车信息发布网站:小伙伴们课程设计合力完成:文档:BBS_PENTA用户手册实现一个BBS基本功能网站:主力完成文档:

    将ext 和 lotus domino 库集成的nsf库程序,比较有意思,有很多值得学习的地方

    将ext 和 lotus domino 库集成的nsf库程序,比较有意思,有很多值得学习的地方.希望对大家有用。

    带提示文字的列表框.rar_文字提示框_比较有意思的提

    在编程领域,尤其是在GUI(图形用户界面)设计中,为用户提供友好的交互体验至关重要。"带提示文字的列表框.rar"这个压缩包文件显然包含了关于如何在列表框中实现文字提示功能的示例代码或教程。...

    php代码审计比较有意思的例子

    代码审计比较有意思的例子貌似是去年 ecshop支付漏洞偶然出来的一个例子,感觉不错。分享下 复制代码 代码如下:<?php$a=addslashes($_GET[‘a’]);$b=addslashes($_GET[‘b’]);print_r($a.' ’);print_r($b.'...

    HCJDemo:HCJDemo是一个旨在利用纯粹的html、CSS、JS这三个前端基础工具,通过写一些比较有意思的东西以锻炼逻辑思维并提升对前端基础工具的理解运用的项目

    HCJDemo介绍欢迎来到HCJDemoHCJDemo是一个旨在利用纯粹的html、CSS、JS这三个前端基础工具,通过写一些比较有意思的东西以锻炼逻辑思维并提升对前端基础工具的理解运用的项目。当然,笔者认为类似less这样的css...

    案例分析:一次比较有意思的故障处理

    查看中中CRS的路由表,发现中中CRS的默认路由竟是从中南学习过来的OSPF,而正常应该是从D1路由器学习过来的EBGP路由。另一种方法就是在中中CRS建立指向D1路由器的默认路由,这种...案例分析:一次比较有意思的故障处理

    Intro to ABAP-----一套挺有意思的abap教材

    ppt,全英文,图比较有意思.目录: 01. Introduction to ABAP 02. Introduction to ABAP Programming 03. Simple Output Statements 04. Data Declarations 05. Retrieving Data with Select Statements 06. ...

    favorite:收藏比较有意思的网站

    JavaScript 周刊,比较有深度,反正我是看不懂。 HTML5 周刊,关注最新动态,不错。 讲设计,用户体验,华丽效果 奇舞团的周刊,内容质量很高,比较精 综合的码农相关文章,资料很多,覆盖面广 很多 JS 有关的...

    字体设置-STHeiti-Light.ttc-Font-2023.4.20

    具体的项目为实现【词云】,即针对已有的文本(如对于小说或者其它文本等),生成“词云”,这个项目还是比较有意思的!近期完成后也会在博客中记录分享的,可以期待一下!建议结合博主专栏【Python从入门到人工智能...

    android联系人小应用

    本应用是我给一个小公司开发的一个联系人读取应用,主要实现的功能是,联系人头像联系方式的存储读取,数据的同步后台...应用中还是用了比较有意思的二级列表的技术。应用不大,但是实现的功能比较齐全。您值得拥有!

    学习资料.tar.gz(这是java学习资料)

    这是java学习资料,codepad 界面极其简单,能迅速领会中心思想,对于急着找个地方贴一下的人很...虽然有高亮比较好玩看到答案后去瞧了瞧codepaste,那家伙太像博客页面了,要是转型成贴markdown直接输出pdf还比较有意思

    很有趣的蚁群算法演示程序

    很好玩的小蚂蚁。。。。。。 ·程序运行说明: 按开始按钮,蚂蚁们开始从窝里出动了,寻找食物;他们会顺着地图爬满整个画面,直到找到食物再返回。...其中,右下角蓝色的圈圈表示食物,左上角绿色的圈圈表示窝,...

    PB实例代码

    PB,全称PowerBuilder,是Sybase公司推出的一种强大的客户端/服务器(Client/Server)关系数据库开发工具。它以其易用性、高效性和灵活性在软件开发领域占据了一席之地,尤其在企业级应用中广为使用。...

    有趣的面试题

    在IT行业中,面试是检验求职者技能和知识的重要环节,而有趣的面试题往往能反映出面试官对候选人技术深度和广度的要求。这篇博客"有趣的面试题"可能包含了各种编程、算法以及工具使用等方面的问题,旨在考察候选人的...

Global site tag (gtag.js) - Google Analytics