• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

int与Integer的区别

两种数据类型

基本数据类型:boolean、byte、short、char、int、long、float、double

引用数据类型:数组、接口、类、字符串

Java把基本数据类型封装成了不同的类

数据类型

类别类型

布尔型

布尔代数学体系的

字节

字节

短的

短的

性格;角色;字母

(同Internationalorganizations)国际组织

整数

长的

长的

漂浮物

浮动

两倍

两倍

int与Integer对比

Integer是int的包装类;Int是基本数据类型。

整数变量必须先实例化,然后才能使用;Int变量不是必需的。

Integer实际上是对对象的引用,指向这个新的Integer对象;Int是一个直接存储的数据值。

Integer的默认值为null;int的默认值是0。

int 与 Integer的深入对比

因为Integer变量实际上是对Integer类的引用,new生成的两个Integer变量永远不会相等(因为new生成两个内存地址不同的对象)。

Integer num01=新整数(100);

Integer num02=新整数(100);

system . out . print(num 01==num 02);//假

在比较整数变量和int变量时,只要两个变量的值相等,结果就为真(因为在比较包装类Integer和基本数据类型int时,Java会自动将其解包为int,然后进行比较,实际上就变成了两个int变量的比较)

Integer num01=新整数(100);

int num02=100

system . out . print(num 01==num 02);//真

当非生成的Integer与new Integer()生成的变量比较时,结果为false(因为非生成的Integer变量指向静态常量池中缓存数组中存储的Integer对象,而new Integer()生成的变量指向堆中新创建的对象,它们在内存中的对象引用地址不同)

Integer num01=新整数(100);

整数num02=100

system . out . print(num 01==num 02);//假

比较两个不是由new生成的Integer对象时,如果两个变量的值在-128到127的范围内,则比较结果为true,如果两个变量的值不在此范围内,则比较结果为false。

整数num01=100

整数num02=100

system . out . print(num 01==num 02);//true

整数num03=128

整数num04=128

system . out . print(num 03==num 04);//假

(Java正在编译整数num01=100,将被翻译成整数num01=integer.valueof (100)。Java API将整数类型的值定义如下。对于-128和127之间的数字,它将被缓存。当整数num01=127时,会直接从缓存中取出,不会是新的)

uage-java">public static Integer valueOf(int i){ assert IntegeCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high){ return IntegerCache.cache[i + (-IntegerCache.low)]; } return new Integer(i); }

自动装箱和自动拆箱

自动装箱:将基本数据数据类型重新转化为对象
public class Test{
    public static void main(String[]args){
        //声明一个Integer对象,用到了自动装箱:解析为Integer num = Integer num = Integer.valueOf(9);
        Integer num = 9;  }
}

9属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的。但jdk1.5之后就可以进行这样的声明,自动将基本数据类型转化为对应的封装类型,成为一个对象以后就可以调用对象声明的所有方法

自动拆箱:将对象重新转化为基本数据类型数据类型
public class Test{
    public static void main(String[] args){
        //声明一个Integer对象
        Integer num = 9;
        
        //进行计算时隐含的有自动拆箱
        System.out.print(num--);
    }
}

因为对象不能直接进行运算的,而是要转化基本数据类型后才能进行加减乘除。

//装箱
Integer num = 10;
//拆箱
Integer num01 = num;

深入解析Integer

问题描述
public class Test{
    public static void main(String[] args){
        //在-128~127之外的数
        Integer num01 = 128;
        Integer num02 = 128;
        System.out.println(num01 == num02);//false
        
        //在-128~127之内的数
        Integer num03 = 9;
        Integer num04 = 9;
        System.out.println(num03 == num04);//ture
    }
}

解析原因:归结于Java对于Integer与int的自动装箱与拆箱的设计,是一种模式:

享元模式(flyweight)

  1. 加大对简单数字的重复利用,Java定义在自动装箱时对于在-128~127之内的数值,它们被装箱成Integer对象后,会在内存中被重用,始终只存在一个对象
  2. 而如果在-128~127之外的数,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象
Integer源码解析

给一个Integer对象赋于一个int值时,会调用Integer类的静态方法valueOf,源码如下:

public static Integer valueOf(String s, int radix) throws NumberFormatException{
    return Integer.valueOf(parseInt(s,radix));
}
/**
1. 在-128~127之内:静态常量池中cache数组时static final类型,cache数组对象会被存储于静态常量池中。
cache数组里的元素去不是static final 类型,而是cache[k] = new Integer(j++),
那么这些元素是存储于堆中,只是cache数组对象存储的时指向了堆中Integer对象(引用地址)
2.在-128~127之外:新建一个Integer对象,并返回。
*/
public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= Integer.low && i <=IntegerCache.high){
        return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
}

IntegerCache是Integer的内部类,源码如下:

private static class IntegerCache{
    static final int low = -128;
    static final int high;
    static final Integer Cahe[];
    
    static{
        //high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue = sun.misc.Vm.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if(integerCacheHighPropValue != null){
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i,127);
            //Maximum array size is Integer.MAX_VALUE
            h = Math.min(i,Integer.MAX_VALUE - (-low)-1);
        }
        high = h;
        
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++){
            cache[k] = new Integer(j++);//创建一个对象
        }
        
    }
    private IntegerCache(){}
}
Link to comment
Share on other sites