- 浏览: 260544 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
liliang880504:
bitnami_redmine_merge这个数据库是创建和合 ...
bitnami-redmine服务器迁移
.Java的Integer与int互转 博客分类: java面试题
JavaCacheJ#JDK .
int转Integer
Java代码
1.int i = 0;
2.Integer wrapperi = new Integer(i);
int i = 0;
Integer wrapperi = new Integer(i);
Integer转int
Java代码
1.Integer wrapperi = new Integer(0);
2.int i = wrapperi.intValue();
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的环境下可以编译通过并运行。
Java代码
1.int i = 0;
2.Integer wrapperi = i;
int i = 0;
Integer wrapperi = i;
还有其他方法?
JDK1.5为Integer增加了一个全新的方法:
Java代码
1.public static Integer valueOf(int i)
public static Integer valueOf(int i)
以下代码在JDK1.5的环境下可以编译通过并运行。
Java代码
1.int i = 0;
2.Integer wrapperi = Integer.valueOf(i);
int i = 0;
Integer wrapperi = Integer.valueOf(i);
此方法与new Integer(i)的不同处在于:
方法一调用类方法返回一个表示指定的 int 值的 Integer 实例。
方法二产生一个新的Integer对象。
JDK API文档中对这个新的valueOf方法有明确的解释:
如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提
高空间和时间性能。
但这个解释有点晦涩难懂。为什么该方法有可能通过缓存经常请求的值而显著提高性能?
通过反编译工具查看valueOf方法。
Java代码
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. final int offset = 128;
11. if (i >= -128 && i <= 127) { // must cache
12. return IntegerCache.cache[i + offset];
13. }
14. return new Integer(i);
15.}
/*
* 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则
* 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过
* 缓存经常请求的值而显著提高空间和时间性能。
* @param i an <code>int</code> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @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这个类,此类代码如下
Java代码
1./*
2. * IntegerCache内部类
3. * 其中cache[]数组用于存放从-128到127一共256个整数
4. */
5.private static class IntegerCache {
6. private IntegerCache(){}
7.
8. static final Integer cache[] = new Integer[-(-128) + 127 + 1];
9.
10. static {
11. for(int i = 0; i < cache.length; i++)
12. cache[i] = new Integer(i - 128);
13. }
14.}
/*
* 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=<i<=127的时候,返回的是IntegerCache中的数组的值;当 i>127 或 i<-128 时,返回的是
Integer类对象。
再举一个经常被提到的例子
Java代码
1.Integer i=100;
2.Integer j=100;
3.//print true
4.System.out.println(i==j);
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。
Java代码
1.Integer i=200;
2.Integer j=200;
3.//print false
4.System.out.println(i==j);
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的环境下可以编译通过并运行。
Java代码
1.Integer wrapperi = new Integer(0);
2.int i = wrapperi;
Integer wrapperi = new Integer(0);
int i = wrapperi;
附:AutoBoxing与UnBoxing带来的转变
在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀。
以下代码在JDK1.5中成为了可能,试想下在JDK1.5之前该如何实现这段代码?
Java代码
1.int x = 1;
2.Collection collection = new ArrayList();
3.collection.add(x);//AutoBoxing,自动转换成Integer.
4.Integer y = new Integer(2);
5.collection.add(y + 2); //y + 2为UnBoxing,自动转换成int。之后再次转换为Integer。
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
Java代码
1.Map map = new HashMap();
2.int x = 1;
3.Integer y = new Integer(2);
4.int z = 3;
5.map.put(x,y + z);//x自动转换成Integer。y+z自动转换成int。之后再次转换为Integer。
JavaCacheJ#JDK .
int转Integer
Java代码
1.int i = 0;
2.Integer wrapperi = new Integer(i);
int i = 0;
Integer wrapperi = new Integer(i);
Integer转int
Java代码
1.Integer wrapperi = new Integer(0);
2.int i = wrapperi.intValue();
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的环境下可以编译通过并运行。
Java代码
1.int i = 0;
2.Integer wrapperi = i;
int i = 0;
Integer wrapperi = i;
还有其他方法?
JDK1.5为Integer增加了一个全新的方法:
Java代码
1.public static Integer valueOf(int i)
public static Integer valueOf(int i)
以下代码在JDK1.5的环境下可以编译通过并运行。
Java代码
1.int i = 0;
2.Integer wrapperi = Integer.valueOf(i);
int i = 0;
Integer wrapperi = Integer.valueOf(i);
此方法与new Integer(i)的不同处在于:
方法一调用类方法返回一个表示指定的 int 值的 Integer 实例。
方法二产生一个新的Integer对象。
JDK API文档中对这个新的valueOf方法有明确的解释:
如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提
高空间和时间性能。
但这个解释有点晦涩难懂。为什么该方法有可能通过缓存经常请求的值而显著提高性能?
通过反编译工具查看valueOf方法。
Java代码
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. final int offset = 128;
11. if (i >= -128 && i <= 127) { // must cache
12. return IntegerCache.cache[i + offset];
13. }
14. return new Integer(i);
15.}
/*
* 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则
* 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过
* 缓存经常请求的值而显著提高空间和时间性能。
* @param i an <code>int</code> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @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这个类,此类代码如下
Java代码
1./*
2. * IntegerCache内部类
3. * 其中cache[]数组用于存放从-128到127一共256个整数
4. */
5.private static class IntegerCache {
6. private IntegerCache(){}
7.
8. static final Integer cache[] = new Integer[-(-128) + 127 + 1];
9.
10. static {
11. for(int i = 0; i < cache.length; i++)
12. cache[i] = new Integer(i - 128);
13. }
14.}
/*
* 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=<i<=127的时候,返回的是IntegerCache中的数组的值;当 i>127 或 i<-128 时,返回的是
Integer类对象。
再举一个经常被提到的例子
Java代码
1.Integer i=100;
2.Integer j=100;
3.//print true
4.System.out.println(i==j);
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。
Java代码
1.Integer i=200;
2.Integer j=200;
3.//print false
4.System.out.println(i==j);
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的环境下可以编译通过并运行。
Java代码
1.Integer wrapperi = new Integer(0);
2.int i = wrapperi;
Integer wrapperi = new Integer(0);
int i = wrapperi;
附:AutoBoxing与UnBoxing带来的转变
在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀。
以下代码在JDK1.5中成为了可能,试想下在JDK1.5之前该如何实现这段代码?
Java代码
1.int x = 1;
2.Collection collection = new ArrayList();
3.collection.add(x);//AutoBoxing,自动转换成Integer.
4.Integer y = new Integer(2);
5.collection.add(y + 2); //y + 2为UnBoxing,自动转换成int。之后再次转换为Integer。
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
Java代码
1.Map map = new HashMap();
2.int x = 1;
3.Integer y = new Integer(2);
4.int z = 3;
5.map.put(x,y + z);//x自动转换成Integer。y+z自动转换成int。之后再次转换为Integer。
发表评论
-
sql总结
2015-05-28 09:49 793目录[-] 最基本的sql语句(针对mysql ... -
大唐电信JAVA笔试题面试题-解答
2015-05-27 10:20 601转载:http://my.oschina.net/cha ... -
面试杂谈
2015-04-23 13:19 371判断一个数据是否 ... -
顺序打印ABC------java多线程的一道经典面试题
2015-04-23 12:55 1941public class PrintABC { ... -
java 遍历二叉树
2015-04-22 22:34 733import java.util.ArrayDeque;p ... -
Hash冲突的解决--暴雪的Hash算法
2015-04-04 22:34 1714值得一提的是,在解决Hash冲突的时候,搞的焦头烂额, ... -
解决哈希(HASH)冲突的主要方法
2015-04-04 22:33 671虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的 ... -
JVM底层又是如何实现synchronized的
2015-04-01 23:07 589目前在Java中存在两种锁机制:synchronized和 ... -
JAVA 多线程和并发基础面试问答
2015-03-29 23:13 809多线程和并发问题是 Jav ... -
Java阻塞队列的实现
2015-03-29 23:09 390阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素 ... -
Java中HashMap遍历的两种方式
2015-03-29 16:48 423转]Java中HashMap遍历的两种方式 原文地址: htt ... -
为什么String要设计成不可变的?
2015-03-29 16:35 633是一个老生常谈的话题(This is an old yet s ... -
不考虑字符编码,按字节截取含有中文汉字的字符串
2013-03-28 11:48 794要求实现一个按字节截取字符串的方法,比如对于字符串" ...
相关推荐
AVLTree_in_Java 用作键值集的AVL树描述:AVL树用作键值集作者:张玲涵电子邮件: 执照:GNU / GPL 注意:初始化AVLTree时,应指定键类型和值类型,例如new AVLTree <Iteger>(Comparator),该键必须是唯一的。...
Font Awesome图标字体库提供可缩放矢量图标,它可以被定制大小、颜色、阴影以及任何可以用CSS的样式
介绍了physical design的floorplanning问题
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 最低生活保障问题的探索 共20页.pdf
变更用水性质定额申请表.xls
从官网上下载下来,作为资源存储,方便安装,此资源为windows版本
嗨玩旅游网站-JAVA-基于springboot嗨玩旅游网站设计与实现(毕业论文+PPT)
【资源说明】 本科毕业设计 基于Python中国知网(cnki)爬虫及数据可视化详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
api代码
【作品名称】:基于 Java 实现的24点卡牌游戏【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: Java小游戏--24点卡牌游戏 将扑克牌(除大小王)随机打乱,每次出现4张卡牌,每张卡牌使用一次,13个回合。 A代表1,J代表11,Q代表12,K代表13。 可2-4人局域网同时在线对战,100秒倒计时结束前回答正确可获得积分,先回答的可获4分,后回答的分数依次递减。 实时显示玩家排名。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
用 Python 实现的可扩展布隆过滤器皮布卢姆pybloom是一个包含 Bloom Filter 数据结构以及可扩展 Bloom Filter 实现的模块,如下所述P. Almeida、C.Baquero、N. Preguiça、D. Hutchison,可扩展布隆过滤器,(GLOBECOM 2007),IEEE,2007。如果您了解需要提前留出多少位来存储整个集合,那么布隆过滤器就是您的不二之选。可扩展布隆过滤器允许您的布隆过滤器位根据误报概率和大小进行增长。当过滤器达到容量上限时,即为“满”M * ((ln 2 ^ 2) / abs(ln p)),其中 M 是位数,p 是误报概率。当达到容量上限时,将创建一个比上一个过滤器大得多的新过滤器,其误报概率更小,哈希函数数量更多。>>> from pybloom import BloomFilter>>> f = BloomFilter(capacity=1000, error_rate=0.001)>>> [f.add(x) for x in range(10)][False, False, False,
计算机学院宿舍美化大赛.rar
基于java的运动器械购物商城设计与实现.docx
内容概要:文章介绍了针对“卓越工程师教育培养计划”,结合PBL和CDIO工程教育理念,对材料成型及控制工程专业课程设计的实践教学改革进行探索。首先在命题设计上依托企业实践项目,确保设计内容与生产实际紧密结合,具有较强的创新性和实用性。在过程管理中,采用分组合作和面向实际问题导向的教学方法,提升学生的工程素养和创新思维。通过课程设计的成绩考核,结合校内外导师的共同评价,客观全面衡量学生的学习成果。指导教师发挥了组织、支持和引导等多方面的角色作用。 适合人群:高等院校材料成型及控制工程专业学生和教学管理人员;工程教育领域的研究人员。 使用场景及目标:旨在提升工科学生的工程实践能力和创新能力,使其具备解决复杂实际工程问题的能力。通过改革教学内容和方法,改善传统课程设计中存在的不足,培养出高素质的技术人才。 其他说明:改革措施在实际运行中取得了较好的教学效果,提高了学生的就业竞争力,但仍存在一些不足之处需要在未来进行完善。
设计模式学习
C的两数相加求和的程序代码
Viper是一个基于Anno微服务引擎开发的Dashboard示例项目。Anno底层通讯采用grpc、thrift
本教程播放列表涵盖了 Python 中的数据结构和算法。每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习。使用 Python 的数据结构和算法本教程涵盖了 Python 中的数据结构和算法。每个教程都包含数据结构或算法背后的理论、BIG O 复杂度分析以及可供练习的练习。要观看视频,您可以访问播放列表https://www.youtube.com/playlist?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12订阅 codebasics youtube 频道https://www.youtube.com/c/codebasics
python入门——安装Python软件包
就业去向信息-JAVA-基于微信小程序高校毕业生实习及就业去向信息管理系统(毕业论文+PPT)