1. 调用Integer.valueOf()时, 对[-128,127]进行了缓存!
public final class Integer extends Number implements Comparable<Integer> {
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);
}
}
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);
}
}
2. 装箱与拆箱的本质:
装箱: 自动Integer.valueOf();
Integer jjj = 1;
编译后源码:
Integer jjj = Integer.valueOf(1);
拆箱: 自动对象.intValue();
int jjj = new Integer(2);
编译后源码:
int jjj = (new Integer(2)).intValue();
EG:
示例代码:
public class Test {
public static void main(final String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
main2();
main3();
}
public static void main2() {
Integer a = 156;
Integer b = 156;
System.out.println(a == b);
}
public static void main3() {
int a = new Integer(156);
int b = Integer.valueOf(156);
System.out.println(a == b);
}
}
经过装箱拆箱本质代码为:
public class Test
{
public static void main(String[] args)
{
Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b);
main2();
main3();
}
public static void main2() {
Integer a = Integer.valueOf(156);
Integer b = Integer.valueOf(156);
System.out.println(a == b);
}
public static void main3() {
int a = new Integer(156).intValue();
int b = Integer.valueOf(156).intValue();
System.out.println(a == b);
}
}
运行结果:
true
false
true
3. yekui说, 查了一下源码,确实如此!
java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率.
valueOf缓存范围
其他的包装器:
Boolean: (全部缓存)
Byte: (全部缓存)
Character [0, 127] 缓存
Short [-128, 127] 缓存
Long [-128, 127] 缓存
Float (没有缓存)
Doulbe (没有缓存)
参照: http://xiaoyu1985ban.iteye.com/blog/1384191
分享到:
相关推荐
主要介绍了Java拆箱与装箱,结合实例形式详细分析了Java拆箱与装箱相关的数据类型转换操作技巧,需要的朋友可以参考下
java装箱拆箱.ppt java装箱拆箱.ppt
Java包装类、拆箱和装箱详解.docx
主要介绍了Java 装箱与拆箱详解及实例代码的相关资料,这里对java 的装箱及拆箱进行了基本概念详解及简单使用,需要的朋友可以参考下
比较泛型集合List与ArrayList的性能。循环增加整数。(装箱、拆箱 )见备注。 //1.装箱、拆箱必须是: 值类型→引用类型 或 引用类型→值类型。 //object,接口。值类型是可以实现接口...判断是否发生了装箱,及次数。
很详细的介绍了java装箱拆箱的相关知识,用例子来讲述,易于理解!
主要给大家介绍了关于Java中自动装箱、拆箱引起的耗时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
Java中的自动装箱与拆箱Java开发Java经验技巧共6页.pdf.zip
C#中重要的,必备知识点
本篇文章主要介绍了详解Java 自动装箱与拆箱的实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文先讲述装箱和拆箱基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 ...
C#中必备知识点 装箱与拆箱(2)
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱)
什么是自动装箱和自动拆箱
Java中的自动装箱与拆箱_.docx
自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。 如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放...
主要介绍了深入理解Java中的装箱和拆箱,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
c#的数值类型还有装换和重要的装箱和拆箱,以及实例,很不错的哦
《深入理解java虚拟机》自动装箱拆箱实例.doc
主要介绍了java编程中自动拆箱与自动装箱详解,具有一定参考价值,需要的朋友可以了解下。