JAVA中Integer类型变量比较问题
今天在做实验的时候,发现了一个比较奇怪的问题:两个Integer型变量用==进行比较时,有时候能成功有时候不能成功。举个例子:
代码1:
Integer l1 = 122;
Integer l2 = 122;
if(l1 == l2)
System.out.println("Right");
else
System.out.println("Wrong");
运行这段代码时,程序会输出:Right。对于另一个例子:
代码2:
Integer l1 = 233;
Integer l2 = 233;
if(l1 == l2)
System.out.println("Right");
else
System.out.println("Wrong");
运行这段代码时,程序会输出Wrong。但当对代码2进行修改时:
代码3:
Integer l1 = 233;
int l2 = 233;
if(l1 == l2)
System.out.println("Right");
else
System.out.println("Wrong");
在运行这段代码时,程序会输出Right。如果换一种定义方式时:
代码4:
Integer l1 = 233;
Integer l2 = new Integer(233);
if(l1 == l2)
System.out.println("Right");
else
System.out.println("Wrong");
运行这段代码时,程序会输出Wrong。
关于这种现象,查了下资料,总结如下:
1.实际上Java中定义的Integer变量会通过Integer.valueOf()方法生成一个实例,即:
Integer l1 = 122 会被编译成 Integer l1 = Integer.valueOf(122),而关于valueOf()方法的源码:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
看一下源码就会明白,对于-128到127之间的数,会进行缓存,Integer l1 = 122时,会将122进行缓存,下次再写Integer l2 = 122时,就会直接从缓存中取,就不会new了,相当于生成的为同一个对象,。所以代码1的运行结果是Right。
而对于这个范围之外的数值,valueOf()相会重新new一个对象,所以就不相等了,所以代码2的裕兴结果就是Wrong。
2.对于代码3,Integer型变量与int型变量进行比较时,实质上是把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。此处的拆箱调用的是intValue()方法。所以代码3的运行结果是Right。
3.对于代码4,就比较好解释了,因为new相当于重新定义了一个新的对象,即l1的引用实质是指向在堆中了,而l2实质是指向在常量池中了(关于变量在内存中的位置可参考:http://www.cnblogs.com/wangkundentisy/p/6636340.html),所以两者是不可能相等的,故输出结果就是Wrong。
4.总之,要想比较两个Intger型变量的值最好用Integer.intValue()方法生成int型后再比较。
5.Integer型变量与int型变量之间可以直接比较,此时自动进行拆箱操作。
参考:
1.https://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html
2.http://blog.csdn.net/snail_rao/article/details/7639194
3.《JAVA核心技术》
JAVA中Integer类型变量比较问题的更多相关文章
- java中Integer比较需要注意的问题
java中Integer比较需要注意的问题 package com.srie.test; import java.util.HashMap; import java.util.Map; public ...
- java中Integer 和String 之间的转换
java中Integer 和String 之间的转换 将数组转换成字符串:char[] array = {'a','b','c','d','e'};String str = new String(ar ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中String类型变量的赋值问题
第一节 String类型的方法参数 运行下面这段代码,其结果是什么? package com.test; public class Example { String str = new String( ...
- Java中Integer的最大值和最小值
从JDK1.0开始,Integer中就定义了MIN_VALUE和MAX-VALUE两个常量: /** * A constant holding the minimum value an {@code ...
- 从源码看java中Integer的缓存问题
在开始详细的说明问题之前,我们先看一段代码 public static void compare1(){ Integer i1 = 127, i2 = 127, i3 = 128, i4 = 128; ...
- Java中Integer的源码学习
一.开始 public final class Integer extends Number implements Comparable<Integer> 1).由于类修饰符中有关键字 ...
- Java中Integer类的方法
java.lang 类 Integer java.lang.Object java.lang.Number java.lang.Integer 全部已实现的接口: Serializable, Comp ...
- Java中Integer和String浅谈
Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...
随机推荐
- shell常用函数封装-main.sh
#!/bin/bash #sunlight sp monitor system #created on 2018/01/07#by chao.dong#used by sp servers consi ...
- doc四则运算
import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.ut ...
- 实验吧—隐写术——WP之 奇妙的音乐
点击链接下载压缩包,解压后得到:一个图片,一个压缩包 打开图片: 看到海伦.凯勒我们都知道她是一位盲人,而下面黑色和灰色的点点应该就是盲文了,那么我们百度一下对照表 我们将图片里的盲文对照后得到; k ...
- hdu 1556 A - Color the ball 数状数组做法
#include<bits/stdc++.h> using namespace std; ; int n; int c[maxn]; int lowbit(int x) { return ...
- xenserver使用快照创建虚拟机,提示eth0 has different mac错误
这个报错的意思就是说mac地址错误 我们对比后可以发现,用快照创建的虚拟机和原虚拟机的eth0那个配置文件的 mac地址是一样的,因为mac地址具有唯一性,所以就报这个错,无法配置ip上网 解决方法很 ...
- HIDL学习笔记
一.HIDL简单介绍 HIDL是Android8.0新出的一个技能,以service和client的方式实现hal接口,目的是想使Android系统和BSP解绑,使系统升级更加方便.HIDL的使用方法 ...
- madlib 集成 hasura graphql-engine 试用
madlib 可以让我们直接在sql 中进行机器学习,集成了强大的sql 能力,以及分析能力,后边会尝试 集成graphql engine ,让功能更强大 docker 镜像准备 使用了一个别人的写好 ...
- Cocos2d-x3.0 TestCPP文件夹笔记
1.不多说,重力加速度. 2.ActionMangerTest:此Test是为了展示通过导演类来获得动作管理器ActionManager类.来控制节点动作. ①CrashTest:销毁demo,在精灵 ...
- kafka 的经典教程
一.基本概念 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语:Kafk ...
- 利用JSON将Map转换为类对象
Map类型做为一种常见的Java类型,经常在开发过程中使用,笔者最近遇到要将Map对象做为一种通用的参数变量,下传到多个业务类方法中,然后在各个业务类方法中将Map转换为指定类对象的情况.如何将Map ...