int转Integer

int i = 0;

Integer wrapperi = new Integer(i);

Integer转int

Integer wrapperi = new Integer(0);

int i = wrapperi.intValue();

JDK1.5以后的int转Integer

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

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

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

的使用。

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

int i = 0;

Integer wrapperi = i;

还有其他方法?

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

public static Integer valueOf(int i)

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

int i = 0;

Integer wrapperi = Integer.valueOf(i);

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

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

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

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

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

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

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

/*

* 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则

* 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过

* 缓存经常请求的值而显著提高空间和时间性能。

* @param i an int value.

* @return a Integer instance representing i.

* @since 1.5

*/

public static Integer valueOf(int i) {

final int offset = 128;

if (i >= -128 && i <= 127) { // must cache

return IntegerCache.cache[i + offset];

}

return new Integer(i);

}

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

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

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

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

/*

* IntegerCache内部类

* 其中cache[]数组用于存放从-128到127一共256个整数

*/

private static class IntegerCache {

private IntegerCache(){}

static final Integer cache[] = new Integer[-(-128) + 127 + 1];

static {

for(int i = 0; i < cache.length; i++)

cache[i] = new Integer(i - 128);

}

}

这就是valueOf方法真正的优化方法,当-128=127 或 i

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

Integer i=100;

Integer j=100;

//print true

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。

Integer i=200;

Integer j=200;

//print false

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的环境下可以编译通过并运行。

Integer wrapperi = new Integer(0);

int i = wrapperi;

附:AutoBoxing与UnBoxing带来的转变

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

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

int x = 1;

Collection collection = new ArrayList();

collection.add(x);//AutoBoxing,自动转换成Integer.

Integer y = new Integer(2);

collection.add(y + 2); //y + 2为UnBoxing,自动转换成int。之后再次转换为Integer。

此特性同样适用于Map

Map map = new HashMap();

int x = 1;

Integer y = new Integer(2);

int z = 3;

map.put(x,y + z);//x自动转换成Integer。y+z自动转换成int。之后再次转换为Integer。

5

2

分享到:

2010-08-23 21:53

浏览 136458

评论

3 楼

Nabulio

2016-08-17

是不错的

2 楼

shihengli2010

2016-06-28

学习了 !

Integer i = 100;

Integer j = 100;

System.out.println(i==j);

Integer i1 = 200;

Integer j1= 200;

System.out.println(i1==j1);

居然打印的是不同的结果。

1 楼

flex涵

2015-05-04

还可以,差不多就是这个意思.

java转integer_Java的Integer与int互转相关推荐

  1. Java中ArrayList、Integer[]和int[]的相互转换

    一.Integer[]与ArrayList的互转 1. Integer[]转ArrayList (1) 方法一: 利用Arrays工具类中的asList方法 Integer[] arr = {1,2, ...

  2. java怎么往list里存int,Java中List、Integer[]、int[] 的相互转换

    本文涉及到一些 Java8 的特性. int[]数组 int[] data = {4, 5, 3, 6, 2, 5, 1}; int[] 转 List List list1 = Arrays.stre ...

  3. Java中的AutoBoxing (Integer对-128~127之间数值的特殊处理)

      理解Java中Integer和int的Autoboxing,有助于java新手理解java内存机制.   在Java中的,Integer和int是可以Autoboxing和boxing的,这里要注 ...

  4. integer 转int类型 java_Java数据类型中String、Integer、int相互间的转换

    Java数据类型String.Integer.int相互间的转换 1.Integer转换成int的方法 Integer i = new Integer(10); int k = i.intValue( ...

  5. java integer int 比较_java Integer和int之间的比较问题是什么?

    展开全部 java Integer和int之间e68a84e8a2ad3231313335323631343130323136353331333365633864==的比较问题.求解释 public ...

  6. (备忘)Java数据类型中String、Integer、int相互间的转换

    1.Integer转换成int的方法 Integer i; int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Inte ...

  7. java string与integer_Java中Integer和String浅谈

    http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float ...

  8. Java数据类型中String、Integer、int相互间的转换

    1.Integer转换成int的方法 Integer i;  int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Int ...

  9. Java Integer于Int 进行==双等于的内存比较时的一些问题说明

    转自: https://blog.csdn.net/xingkongdeasi/article/details/79618421 部分有所修改: 前言: 越是简单的东西,我们往往越是没有去把它明白,但 ...

  10. Java黑皮书课后题第5章:**5.37(十进制转二进制)编写程序,提示用户输入一个十进制整数,然后显示对应的二进制值(不要使用Integer.toBinaryString(int)方法)

    5.37(十进制转二进制)编写程序,提示用户输入一个十进制整数,然后显示对应的二进制值 题目 题目概述 破题 代码 运行示例 题目 题目概述 5.37(十进制转二进制)编写程序,提示用户输入一个十进制 ...

最新文章

  1. 为什么 Linux 需要 Swapping
  2. 阿里云城市数据大脑开发规范
  3. 在Java语言里 ==和equals的区别
  4. 2016年印度公有云服务市场将达13亿美元
  5. matlab样条插值如何用,三次样条插值matlab实现
  6. java getevent_Java ActionEvent.getWhen方法代码示例
  7. SAP License:SAP用户权限
  8. stcc52单片机时钟电路_单片机与晶振到底有什么关系?
  9. windows小工具
  10. java项目运维手册
  11. redis集群报错(error) CLUSTERDOWN Hash slot not served
  12. linux中getchar函数用法,linux getchar函数使用
  13. html5网页特效-水墨动画
  14. linux vi 看下一页,linux中的vi命令(2)
  15. 为什么有红黑树?什么是红黑树?看完这篇你就明白了
  16. Chrome访问https页面 攻击者可能会试图从 XX.XX.XX.XX 窃取您的信息(例如:密码、通讯内容或信用卡信息)直接键盘敲入这11个字符:thisisunsafe
  17. bea官网信息分类总结【转载】
  18. svn建立分支linux,linux命令——svn分支創建、合並
  19. Flink事件时间、水印以及迟到数据处理的个人理解
  20. arcgis10.6安装失败

热门文章

  1. 日更100天(53)每天进步一点点
  2. 小米路由3c padavan固件
  3. Freescale PowerPC系列架构 处理器 种类介绍 型号发展
  4. ei会议论文录用但不参加会议_ei会议论文还能在报纸杂志发表吗?
  5. PLC通过控制器控制步进电机
  6. PCB Layout的10个细节
  7. 用什么 软件测试无线频段,Wirelessmon无线频段与信号强度扫描工具软件使用技巧...
  8. 如何找到 SketchUp 插件所在的目录?
  9. 伺服电机功率计算选型与伺服电机惯量匹配
  10. QT学习之基础Day1(自用)