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中也是一种对象.我们用基本 ...
随机推荐
- lame定理求欧几里得算法的求余和赋值次数
根据lame定理,根据欧几里得算法求(a,b)的最大公因数过程如下(假设a>b):
- POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】
题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #includ ...
- 对List数组进行排序 Collections.sort(param1,param2)
@SuppressWarnings("unchecked") List<PageData> group_items_list = (List<PageData&g ...
- 给Linux服务器设置共享文件目录
通过samba软件 :yum install samba 修改配置文件:vi /etc/samba/smb.conf 添加 [WORKSPACE] comment = workspace ...
- LeetCode - Cut Off Trees for Golf Event
You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...
- Centos7使用yum安装程序软件时提示未找到安装包解决方法
查找程序软件源,以sshd为例,假设sshd安装包无法找到,那么可以通过以下方法解决 yum provides sshd 然后我们就可以安装*.X86_64的程序软件源 例如yum install o ...
- SpringJDBC——jdbcTemplate模板
一.定义 Spring框架对jdbc进行了封装,提供的一个JDBCTemplated对象简化jdbc开发. 使用步骤 1 导包spring-beans-5.0.0-RELEASE.jar,spring ...
- hiveserver 占用内存过大的问题
今天为了求解hiveserver占用内存过大的问题,特地加了hive在apache的邮件列表,讨论半天.特别说的是 里面的人确实很热情啊 ,外国人做事确实很认真,讨论帖发的时候都狠详细. 粘出一些记录 ...
- Hasura GraphQL 内部表结构
Hasura 使用pg 数据库存储引擎的元数据信息,在hdb_catalog schema 下面,是在初始化的时候生成的 对于表的管理.权限的信息存储都在这个schema下 hdb_table 这个表 ...
- 04基于python玩转人工智能最火框架之TensorFlow开发环境搭建
MOOC_VM.vdl.zip 解压之后,得到一个vdl文件.打开virtual box,新建选择类型linuxubuntu 64位. 选择继续,分配2g.使用已有的虚拟硬盘文件,点击选择我们下载的文 ...