int与Integer的区别
作者:互联网
int与Integer的区别
两种数据类型
- 基本数据类型:boolean、byte、short、char、int、long、float、double
- 引用数据类型:数组、接口、类、string
Java把基本数据类型封装成了不同的类
数据类型 | 类类型 |
---|---|
boolean | Boolean |
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
int与Integer对比
- Integer是int的包装类;int是基本数据类型
- Integer变量必须实例化后才能使用;int变量不需要
- Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值
- Integer的默认值是null;int的默认值是0
int 与 Integer的深入对比
-
由于Integer变量实际上是对Integer类的一个引用,所以两个通过new生成的Integer变量永远不相等(因为new 生成的是两个对象,其内存地址不同)
Integer num01 = new Integer(100); Integer num02 = new Integer(100); System.out.print(num01 == num02);//false
-
Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类 Integer 和基本数据类型 int 比较时,Java 会自动拆包成int ,然后进行比较,实际上就变成两个int 变量的比较)
Integer num01 = new Integer(100); int num02 = 100; System.out.print(num01 == num02);//true
-
非new生成的Integer和new Integer() 生成的变量比较时,结果为false(因为非new生成的Integer变量指向的是静态常量池中cache数组中存储的指向了堆中的Integer对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的对象引用地址不同)
Integer num01 = new Integer(100); Integer num02 = 100; System.out.print(num01 == num02);//false
-
对于两个非new 生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
Integer num01 = 100; Integer num02 = 100; System.out.print(num01 == num02);//ture Integer num03 = 128; Integer num04 = 128; System.out.print(num03 == num04);//false
(Java在编译Integer num01 = 100;时,会翻译成Integer num01 = Integer.valueOf(100)。而Java API 中对Integer 类型的valueOf的定义如下,对于-128至127之间的数,会进行缓存,Integer num01 = 127时,就会直接从缓存中取,就不会new了)
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)
- 加大对简单数字的重复利用,Java定义在自动装箱时对于在-128~127之内的数值,它们被装箱成Integer对象后,会在内存中被重用,始终只存在一个对象
- 而如果在-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(){}
}
标签:区别,int,数据类型,num01,new,128,Integer 来源: https://www.cnblogs.com/jk001/p/16217441.html