Integer 大小比较遇到过的坑
来源:互联网 发布:学规范知礼仪的手抄报 编辑:程序博客网 时间:2024/05/21 17:07
今天帮人解答了一个Integer 比较的问题,发现坑很多,总结一下遇到过的坑,没什么技术含量,只是为了记录一下,避免入坑。
先看如下几个例子,心里想一下比较结果,我会在下面分别解析公布答案。
int a1 = 10; Integer b1 = new Integer(10); System.out.println(a1== b1); //Line 15 Integer a2 = 127; Integer b2 = 127; System.out.println(a2==b2); //Line 19 Integer a3 = 128; Integer b3 = 128; System.out.println(a3 == b3); //Line 23 Integer a4 = new Integer(10); Integer b4 = new Integer(10); System.out.println(a4==b4); //Line 27
解析
Line 15 输出true
这里从结果上看应该是b1隐式类型转换为int了,所以比较结果就是ture,可以看一下byteCode分析:
LINENUMBER 15 L1GETSTATIC java/lang/System.out : Ljava/io/PrintStream;BIPUSH 10ALOAD 1INVOKEVIRTUAL java/lang/Integer.intValue ()IIF_ICMPNE L2ICONST_1GOTO L3
可以看到,第15行其实是b1.intValue()
然后在做了比较。
Line 19 输出true
这是因为Integer对小整数做了缓存,也就是说其实a2,b2指向了Integer的缓存,并不是比较的内存地址,详见java.lang.Integer.IntegerCache
.
代码如下:
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {}}
Line 23 输出False
在Line 19
的例子中其实已经有解释了,IntegerCache的范围是-128~127所以128就没有缓存了,a3,b3是实例化出来后赋值的,所以比较的就是两个变量的内存地址。
Line 27 输出false
这个没有什么争议,如果这个你都能答错,建议重新补充一下基础。其实这个是跟Line 23
一样的,而且这个写的更名想,实例化两个Integer,直接比较的话就是比较的是两个内存地址,他们hashCode也是不同的,比较他们的值,需要用a4.equal(b4)
来比较
最后
- 可以思考一下如下代码,这个后面有空可以一起讨论一下
String a5 = "10";String b5 = "10";String c5 = new String("10");System.out.println(a5 == b5); //trueSystem.out.println(a5 == c5); //false
关于我
- @Author:Zemo
- @Email:zemochen#126.com
- J2EE 两年多研发经验,日常公司打杂,处于迷茫期
- 欢迎转载,让更多的人学到东西
0 0
- Integer 大小比较遇到过的坑
- Integer大小的比较
- Integer大小的比较
- Integer的大小比较
- 面试也常遇到的关于Integer大小比较的问题
- Integer大小比较的一些事
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- 关于Integer大小比较的问题
- Integer和int的比较大小
- 踩坑-Integer类型的整数比较大小
- Integer Long大小比较
- Integer比较大小问题
- 使用TextInputLayout创建一个登陆界面(转自google官网)
- HDU-2680choose the best route(万能起点)
- js实现日期差值计算
- App热补丁动态修复技术介绍
- jsp页面利用 fmt 标签进行时间 的转换
- Integer 大小比较遇到过的坑
- Shadowsocks Python版一键安装脚本
- SQL语句练习题
- 进程中的地址是从何而来
- 事件处理机制之Handler消息传递机制浅析
- VAGRANT命令(一)
- Activity启动另一个Activity,带结果的返回
- JavaScript对象复制、扩展(改变原对象的引用,避免原对象被动态的改变值);
- 关于SAP系统变量