int转Integer

  1. ;
  2. Integer wrapperi = new Integer(i);

Integer转int

  1. );
  2. int i = wrapperi.intValue();

JDK1.5以后的int转Integer 

JDK1.5以后,Java为我们提供了更为丰富的转换方法。 



其中最值得一提的就是自动装包/自动拆包(AutoBoxing/UnBoxing)。 

此功能大大丰富了基本类型(primitive type)数据与它们的包装类(Wrapper Class) 

的使用。 



由于AutoBoxing的存在,以下代码在JDK1.5的环境下可以编译通过并运行。

  1. ;
  2. Integer wrapperi = i;

还有其他方法? 

JDK1.5为Integer增加了一个全新的方法:

  1. public static Integer valueOf(int i)

以下代码在JDK1.5的环境下可以编译通过并运行。

  1. ;
  2. Integer wrapperi = Integer.valueOf(i);

此方法与new Integer(i)的不同处在于: 

方法一调用类方法返回一个表示指定的 int 值的 Integer 实例。 

方法二产生一个新的Integer对象。 



JDK API文档中对这个新的valueOf方法有明确的解释: 

如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 



但这个解释有点晦涩难懂。为什么该方法有可能通过缓存经常请求的值而显著提高性能? 



通过反编译工具查看valueOf方法。

  1. /*
  2. * 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则
  3. * 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过
  4. * 缓存经常请求的值而显著提高空间和时间性能。
  5. * @param  i an <code>int</code> value.
  6. * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
  7. * @since  1.5
  8. */
  9. public static Integer valueOf(int i) {
  10. ;
  11. && i <= 127) { // must cache
  12. return IntegerCache.cache[i + offset];
  13. }
  14. return new Integer(i);
  15. }

可以看到对于范围在-128到127的整数,valueOf方法做了特殊处理。 

采用IntegerCache.cache[i + offset]这个方法。 

从名字,我们可以猜出这是某种缓存机制。 



进一步跟踪IntegerCache这个类,此类代码如下

  1. /*
  2. * IntegerCache内部类
  3. * 其中cache[]数组用于存放从-128到127一共256个整数
  4. */
  5. private static class IntegerCache {
  6. private IntegerCache(){}
  7. ) + 127 + 1];
  8. static {
  9. ; i < cache.length; i++)
  10. );
  11. }
  12. }

这就是valueOf方法真正的优化方法,当-128=<i<=127的时候,返回的是IntegerCache中的数组的值;当 i>127 或 i<-128 时,返回的是Integer类对象。 



再举一个经常被提到的例子

  1. ;
  2. ;
  3. //print true
  4. System.out.println(i==j);

此时的 i=IntegerCache.cache[i + 128] = IntegerCache.cache[228], 

同样j = IntegerCache.cache[j + 128] = IntgerCache.cache[228] 

因此 Integer引用i中存储的是cache数组第228号元素的地址。同理j也是同一个cache数组的第228号元素的地址(因为cache是Integer的static数组,只有一个)。 

i==j比较的是引用地址,因此返回true。

  1. ;
  2. ;
  3. //print false
  4. System.out.println(i==j);

此时的 i=new Integer(200);  同样j=new Integer(200) 。 

两次都在堆中开辟了Integer的对象。 

i 和 j 中存储的堆的对象地址是完全不同的。i==j 自然返回false。 





引入缓存机制的作用何在? 



接着上面的例子,假如我们在编程时大量需要值为100(100的范围在-128到127之间)的Integer对象。如果只能通过new来创建,需要在堆中开辟大量值一样的Integer对象。 

这是相当不划算的,IntegerCache.cache很好的起到了缓存的作用。 

当我们需要Integer i  = 100的时候,直接从cache中取出第[100+128]号元素的地址赋值给引用i,再次需要Integer j = 100时,还是直接去这个地址赋值给j。是不是省去了在堆中不停的创建对象的代价了(空间,时间上的消耗都很大)。 这就是valueOf方法真正的提高性能之处。 

正如JDK API文档对valueOf(int i)方法的描述,该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 



结论 



valueOf(int i)的优化只针对于范围在-128到127的整数。 









JDK1.5以后的Integer转int 

由于UnBoxing的存在,以下代码在JDK1.5的环境下可以编译通过并运行。

  1. );
  2. int i = wrapperi;

附:AutoBoxing与UnBoxing带来的转变 

在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀。 



以下代码在JDK1.5中成为了可能,试想下在JDK1.5之前该如何实现这段代码?

  1. ;
  2. Collection collection = new ArrayList();
  3. collection.add(x);//AutoBoxing,自动转换成Integer.
  4. );
  5. ); //y + 2为UnBoxing,自动转换成int。之后再次转换为Integer。

此特性同样适用于Map

  1. Map map = new HashMap();
  2. ;
  3. );
  4. ;
  5. map.put(x,y + z);//x自动转换成Integer。y+z自动转换成int。之后再次转换为Integer。

Java的Integer与int互转的更多相关文章

  1. java中Integer与int装箱拆箱一点收获

    示例代码: class BoxIntInteger { public static void main(String[] args) { Integer a = new Integer(10111); ...

  2. Java中Integer和int的异同

    public void Test1() { int a = 128; Integer b = 128; Integer c = 128; //Integer会自动拆箱成int,所以为ture Syst ...

  3. java中Integer和int的区别(转)

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

  4. Java|从Integer和int的区别认识包装类

    https://blog.csdn.net/darlingwood2013/article/details/96969339?utm_medium=distribute.pc_relevant.non ...

  5. Java中Integer 和 int的区别

    基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Integer 实际是对象 ...

  6. Java中Integer与int对比的一些坑

    Integer与int类型的关系 Integer是int的包装类,int的默认值是0,而Integer的默认值是null(我们经常在代码中使用的Integer.valueOf() 和xx.intVal ...

  7. Java的Integer和int有什么区别

    Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper cla ...

  8. Java 的Integer、int与new Integer到底怎么回事?

    先做一些总结,询问了些经验比较多的师傅,在这里表示感谢,然后自己总结下,今天的收获分享给大家: 1. int 和Integer在进行比较的时候,Integer会进行拆箱,转为int值与int进行比较. ...

  9. java中Integer和int的区别

    亲看这里 例子: public class Test { public static void main(String[] args) { Integer i = new Integer(128); ...

随机推荐

  1. 百度DMA+小度App的蓝牙语音解决方案展示

    前记   跟着百度也有一段时间了,经过一年多的努力,我们也做出了一些基于百度的语音助手的产品方案.下面就给大家秀一下我们做的产品.有类似需求的朋友可以多多交流.我们的合作方式十分灵活,可以卖芯片你自己 ...

  2. 负载均衡基本原理与lvs

    前言: 之前在山西的项目上使用的是lvs下的NAT模式,但另外两个模式并没有涉及,今天系统的整理下关于负载均衡的相关理论与lvs各模式的相关优点与不足,知其然与所以然,而后能针对性的应用: 基本介绍 ...

  3. 一次 kafka 消息堆积问题排查

    收到某业务组的小伙伴发来的反馈,具体问题如下: 项目中某 kafka 消息组消费特别慢,有时候在 kafka-manager 控制台看到有些消费者已被踢出消费组. 从服务端日志看到如下信息: 该消费组 ...

  4. Python for Data Analysis 学习心得(四) - 数据清洗、接合

    一.文字处理 之前在练习爬虫时,常常爬了一堆乱七八糟的字符下来,当时就有找网络上一些清洗数据的方式,这边pandas也有提供一些,可以参考使用看看.下面为两个比较常见的指令,往往会搭配使用. spli ...

  5. 量化投资学习笔记07——python知识补漏

    看<量化投资:以python为工具>这本书,第一部分是python的基础知识.这一部分略读了,只看我还不知道或不熟的. 定义复数 x = complex(2, 5) #2+5j 也可以直接 ...

  6. Mac重装操作系统系统

    恢复出厂设置 第一种 1.开机 2.commond + R,进入recover模式. 3.选择磁盘工具 4.显示所有设备 5.抹掉硬盘.格式选择 (1):Mac OS 扩展(日志式). (2): Ma ...

  7. C# 微信h5支付

    相关文档  https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 需要准备 公众号ID.商户号.商家私钥 1.登 ...

  8. JUnit 5和Selenium基础(一)

    Gradle.JUnit 5和Jupiter Selenium Selenium是一组支持浏览器自动化的工具,主要用于Web应用程序测试.Selenium的组件之一是Selenium WebDrive ...

  9. 速石科技携HPC混合云平台亮相AWS技术峰会2019上海站

    2019年6月20日,全球云技术盛会——AWS技术峰会2019(上海站)在上海世博中心举行.作为AWS的技术合作伙伴,速石科技携旗下基于混合云的一站式高性能计算(HPC)平台首次公开亮相. 速石科技向 ...

  10. lldb调试器知多少

    lldb调试器简介   lldb 是一个有着 REPL 的特性和 C++ .Python 插件的开源调试器.lldb调试器的由来是伴随着Xcode的版本升级而来. Xcode4.3之前使用的默认调试器 ...