关于 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 ...
随机推荐
- OS X Yosemite Beta体验
自从看到Yosemite泄露图的那天起,就暗暗下决心,一定要坚守Mavericks阵营,坚决不升级,觉得新版系统界面简直其丑无比,结果过了没多久,就按耐不住了,在Windows下的虚拟机里面看了看,发 ...
- office2016与visio2016不能“并存”的问题分析
现象: 先安装了office2016专业增强版,再安装visio2016时出现提示 搜集了相关资料,可以通俗的理解为:已经安装了离线客户端版的office后,不能再安装在线版visio. 之后,将of ...
- [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7
一.缘由: 某天看到主从复制延时的告警有点频繁,就想着是不是彻底可以解决一下. 一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) ----->IO Thread (从) - ...
- 浅谈C语言变量声明的解析
C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...
- linux下解压大于4G文件提示error: Zip file too big错误的解决办法
error: Zip file too big (greater than 4294959102 bytes)错误解决办法.zip文件夹大于4GB,在centos下无法正常unzip,需要使用第三方工 ...
- Ubuntu14.04安装搜狗拼音输入法
删除ibus输入法 sudo apt-get purge ibus sudo apt-get autoremove 安装fcitx和拼音输入法 sudo apt-get install fcitx f ...
- Career path of Bioinformatics
Core services: Reward bioinformaticians http://www.nature.com/news/core-services-reward-bioinformati ...
- webapp之meta
meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...
- 问题解决_(转载)在VisualStudio 2012上使用MVC3出现错误的解决办法
错误: 找 不到方 法:“System.Collections.Generic.Dictionary`2<System.String,BlockParser> System.Web.Raz ...
- Codeforces Round #232 (Div. 2) D. On Sum of Fractions
D. On Sum of Fractions Let's assume that v(n) is the largest prime number, that does not exceed n; u ...