我是靠谱客的博主 感性星月,最近开发中收集的这篇文章主要介绍java integer 判断相等_Java包装类之Integer的 "==" 判断数值是否相等的陷阱及原因分析...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在好久以前的一次面试中,面试官问了我这么一个问题:“现在有 Integer a = 56, b = 56, c = 180, d = 180;  请问:a == b ,c == d  是否成立,也就是是否为true?”

我当时知道 a == b 是 为true,c == d 是为false的,我也是这么回答的。接着面试官问我,“为什么呢?”

然后我就不知道了。那个的确是不是很清楚为什么会这样,不过虽然那个时候这个问题没有回答出来,但是其他问题都回答得不错,并且这是一面,到了二面的时候也回答得不错,所以最后还是拿下来了这个offer。

虽然那个时候拿到了offer,但是没有回答出这个问题,我还是挺在意的,后面我也去研究了一下。

首先我通过代码验证一下我那次面试的回答:

1 //定义两组Integer变量

2 Integer a = 56, b = 56, c = 180, d = 180;3 System.out.println("a == b:" + (a ==b));4 System.out.println("c == d:" + (c == d));

打印结果如下:

1 a == b:true

2 c == d:false

接下来我们来找一下到底为什么?

当我们按照  :

1 Integer a = 56, b = 56, c = 180, d = 180;

定义变量的时候其实就相当于:

1 Integer a = Integer.valueOf(56), b = Integer.valueOf(56), c = Integer.valueOf(180), d = Integer.valueOf(180);

我们去看 Integer.valueOf() 的源码:

1 /**

2 * Returns an {@codeInteger} instance representing the specified3 * {@codeint} value. If a new {@codeInteger} instance is not4 * required, this method should generally be used in preference to5 * the constructor {@link#Integer(int)}, as this method is likely6 * to yield significantly better space and time performance by7 * caching frequently requested values.8 *9 * This method will always cache values in the range -128 to 127,10 * inclusive, and may cache other values outside of this range.11 *12 *@parami an {@codeint} value.13 *@returnan {@codeInteger} instance representing {@codei}.14 *@since1.515 */

16 public static Integer valueOf(inti) {17 if (i >= IntegerCache.low && i <=IntegerCache.high)18 return IntegerCache.cache[i + (-IntegerCache.low)];19 return newInteger(i);20 }

有以上的源码和注释中会发现从jdk1.5开始就有了这个方法,当传入的参数"i"大于等于 IntegerCache.low 且小于等于IntegerCache.high 的时候返回 IntegerCache.cache[i + (-IntegerCache.low)],否则 new 一个Integer变量返回,顾名思义IntegerCache 应该就是Integer的缓存用的相关静态类,这个时候我们可以继续去看 IntegerCache 的源码:

1 /**

2 * Cache to support the object identity semantics of autoboxing for values between3 * -128 and 127 (inclusive) as required by JLS.4 *5 * The cache is initialized on first usage. The size of the cache6 * may be controlled by the {@code-XX:AutoBoxCacheMax=} option.7 * During VM initialization, java.lang.Integer.IntegerCache.high property8 * may be set and saved in the private system properties in the9 * sun.misc.VM class.10 */

11

12 private static classIntegerCache {13 static final int low = -128;14 static final inthigh;15 static finalInteger cache[];16

17 static{18 //high value may be configured by property

19 int h = 127;20 String integerCacheHighPropValue =

21 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");22 if (integerCacheHighPropValue != null) {23 try{24 int i =parseInt(integerCacheHighPropValue);25 i = Math.max(i, 127);26 //Maximum array size is Integer.MAX_VALUE

27 h = Math.min(i, Integer.MAX_VALUE - (-low) -1);28 } catch( NumberFormatException nfe) {29 //If the property cannot be parsed into an int, ignore it.

30 }31 }32 high =h;33

34 cache = new Integer[(high - low) + 1];35 int j =low;36 for(int k = 0; k < cache.length; k++)37 cache[k] = new Integer(j++);38

39 //range [-128, 127] must be interned (JLS7 5.1.7)

40 assert IntegerCache.high >= 127;41 }42

43 privateIntegerCache() {}44 }

有上面的源代码可以看出,在Integer里定义了一个私有的静态内部类 IntegerCache ,在其中定义了 静态Integer数组 cache ,长度为 high = 127 和 low = -128  之间的差值,并且存储的是 从 low到high,即-128到127的值。

总结:

由以上的分析我们可以知道,当我们  Integer a = 56, b = 56, c = 180, d = 180; 的时候:

1. 如果定义的变量在 -128到127之间,则是直接去缓存cache里的值,所以如果数值一致则对应的地址值也会一致,所以我们用 == 判断两个值是否相等,是返回 true的;

2. 如果定义的变量不在  -128到127之间,则通过new Integer(int i)的方式创建数值,并且每次都会重新new一个对象,这就导致每次的对象的数值即使一样但是地址值不一致,所以此时用 == 判断两个值是否相等就不如我们所愿了;

3. 所以我们遇到包装类 Integer定义的变量的时候,如果要判断两个变量的值是否相等,则使用 equals来判断,尽量不要用 == 的来判断。

最后

以上就是感性星月为你收集整理的java integer 判断相等_Java包装类之Integer的 "==" 判断数值是否相等的陷阱及原因分析...的全部内容,希望文章能够帮你解决java integer 判断相等_Java包装类之Integer的 "==" 判断数值是否相等的陷阱及原因分析...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部