- 浏览: 264920 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
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 814目录[-] 最基本的sql语句(针对mysql ... -
大唐电信JAVA笔试题面试题-解答
2015-05-27 10:20 631转载:http://my.oschina.net/cha ... -
面试杂谈
2015-04-23 13:19 380判断一个数据是否 ... -
顺序打印ABC------java多线程的一道经典面试题
2015-04-23 12:55 1960public class PrintABC { ... -
java 遍历二叉树
2015-04-22 22:34 747import java.util.ArrayDeque;p ... -
Hash冲突的解决--暴雪的Hash算法
2015-04-04 22:34 1724值得一提的是,在解决Hash冲突的时候,搞的焦头烂额, ... -
解决哈希(HASH)冲突的主要方法
2015-04-04 22:33 690虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的 ... -
JVM底层又是如何实现synchronized的
2015-04-01 23:07 603目前在Java中存在两种锁机制:synchronized和 ... -
JAVA 多线程和并发基础面试问答
2015-03-29 23:13 839多线程和并发问题是 Jav ... -
Java阻塞队列的实现
2015-03-29 23:09 406阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素 ... -
Java中HashMap遍历的两种方式
2015-03-29 16:48 439转]Java中HashMap遍历的两种方式 原文地址: htt ... -
为什么String要设计成不可变的?
2015-03-29 16:35 645是一个老生常谈的话题(This is an old yet s ... -
不考虑字符编码,按字节截取含有中文汉字的字符串
2013-03-28 11:48 814要求实现一个按字节截取字符串的方法,比如对于字符串" ...
相关推荐
AVLTree_in_Java 用作键值集的AVL树描述:AVL树用作键值集作者:张玲涵电子邮件: 执照:GNU / GPL 注意:初始化AVLTree时,应指定键类型和值类型,例如new AVLTree <Iteger>(Comparator),该键必须是唯一的。...
vue.js vue.min.js vue-router.js vue-router.min.js
内容概要:本文档是关于DM8数据库系统的SQL语言使用手册,全面介绍了其SQL语言的基础特性、功能、语法规则及相关使用方法。手册首先概述了DM_SQL的特点和它支持的各种数据类型(例如:数值、字符串、日期时间类型等)及其对应的表达式。接下来深入探讨了一系列高级话题,涵盖数据定义语句-DDL、数据操纵语句-DML和数据控制语句,具体讲解了多种表类型(常规表、HUGE表、外部表)的创建与管理,以及索引机制(全文索引、位图连接索引等)。此外还提供了丰富的实例示范,确保读者能直观理解并应用于实际项目。同时,文档也阐述了各种系统级别的功能,如日志和检查点管理、MPP管理和统计信息生成等功能的使用方法。 适合人群:具有一定数据库基础知识并且有意深入了解DM8数据库系统特性的开发工程师、数据库管理人员或相关专业技术人员。 使用场景及目标:①指导开发人员掌握DM8中各类SQL命令的实际运用技巧;②帮助运维人员学会通过SQL来进行有效的数据维护与优化,从而提升数据库的整体性能。 其他说明:该手册不仅仅是SQL理论的讲述,而是通过大量的实例演示让使用者更加熟悉日常的工作任务。对于复杂的企业级应用场景尤其有
1108_ba_open_report
anslow_02_0109
opencv下载安装教程
aronson_01_0707
Wang Chi, Szeto Donald - Designing Deep Learning Systems. A software engineer's guide
使用Python语言对Django框架进行设计,选用豆瓣读书网站(https://book.douba n.com/)作为研究对象,基于用户的阅读行为数据,运用网络爬虫技术来抓取所需数据,随后对这些数据进行深度清理,存储到数据库中。借助ECharts的可视化工具,深入分析和直观展示,实现数据分析与可视化。
barbieri_01_0108
brown_3ck_01_0718
关键词:学生选课系统;Python语言;MySQL数据库 学生选课系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写,使用了Django框架。该系统从三个对象:由管理员和学生、教师来对系统进行设计构建。主要功能包括:个人信息修改,对学生、教师信息、课程信息、课程分类、选择课程、班级、成绩通知、教室信息、系统管理等功能
ganga_02_0909
毕设-springboot大学生竞赛管理系统(免费领取)
agenda_3cd_01_0716
Swift语言教程:从入门到实践 Swift是苹果公司开发的一种多范式编程语言,用于iOS、macOS、watchOS和tvOS应用开发。它结合了C和Objective-C的优点,同时提供了现代编程语言的许多特性,如安全性、速度以及表达力。以下是从入门到实践的Swift语言教程。 一、Swift基础 1. Swift环境设置 Xcode安装:下载并安装最新版本的Xcode,这是开发Swift应用的集成开发环境(IDE)。 创建项目:在Xcode中创建一个新的Swift项目,了解项目结构。 2. 基本语法 变量与常量:使用var声明变量,使用let声明常量。 数据类型:整数(Int)、浮点数(DoubleFloat)、字符串(String)、布尔值(Bool)等。 类型安全:Swift是强类型语言,每个变量和常量在声明时都需要指定类型(尽管Swift也能自动推断类型)。 运算符:算术运算符、比较运算符、逻辑运算符等。 3. 控制流 条件语句:if、else if、else。 循环语句:for循环、while循环、repeat-while循环。 控制转移语句:break、continue
【宝城期货-2025研报】钢材、铁矿石日报:关税扰动不断,钢矿弱势运行.pdf
anslow_05_0110
介绍了清理C盘空间的多种方法,包括使用系统工具、清理临时文件、卸载残留文件、移动用户文件夹、清理系统日志和虚拟内存等,旨在帮助用户有效释放C盘空间,提升电脑性能。
内容概要:本文档详细介绍达梦DM8分布计算集群(DMDPC)的设计理念、系统架构、关键技术及其实现。涵盖了系统原理、系统特性、关键技术、构建和配置步骤等内容。文档还提供了对计划生成、子任务划分、执行调度及链路通讯等机制的深入解析,确保使用者理解如何部署、管理和优化这个新型分布式数据库解决方案。 适合人群:本文档适用于熟悉数据库技术尤其是分布式数据库的专业人士,主要包括开发工程师、测试工程师、技术支持工程师、数据库管理员及相关管理人员。 使用场景及目标:①理解并掌握 DM8 分布计算集群的基本概念和技术原理;②指导如何正确配置、部署以及日常维护DM8分布式集群;③为解决复杂的大型企业级应用程序对高性能和高可靠的数据库需求提供技术支持。 其他说明:文档不仅讲述了技术层面的知识,还有详细的实例示范,便于用户根据自己的情况进行操作,有助于加快项目的实施进度。此外,文档还包括了丰富的配置参数和性能调优方面的内容,为优化系统性能提供了有价值的参考资料。