Day19 包装类 Integer底层
一、包装类
1、概念: 包装类(Wrapper Class)是一种用于将基本数据类型转换为对象的类。Java中的基本数据类型(如int、char、boolean等)是非对象的,为了能够在需要对象的上下文中使用它们,Java提供了对应的包装类。
2、理解: 8种基本数据类型对应类 :
1. Boolean:对应boolean
2. Byte:对应byte
3. Short:对应short
4. Integer:对应int
5. Long:对应long
6. Float:对应float
7. Double:对应double
8. Character:对应char
3、出现原因:Java是一种纯面向对象语言,但是java中有8种基本数据类型,破坏了java为纯面向对象的特征。为了承诺在java中一切皆对象,java又给每种基本数据类型分别匹配了一个类,这个类我们称之为包装类/封装类。
注意:每个基本数据类型都有一个与之匹配的包装类。int的包装类的写法为Integer、char的包装类的写法是:Character,其余基本数据类型的包装类均是基本类型的首字母大写。
3、包装类常用方法
-
将基本数据类型转换为包装类对象:
java复制代码int num = 10; Integer obj = Integer.valueOf(num); // 将int转换为Integer对象
-
从包装类对象获取基本数据类型的值:
java复制代码Integer obj = new Integer(20); int num = obj.intValue(); // 从Integer对象获取int值
-
自动装箱(Autoboxing)和拆箱(Unboxing):
java复制代码Integer obj = 30; // 自动装箱,将int转换为Integer对象 int num = obj; // 自动拆箱,将Integer对象转换为int
-
使用包装类提供的方法:
java复制代码Integer num = 40; int binary = Integer.parseInt("1010", 2); // 将二进制字符串转换为int String hex = Integer.toHexString(num); // 将int转换为十六进制字符串
装箱:把基本数据类型包装为对应的包装类对象
Integer i1 = new Integer(10); // 利用构造方法
Integer i2 = Integer.valueOf(10); //利用包装类中的静态方法
**拆箱:**把包装类对象转换为对应的基本数据类型。
int i3= i1.intValue(); //返回包装类对象对应的基本数据
前面的装箱和拆箱操作,相对较麻烦。自jdk1.5开始,java增加的对基本数据类型的自动装箱和自动拆箱操作。
java编译器在编译时期会根据源代码的语法来决定是否进行装箱或拆箱。
a、 自动装箱:可以直接把一个基本数据类型赋值给包装类
例如: Integer i1 = 10; //自动装箱操作
b、 自动拆箱:可以直接把一个包装类对象,赋值给基本类型
例如:int a = new Integer(3); //自动拆箱。
自动装箱和自动拆箱,简化了对包装类的操作。
注意:需要理解自动装箱和拆箱的本质(底层也是手动装拆箱)
二、Integer底层原理
1、概念: Integer
是java.lang.Integer
类的包装类,用于表示整数数据类型int的对象形式。Integer
类是不可变的,即一旦创建了Integer
对象,其值就不能被修改。
2、描述:判断输入的int值是否在-128~127区间内,如果在就从Integer的缓存类的缓存数组中获取对象,如果不在就重新new对象。(引用类型的“==”是判断两个引用是否指向同一个对象)
3、主要底层原理:
-
缓存机制:
- Java在内部维护了一个整数缓存池,范围为-128到127。
- 当调用
Integer.valueOf(int)
方法创建一个Integer
对象时,如果参数在缓存范围内,将返回缓存中的对象,而不是新建对象。 - 这种缓存机制可以提高性能,节省内存,避免频繁创建和销毁
Integer
对象。
-
装箱和拆箱:
- 装箱(Autoboxing):将基本数据类型转换为对应的包装类对象。
- 拆箱(Unboxing):将包装类对象转换为对应的基本数据类型。
- Java编译器会自动进行装箱和拆箱操作,使得基本数据类型和包装类之间的转换更加方便。
-
valueOf()方法:
Integer.valueOf(int)
方法用于返回指定int值的Integer
实例。- 该方法利用缓存机制,如果参数在缓存范围内,则返回缓存中的对象,否则创建新的
Integer
对象。
-
intValue()方法:
Integer.intValue()
方法用于将Integer
对象转换为int类型的值。- 这个方法是获取
Integer
对象包含的int值的常用方式。
-
常量池:
- Java中的整数常量池是在编译期间生成的,包含在-128到127范围内的整数。
- 当使用整数常量时,会直接从常量池中获取,而不会创建新的
Integer
对象。
注意:
Integer
类的底层原理主要涉及缓存机制、装箱拆箱、valueOf()方法等,这些特性使得Integer
类在处理整数数据时更加高效和方便。理解这些底层原理有助于更好地利用Integer
类,并避免一些潜在的性能问题。