java : 包装类 缓冲机制的使用(转载)

摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i)、Byte valueOf(byte b)、Short valueOf(short s)、Long valueOf(long l)、Character valueOf(char c)都是用到了缓冲机制,并且缓冲的范围都是-128~127 但是,对于包装类Float,Double,Boolean 并没有提供相应的缓冲机制

为了了解缓冲机制的使用,我们先从Integer 与 int的互转入手:

JDK1.5为Integer增加了一个全新的方法: 
Java代码 收藏代码

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方法。


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这个类,此类代码如下


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=

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的整数。 而重载的valueOf(String s),valueOf(String s, int radix)是没有使用缓冲机制的

综上所述: (通过查询底层代码得知:) 
八种基本数据类型和其包装类中 Integer valueOf(int i)、Byte valueOf(byte b)、Short valueOf(short s)、Long valueOf(long l)、Character valueOf(char c)都是用到了缓冲机制,并且缓冲的范围都是-128~127 
但是,对于包装类Float,Double,Boolean 并没有提供相应的缓冲机制

原文地址:http://blog.csdn.net/w124374860/article/details/50899507

时间: 2024-08-06 07:49:50

java : 包装类 缓冲机制的使用(转载)的相关文章

Java 日志缓存机制的实现--转载

概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印的日志级别,这样就会带来一些不便. 在 JDK 提供的日志功能中,日志级别被细化为 9 级,用以区分不同日志的用途,用来记录一个错误,或者记录正常运行的信息,又或是记录详细的调试信息.由于日志级别是静态的,如果日志级别设定过高,低级别的日志难以打印出来,从而导致在错误发生时候,难以去追踪错误的发生原

Java垃圾回收机制_(转载)

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象

深入浅出Java垃圾回收机制(一)(转载)

转载来做笔记的:原文地址:http://www.importnew.com/1993.html. 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者.如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开发经验.如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点.当然,我们

java包装类的缓存机制(转)

出处: java包装类的缓存机制 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = 127; Integer b = 127; System.out.println(a == b); // true 这段代码输出的结果为true 使用自动装箱将基本类型转为封装类对象这个过程其实底层实现是调用封装类的valueOf方法: Integer a =127; 相当于 Integer a

【转载】Java垃圾回收机制

原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都 交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后, 采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的

成为JavaGC专家(3)—如何监控Java垃圾回收机制(转载)

原文:http://www.importnew.com/3146.html 为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或行为: 已经通过 -Xms 和–Xmx 设置了内存大小 包含了 -server 参数 系统中没有超时日志等错误日志 换句话说,如果你没有设定内存的大小,并且系统充斥着大量的超时日志时,你就需要在你的系统中进行GC优化了. 但

java笔记--反射机制之基础总结与详解

一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象. 它提供了在运行时检查对象属性的方法,这些属性包括它的成员和类型信息. 更重要的是Class对象是所有反射API的入口. Class类是泛型类,可以使用@SuppressWarnings("unchecked")忽略泛型或者使用Class<V>类型. 获得Class对象的5种

JavaGC专家(1)—深入浅出Java垃圾回收机制

在学习GC之前,你首先应该记住一个单词:"stop-the-world".Stop-the-world会在任何一种GC算法中发生.Stop-the-world意味着 JVM 因为要执行GC而停止了应用程序的执行.当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成.GC优化很多时候就是指减少Stop-the-world发生的时间. 按代的垃圾回收机制 在Java程序中不能显式地分配和注销内存.有些人把相关的对象设置为null或者调用Sy

成为JavaGC专家(1)—深入浅出Java垃圾回收机制

转载自:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者.如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开 发经验.如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点.当然,我们不能以偏概全,这不