关于 Integer 的一个坑
其实 JDK 中有很多小坑, 我们稍微不注意, 就掉进去了, 然后调了半天 bug, 也不知道为何. 很闹心!
这里说一下, 在Integer中的一个小坑.
看一个小例子:
@Test public void testInteger(){ Integer a = 1; Integer b = 1; Integer c = 128; Integer d = 128; System.out.println(a == b); //true System.out.println(c == d); //false }
运行可以看到输出结果, 就是注释. 可以看到两个 128 尽然不相等! 闹什么呢? 逗我呢?
别着急, 先来看看执行 Integer a = 1; 之后 Integer 会做什么. 从JDK5 之后就有自动装箱和拆箱了. 给 Integer 赋值一个 int 数字, 当然会发生自动装箱, 封装成一个 Integer 对象.
怎么封装的呢? 在编译的时候, 会调用 Integer 中的 public static Integer valueOf(int i) 方法, 然而在这个方法中, 就存在一个小坑.
看一下方法体:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
IntegerCache.low: 默认的是 -128
IntegerCache.high: 这是可配置的项(-Djava.lang.Integer.IntegerCache.high=200), 默认的值是 127
在编译阶段, 如果将原始类型 int赋值给Integer, 编译时, 就会自动的调用Integer中的valueOf(int)方法(自动装箱)
也就是说:
1. 如果Integer的值在 -128与127之间, 那么这个值就会被缓存, 当你取这个值的时候, Integer类从缓存中取出来直接返回, 比较的是数字.
2. 如果Integer的值不在 -128与127之间, 那么当你取这个值得时候, Integer会为你new一个新对象出来, 这时候比较的是地址, 所以是false
扩展:
1. Boolean类型的两个值 true和false都会白cache.
2. Byte的256个值全部cache在内存中.
3. Short, Long两种类型的cache范围同Integer, 但是不同的是无法调整他们的大小, 代码中完全写死.
4. Float, Double 没有 cache, 在实际场景中 cache 需要自己做.
5. 当 Integer 与 int 类型比较时, 这时候会将Integer自动转换为int类型, 也就是通过调用 intValue()方法返回数字, 直接比较数字, 不会出现例子中的问题.
6. Integer 做 > >= < <= 比较的时候, Integer会自动拆箱, 就是比较他们的数字值.
7. switch case 为选择语句, 匹配的时候不会用 equals(), 而是直接用 "==", 而在 switch case语句中, 语法层次面 case部分是不能写 Integer 对象的, 只能是普通数字, 如果是普通的数字就会将传入的Integer自动拆箱. 所以不会出现例子中的问题.
@Test public void testSwitchCase(){ Integer i = new Integer(3); switch (i) { case 2: System.out.println("1"); break; default: break; } }
case 2: 不能写为 case i:
关于 Integer 的一个坑的更多相关文章
- 用html5的视频元素所遇到的第一个坑
html5 有一个video标签,这个是被大家所熟知的事情.按照w3c的规范,我认真的写出如下代码: <video preload="auto" controls=" ...
- 监控jvm的一个坑
监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...
- JavaScript中sort方法的一个坑(leetcode 179. Largest Number)
在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...
- PHP中逻辑运算符and/or与||/&&的一个坑
我原来以为PHP中的and和&&是一样的, 只是写法上为了可读性和美观, 事实上我错了. 这里面深藏了一个坑! 看以下代码: $bA = true; $bB = false; $b1 ...
- 困扰多日的C#调用Haskell问题竟然是Windows的一个坑
最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C# ...
- 在VS2012中GridView的一个坑
使用GridView的时候遇到了一个坑,一个增加一个选择按钮~貌似在某些情况下会出现一个是否允许选择的属性,貌似会默认为fals,然后就返回不了指定ID!坑,巨坑!但是今天居然找不到这个属性了,难道是 ...
- 【转载】linux命令行计算器bc的一个“坑”
[转载自]http://blog.chinaunix.net/uid-174325-id-3518953.html 结论:ibase,obase可以使用在不同的计算公式里,但是尽量把obase放iba ...
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- Jquery-全选和取消的一个坑
在做一个商城的购物车的时候遇到了一个坑, 购物车一般都有全选按钮, 再次点击就会全部消除, 在网上查到的答案全部都是使用attr来做的, 无一例外都不能用, 之后才知道要使用jquery的prop和r ...
随机推荐
- TinyHTTP代码核心流程
TinyHTTPd是一个超轻量型Http Server,使用C语言开发,全部代码不到600行 研究HTTP服务器,为了更好的造轮子,看了TinyHTTPd代码,对逻辑处理画个简单流程图(不含底层)
- XML编程知识点总结
DOM和SAX DOM的全称是Document Object Model,也即文档对象模型.基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合,应用程序挣是通过对这个对象模型的操作,来实 ...
- JS 继承总结
ES里面没有真正的继承,但是能通过某些手段达到继承效果,从而让一个类拥有另外一个类的方法 类 =>构造函数 继承描述某语言环境---魔兽世界 哈!其实我没玩过 魔兽世界里面 有Humen类 ...
- Angular2+typescript+webpack2(支持aot, tree shaking, lazy loading)
概述 Angular2官方推荐的应该是使用systemjs加载, 但是当我使用到它的tree shaking的时候,发现如果使用systemjs+rollup,只能打包成一个文件,然后lazy loa ...
- Json转Java Bean
//json字符串为Bean Device device = JSON.parseObject(jsonString, Device.class); //json字符串转List List<Mo ...
- 反人类的MyEclipse之-Javascript双引号自动补全
MyEclipse由于在JavaScript中按下一个双引号后会自动把后面的双引号补全.本人习惯两个双引号一起按下,那么这个时候在编辑器里就会出现三个",这样导致代码错误. 今天就因为MyE ...
- highcharts去掉右下角highchart.com和右上角的图标(三个小横杆)
去除右下角highchart.com credits: { enabled:false } 去除右上角图标 exporting: { ...
- Maven如何传递系统属性变量到TestNG
本文介绍如何传递Maven pom.xml里的系统属性参数到TestNG,文章沿用笔者一贯的风格--例子驱动. 解决什么问题 1. 用过WebDriver的都知道,当你启动Chrome或IE的时候都需 ...
- nyoj 881 小M的区间公约数
点击打开链接 首先给的范围很大,是10^9.暴力解肯定超时(单用for循环到10^9都大约要2s-3s),首先写了个程序暴力的把两个数所有的约数都打印出来,最后发现所有的公约数都是最大公约数的约数,并 ...
- Java值传递以及引用的传递、数组的传递!!
转(http://blog.csdn.net/niuniu20008/article/details/2953785) 许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递. 与其 ...