integer是什么数据类型对应的包装类,在java中,int和integer有什么区别

  integer是什么数据类型对应的包装类,在java中,int和integer有什么区别

  00-1010 1.包装类型是什么?2.基本型和包装型有什么区别?3.解释一下自动打包和自动拆包?4.int和Integer有什么区别?5.new 6生成的两个整型变量的比较。整数变量和int变量的比较。非new和new Integer()生成的整型变量的比较8。非新生成的两个整数对象的比较

  

目录
Java已经为每一种基本数据类型引入了相应的封装类型,int的封装类是Integer。从Java 5开始,引入了自动打包/解包机制,将基本类型转换为打包类型的过程称为打包;相反,将封装类型转换为基本类型的过程称为解包,这样两者可以相互转换。

  Java为每个原始类型提供了一个包装器类型:

  原始类型: Boolean、char、byte、short、int、long、float、double封装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double

  00-1010包装类型可以为空,但基类型不能。类型可以用于泛型,但基本类型不能。泛型不能使用基本类型,因为使用基本类型时会出现编译错误。因为泛型在编译时会被擦除,最后只会保留原类型,而原类型只能是Object类及其子类3354。基本类型是一个特例。listint list=new ArrayList();//提示语法错误,请插入“dimensions”以完成referencetypelistinteger list=new ArrayList();类型基本上比包装类型效率高。类型基本上直接在堆栈中存储特定的值,而包装类型在堆中存储引用。显然,与基本型相比,封装型需要占用更多的内存空间。

  00-1010在解释自动打包和解包之前,我们先了解一下Integer.valueOf()和IntegerCache方法。

  整数值()

  public static Integer value of(String s,int radix)抛出NumberFormatException { return Integer . value of(parse int(s,radix));}/** * (1) Within -128~127:静态常量池中的缓存数组为静态final类型,缓存数组对象将存放在静态常量池中。*缓存数组中的元素不是静态final类型,而是cache[k]=new Integer(j)。*那么这些元素都存储在堆中,但是缓存数组对象存储的是指向堆的整数对象(引用地址)。* * (2) Outside -128~127:创建一个新的整数对象并返回。*/public static Integer value of(int I){ assert Integer cache . high=127;if(I=integer cache . low I=integer cache . high){ return integer cache . cache[I(-integer cache . low)];}返回新的整数(I);}调用Integer.valueOf()方法,即如果值为-128~127,则直接返回静态常量池中的缓存数组对象,否则调用new Integer()创建对象。

  IntegerCache

  /* * *缓存支持自动装箱的对象标识语义-128和127(含)。*缓存在第一次使用时初始化。缓存的大小可以通过-xx: autoboxcachemax=size选项来控制。*在虚拟机初始化期间,java.lang.Integer.IntegerCa

  che.high属性可以设置并保存在私有系统属性中 */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; 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() {} }自动装箱:将基本数据类型重新转化为对象

  

public class Test { public static void main(String[] args) { // 声明一个Integer对象,用到了自动的装箱:解析为:Integer num = Integer.valueOf(9); Integer num = 9; } } 
9是属于 int 基本数据类型的,原则上它是不能直接赋值给一个对象 Integer 的。但jdk1.5 开始引入了自动装箱/拆箱机制,就可以进行这样的声明,自动将基本数据类型转化为对应的封装类型,成为一个对象以后就可以调用对象所声明的所有的方法。

  自动拆箱:将对象重新转化为基本数据类型

  

public class Test { public static void main(String[] args) { / /声明一个Integer对象 Integer num = 9; // 进行计算时隐含的有自动拆箱 System.out.print(num--); } } 
因为对象时不能直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除。

  

  

4、int 和 Integer 有什么区别?

Integer是int的包装类;int是基本数据类型; Integer变量必须实例化后才能使用;int变量不需要; Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; Integer的默认值是null;int的默认值是0。

  

5、两个new生成的Integer变量的对比

Integer i = new Integer(10000);Integer j = new Integer(10000);System.out.print(i == j); //false
由于Integer变量实际上是对一个Integer对象的引用,且生成的变量是位于堆上的,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个堆中对象,其内存地址不同)。

  

  

6、Integer变量和int变量的对比

int a = 10000;Integer b = new Integer(10000);Integer c=10000;System.out.println(a == b); // trueSystem.out.println(a == c); // true
Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量数值的比较)

  

  

7、非new生成的Integer变量和new Integer()生成变量的对比

Integer b = new Integer(10000);Integer c=10000;System.out.println(b == c); // false
非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为 Integer c=10000 等价于 Integer.valueOf(10000) ,如果其中的数值在 -128 ~ 127 之间的话,那么 c 指向的就是静态常量池中的对象,否则就是指向堆中所生成的对象。而 new Integer() 所生成的对象位于堆中,所以结果一定为 false

  

  

8、两个非new生成的Integer对象的对比

Integer i = 100;Integer j = 100;System.out.print(i == j); //trueInteger l = 128;Integer r = 128;System.out.print(l == r); //false
因为 Integer i =100 等价于 Integer.valueOf(100) ,由于其中的数值在 -128 ~ 127 之间,那么 i 和 j 指向的都是静态常量池中的对象,所以是同一个对象,所以结果为 true

  因为 Integer l =128 等价于 Integer.valueOf(128) ,由于其中的数值在 -128 ~ 127 之外,那么 l 和 r 指向的都是其各自在堆中生成的对象,所以是不同的对象,所以结果为 false

  到此这篇关于Java 详解包装类Integer与int有哪些共通和不同的文章就介绍到这了,更多相关Java 包装类Integer内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: