【Java基础】Integer包装类的缓冲池问题

首先看下面这个例子:

public class TestNew {
    public static void main(String args[]){
        Integer i1 = 10;
        //Integer i1 = Integer.valueOf(10);
        Integer i2 = 10;
        Integer i3 = 1000;
        Integer i4 = 1000;
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}

其中注释的地方是用来表示编译器优化后代码的样子,说明应该对于i1 = 10的赋值,由于是包装类,所以要创建一个Integer对象,这样,最后两个对象的地址比较,肯定结果都是false,但是真实的结果并不是这样。

true
false

Process finished with exit code 0

第一个比较的结果竟然是true,为了弄清楚原因,就要看Integer的valueOf方法的具体实现了。

   /**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

从这里可以看出,对于value在-128到127之间的int值,在调用这个方法创建Integer对象时,是直接从缓冲池中返回的,如果缓冲池中有,则返回的是同一个对象。

那如果此时,对i2赋值为1,是否i1也会变为1呢?

答案是否定的,上一篇文章中的包装类的参数传递问题和这个类似,因为将1赋值给i2,这时候1被自动装箱为Integer对象,并让i2指向这个新对象,所以此时不会改变i

的值。

时间: 2024-10-01 11:09:46

【Java基础】Integer包装类的缓冲池问题的相关文章

再学Java 之 Integer 包装类缓存

前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static void main(String[] args){ Integer i1 = new Integer(1); Integer i2 = new Integer(1); System.out.println(i1 == i2); Integer i3 = 1; Integer i4 = 1; System.

java中Integer包装类的详细讲解(java二进制操作,所有进制转换)

程序员都很懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往需要操作Integer,或者各种进制的转换等等.我今天就为大家详细讲解一下Integer的使用吧.看代码: package com.herman.test; public class IntegerTest { public static void main(String[] args) { System.out.println("Integer中的常量***************************

java基础类型包装类与自动打包解包

一基础类型包装类 基础数据类型存放在内存的栈区域,可以通过包装类将基础数据类型转换为引用数据类型,即存储在堆与栈中. 基础数据类型一共有8种,相对应的包装类也有8种.分别是Byte,Short,Integer,Long,Float,Double,Character,Boolean.类 包装类位于java.Lang包中. 1 public class Test1 { 2 3 public static void main(String[] args) { 4 // TODO Auto-genera

JAVA基础之包装类,static,final,abstract ,接口 和 内部类

包装类: 自jdk5之后,java就提供了自动装箱与自动拆箱功能,大大简化了基本类型与其包装类对象之间的转换过程,当然装换过程中要注意类型的匹配. public class IntAndInteger { public static void main(String[] args) { //自动装箱 Integer intObj = 5; Integer intObjj = 5; //自动拆箱 int a = intObj; //包装类实现基本变量与字符串的转换 String str = "12

Java基础之包装类的自动装箱和拆箱详解

定义 在java中,数据类型可以分为两大类,即基本数据类型和引用数据类型,基本数据类型的数据不是对象,所以对于要将数据类型作为对象来使用的情况,java提供了相对应的包装类.(关于包装类的详细介绍请参看博客Java基础之常用类详解) 本篇博客主要讲述包装类的自动装箱和拆行机制. 所谓装箱,就是把基本数据类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int类型包装成Integer类型的对象,或者把double包装秤Double,等等. 所谓拆箱,就是和装箱的方向相反,将I

JavaSE8基础 Integer 包装类对象的值不变

礼悟:    好好学习多思考,尊师重道存感恩.叶见寻根三二一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼强身心,诚劝且行且珍惜. javaSE:1.8             os:windows7 x64            ide:MyEclipse 2017 代码 package jizuiku.demo; /** * Integer 包装类的对象不能改变其中的值 * * @author 给最苦 * @version V17.11.06 */ publi

Java 基础数据类型包装类的高频区间的数据缓存

一.Java的基础数据类型的包装类:Integer,Long,Double,Float,Boolean,Byte,Short,Character. 二.高频缓存区 其中Double和Float没有缓存,其他类型都有高频缓存区间.其高频缓存区间的缓存范围是:Boolean:使用静态final,就会返回静态值Byte:-128~127Short:-128~127Character:0~127Long:-128~127Integer:-128~127 如果所使用的包装类的值在这个缓存区间内,就会直接复

3.6 java基础总结①包装类,基本数据类型,String相互间转换

包装类,基本数据类型,String相互间转换 每个基本数据类型都有相对应的包装类型 包装类,基本数据类型,String相互间转换,这三者间的转换时很重要的: 一.String 转其他 String → 包装类型1.Integer(String str)调用包装类的带String参构造 String → 基本数据类型☆String → int调用包装类的parseInt方法 二.包装类转其他 → String调用包装类对象的ToString方法 → 基本类型①调用包装类的XXXValue方法包装类

java基础之包装类和基本类型

1.包装类对象是不可变的. 2.== ,在包装类和基本类型使用== 比较的时候,包装类会自动拆装为基本类型再比较 3.小于等于<=127 的boolean,byte,char,和介于-128~127之间的short 和int 被包装到固定地址的包装类对象中.但如果是new 出来的包装对象则会被分配新的地址,不再是固定的. 如: public static void main(String[] args) { // TODO Auto-generated method stub Integer a