使用==比较的一个误区(如Integer)
来源:互联网 发布:apache kylin集群安装 编辑:程序博客网 时间:2024/06/05 14:02
使用Integer对象时,使用它==来比较值是很诱人的,因为这是您将使用的int值。在某些情况下,这似乎有效:
Integer int1_1 = Integer.valueOf("1");
Integer int1_2 = Integer.valueOf(1);
System.out.println("int1_1 == int1_2: " + (int1_1 == int1_2)); // true
System.out.println("int1_1 equals int1_2: " + int1_1.equals(int1_2)); // true
在这里我们创建了两个Integer具有值的对象,1并比较它们(在这种情况下,我们创建了一个来自一个String,一个来自一个int文字,还有其他的选择)。此外,我们观察到两种比较方法(==和equals)都产生true。
当我们选择不同的值时,这种行为会改变:
Integer int2_1 = Integer.valueOf("1000");
Integer int2_2 = Integer.valueOf(1000);
System.out.println("int2_1 == int2_2: " + (int2_1 == int2_2)); // false
System.out.println("int2_1 equals int2_2: " + int2_1.equals(int2_2)); // true
在这种情况下,只有比较equals才能得到正确的结果。
这种行为差异的原因是JVM维护Integer范围为-128到127 的对象的缓存(可以使用系统属性“java.lang.Integer.IntegerCache.high”
或JVM来覆盖上限值参数“-XX:AutoBoxCacheMax = size”)。对于此范围内的值,Integer.valueOf()将返回缓存的值,而不是创建一个新的值。
因此,在第一个示例中,Integer.valueOf(1)并且Integer.valueOf("1")调用返回相同的缓存Integer实例。相比之下
,在第二个示例中Integer.valueOf(1000),Integer.valueOf("1000")创建并返回了新Integer对象。
Integer int1_1 = Integer.valueOf("1");
Integer int1_2 = Integer.valueOf(1);
System.out.println("int1_1 == int1_2: " + (int1_1 == int1_2)); // true
System.out.println("int1_1 equals int1_2: " + int1_1.equals(int1_2)); // true
在这里我们创建了两个Integer具有值的对象,1并比较它们(在这种情况下,我们创建了一个来自一个String,一个来自一个int文字,还有其他的选择)。此外,我们观察到两种比较方法(==和equals)都产生true。
当我们选择不同的值时,这种行为会改变:
Integer int2_1 = Integer.valueOf("1000");
Integer int2_2 = Integer.valueOf(1000);
System.out.println("int2_1 == int2_2: " + (int2_1 == int2_2)); // false
System.out.println("int2_1 equals int2_2: " + int2_1.equals(int2_2)); // true
在这种情况下,只有比较equals才能得到正确的结果。
这种行为差异的原因是JVM维护Integer范围为-128到127 的对象的缓存(可以使用系统属性“java.lang.Integer.IntegerCache.high”
或JVM来覆盖上限值参数“-XX:AutoBoxCacheMax = size”)。对于此范围内的值,Integer.valueOf()将返回缓存的值,而不是创建一个新的值。
因此,在第一个示例中,Integer.valueOf(1)并且Integer.valueOf("1")调用返回相同的缓存Integer实例。相比之下
,在第二个示例中Integer.valueOf(1000),Integer.valueOf("1000")创建并返回了新Integer对象。
。第二个例子int2_1 == int2_2是false,因为引用是不同的。
0 0
- 使用==比较的一个误区(如Integer)
- Integer的 == 比较
- 两个Integer比较大小需要注意的误区
- JAVA中Long与Integer 比较的误区
- ACE_Message_Block的一个使用误区
- UIAlertController的一个使用误区
- integer ==比较
- 关于Integer的一些"=="比较
- Integer与int的==比较
- 使用 InterlockedIncrement/InterlockedDecrement 的一个误区
- Jquery TreeTable使用的一个误区
- Python中的一个误区----*的使用
- 使用 android EventBus的一个误区
- Spring事务使用的一个误区
- oracle 中使用 rownum 的一个误区
- Numpy自定义dtype的一个使用误区
- Integer之间比较相等最好不要使用==
- Integer == 的使用
- ArcGIS for js 发布geoserver发布的wms服务
- 装饰模式与代理模式的区别
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- endless sadness——GDOI2017滚粗记
- anaconda 切换python版本
- 使用==比较的一个误区(如Integer)
- C++作业5
- 欢迎使用CSDN-markdown编辑器
- 利用PCL处理Realsense点云数据-在vs2015里用PCL获取Realsense点云数据
- 【树莓派】在OpenCV中调用CSI摄像头
- Web 通信 之 长连接、长轮询(long polling)
- 廖雪峰python教程之用map函数实现大小写转换
- Implement Queue using Stacks
- 架构师知识体系(3)--互联网架构师必备技能(比你牛B的人比你还努力,你有什么资格不去奋斗)