int与Integer的区别
2022/5/3 6:15:21
本文主要是介绍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与Integer的区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器
- 2024-11-26Java云原生资料:新手入门教程与实战指南
- 2024-11-26JAVA云原生资料入门教程
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程