Integer类型值相等或不等分析

http://www.cnblogs.com/zzllx/p/5778470.html

看到博客园一位博友写的面试问题,其中一题是 Integer a = 1; Integer b = 1 ; (a == b)?true :false; 当时我一看,这不是明显的true 嘛,  看到评论讨论才知道,对于Integer值比较 有范围规定   。平时都是用equals做比较判断,简单省事。没注意到这些细节。正好趁此机会好好谷歌了一下,以此做个备份。

用以下代码做测试

 1      @Test
2 public void testInteger() {
3 Integer a = -129;
4 Integer a1 = -129;
5 Integer aaa = new Integer(-129);
6
7 Integer aa = -128;
8 Integer aa1 = -128;
9
10 System.out.println("a==a1:" + (a == a1) + "--aa==aa1:" + (aa == aa1)); // a==a1:false--aa==aa1:true
11 System.out.println("aaa==a1:" + (aaa == a1)); // aaa==a1:false
12 System.out.println("a.equals(a1):" + a.equals(a1)); // a.equals(a1):true
13
14 Integer b = 128;
15 Integer b1 = 128;
16 System.out.println("b==b1:" + (b == b1)); // b==b1:false
17 System.out.println("b.equals(b1):" + b.equals(b1)); // b.equals(b1):true
18
19 Integer c = 127;
20 Integer cc = 127;
21 Integer d = 1;
22 Integer dd = 1;
23
24 System.out.println("c==cc:" + (c == cc) + "----d==dd:" + (d == dd)); // c==cc:true----d==dd:true
25 System.out.println("------------");
26
27 Integer e = 128;
28 int e1 = 128;
29 System.out.println("e == e1:" + (e == e1)); // e == e1:true
30 }

得出的结论是  Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的。  为什么会出现这个情况呢,实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。

我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。

还有一点需要注意到 是   Integer e = 128; int e1 = 128;  e == e1:true  而  Integer b = 128; Integer b1 = 128;   b==b1:false   ,e=128 已经大于127了,所以e 是一个对象(new 出来的) 为什么e = e1 是ture , 因为  int为值类型,引用类型Integer与值类型int比较显然比较的是值因为int在堆中是不开辟内存的,他在栈中的值则为他本身的值所以e==e1比较的是他们各自的value, e==e1为true

总结:Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的   , Integer  与 int 类型比较(==)比较的是值。

项目中遇到的Integer问题--转的更多相关文章

  1. [Laravel-Swagger]如何在 Laravel 项目中使用 Swagger

    如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...

  2. 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架

    一直准备写这么一篇有关 SSIS 日志系统的文章,但是发现很难一次写的很完整.因为这篇文章的内容可扩展的性太强,每多扩展一部分就意味着需要更多代码,示例和理论支撑.因此,我选择我觉得比较通用的 LOG ...

  3. Android项目中,在一个数据库里建立多张表

    一,创建一个公共的DBAdapter; 为了在整个程序运行期间调用该公共的数据库,我们定义了一个扩展自Application的CommDB类: 1,创建唯一的数据库: public class Com ...

  4. MongoDB在实际项目中的使用

    MongoDB简介 MongoDB是近些年来流行起来的NoSql的代表,和传统数据库最大的区别是支持文档型数据库. 当然,现在的一些数据库通过自定义复合类型,可变长数组等手段也可以模拟文档型数据库. ...

  5. spring3.0结合Redis在项目中的运用

    推荐一个程序员的论坛网站:http://ourcoders.com/home/ 以下内容使用到的技术有:Redis缓存.SpringMVC.Maven.项目中使用了redis缓存,目的是在业务场景中, ...

  6. 转 web项目中的web.xml元素解析

    转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45)   阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...

  7. (转)关于java和web项目中的相对路径问题

    原文:http://blog.csdn.net/yethyeth/article/details/1623283 关于java和web项目中的相对路径问题 分类: java 2007-05-23 22 ...

  8. spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象

    最近做了一个java的项目,部门领导给了一套代码让我尽快掌握,说心里话本人真心不喜欢java的这种项目方式,各种配置各种xml文件简直头都大了,下面就将我遇到的其中一个我认为是坑的地方整理出来,希望能 ...

  9. 在Android项目中调用已有.so库

    注意该.so库指的是android平台的,非一般linux.unix平台:1.现有库libcom_ycan_testLib.so2.新建android项目TestLib23.添加新类:类名:testL ...

随机推荐

  1. 获得Map的选择集

    ISelection selection = m_hookHelper.FocusMap.FeatureSelection;            IEnumFeatureSetup iEnumFea ...

  2. CICS的几个常用命令

    下面是CICS的几个常用命令,仅仅几个我也是刚刚使用CICS,慢慢积累. 1. cicscli /l 是查看启动的客户机守护程序,如果没有启动客户机守护程序,会提示如下信息:CCL8001I CICS ...

  3. Eclipse 安装 Maven 插件(图文解说)

    Help  --> 选择Eclipse Marketplace -->  在 Find 中输入 Maven integration for Eclipse  --> 回车搜索

  4. siteserver cms选择栏目搜索无效

    标签必须以空格分开,且option 的value必须给id不能给名称

  5. USACO翻译:USACO 2014 FEB SILVER 三题

    USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...

  6. SageCRM 快速获取连接中的SID的方法

    经常需要使用ajax来修改页面的功能,包括联动.动态加载等. SageCRM的页面必须有SID的,所以要方便的获取它. var getKey = function(key,Url) { if(argu ...

  7. C++大会感悟

    写在前面: 我是一名学生,在北邮读研,也是跨专业学的计算机,个人对服务器端编程感兴趣,平时主用c/c++,所以逮到这次机会就参加了这次大会. 先附几张合影: 正文: 这次参加c++大会也算是我最认真的 ...

  8. 函数randint的使用

    摘自百科: ANDINT 在MATLAB中用于产生基质的均匀分布的随机整数. 用法: 1.OUT = RANDINT 产生一个“ 0 ”或“ 1 ”等概率 2.OUT = RANDINT(M) 生成的 ...

  9. Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes

    Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes http://blog.csdn.n ...

  10. Excel导入导出的业务进化场景及组件化的设计方案(上)

    1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...