⛳️我们为什么要创建包装类?
️️️️ Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类,包装类就是将基本数据类型封装成一个类,让这个基本数据类型作为类的一个属性
-
包装类(如:Integer,Double等)这些类封装了一个相应的基本数据类型数值,并为其提供了一系列操作方法。
八种数据类型对应的包装类:
基本数据类型 | 对应包装类 | 包装类的父类 |
---|---|---|
byte | java.lang.Byte | java.lang.Number |
short | java.lang.Short | java.lang.Number |
int | java.lang.Integer | java.lang.Number |
long | java.lang.Long | java.lang.Number |
float | java.lang.Float | java.lang.Number |
double | java.lang.Double | java.lang.Number |
boolean | java.lang.Boolean | java.lang.Object |
char | java.lang.Character | java.lang.Object |
注意:
-
java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);
-
八种基本数据类型的包装类,除了char的是Character、int类型的是Integer,其他都是首字母大写;
-
对应包装类的直接父类:前6个由于是数,直接父类为Number,而后两个的直接父类就是Object类;
对于包装类来说,这些类的用途主要包含两种:
● 作为和基本数据类型对应的类类型存在。
● 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
常用常量:
①SIZE:表述这个具体对象的value值的二进制表示形式下的位数
②BYTES:表示这个包装类对应基本类型的字节数(byte)
-
一个字节(byte)==八位(bit);
-
比如:Integer对应的基本数据类型就是int类型,一个int类型的对象占四个字节
③ MAX_VALUE: 表示 int 型可取的最大值
④ MIN_VALUE: 表示 int 型可取的最小值
案例:
System.out.println(Integer.MIN_VALUE);//int类型可取的最小值:-2147483648
System.out.println(Integer.MAX_VALUE);//int类型可取的最大值:2147483647
System.out.println(Integer.BYTES);//int类型的字节数:4
System.out.println(Integer.SIZE);//int类型的二进制位数:32
⛳️包装类常用属性方法
-
以下都以Integer为例
1.构造方法
①Integer(int a);
-
以 int 型变量作为参数创建 Integer 对象,实例代码如下:
Integer a = new Integer(8);
②Integer(String a);
-
以 String 型变量作为参数创建 Integer 对象,实例代码如下:
Integer number=new Integer("8");
2.比较方法
①public static int compareTo(Integer anotherInteger );
-
在数字上比较两个 Integer 对象,如果这两个值相等,则返回 0;如果调用对象的 数值小于 anotherInteger 的数值,则返回负值;如果调用对象的数值大于anotherInteger 的数值,则返回正值
②public boolean equals(Object IntegerObj );
-
比较此对象与指定对象是否相等
③public int max(int a,int b);
-
返回a、b中数值大的
④public int min(int a,int b);
-
返回a、b中数值小的
3.转换方法
①public static toBinaryString(int i);
-
十进制转为二进制形式
②public static String toHexString(int i);
-
十进制转为十六进制形式
③public static String toOctalString(int i);
-
十进制转换为八进制
案例:
public class IntegerDemo1 {
public static void main(String[] args) {
//转2进制
System.out.println(Integer.toBinaryString(3));//11
//转16进制
System.out.println(Integer.toHexString(17));//11
//转8进制
System.out.println(Integer.toOctalString(9));//11
}
}
④public int intValue();
-
返回这个对象的value值
⑤public static int parseInt(String s);
-
将String类型的实参转换为int类型
-
注意:在转换时要保证这个String实参可以转换为int类型,如果这个字符串中包含有字母,那么就会出现转换异常
⑥public String toString();
-
返回一个表示该Integer 值的 String 对 象
⑦static Integer valueOf(int i);
-
将int类型的数值转换为Integer类型
⑧static Integer valueOf(String s);
-
将String类型的转换为Integer类型
案例:
public class IntegerDemo1 {
public static void main(String[] args) {
Integer i1 = new Integer(10);//基本类型包装到对象中
int i2 = i1.intValue();//把对象中的基本类型取出来
int i3 = Integer.parseInt("10");//将String类型转为int类型
i1.toString();//将int包装类型转为String类型
Integer i4 = Integer.valueOf(10);//将基本类型转为引用类型
Integer i5 = Integer.valueOf(10);//将String类型转为引用类型
}
}
⛳️自动装箱和自动拆箱
1.概念
-
简介:jdk1.5之后的新特性。该特性是编译器认可的,是在编译器自动将基本数据类型和包装类相互转换,节省了麻烦。
-
自动装箱:java编译器自动将基本数据类型转换为包装类,自动调用的是valueOf方法
-
自动拆箱:java编译器自动将包装类转换为基本数据类型,拆箱的时候自动调用的是xxxValue方法
案例:
public void IntegerDemo() {
//自动装箱
Integer a=12;//原理是Integer a = Integer.valueOf(12);
//自动拆箱
int b=a+1;//原理是int b = a.intValue()+1;
Integer c=123;
Integer d=123;
Integer e=c+d;
/*原理为Integer e=Integer.valueOf(c.intValue()+d.intValue());*/
}
2.valueOf()方法源码研究
-
按住ctrl键,鼠标点击该方法即可查看源码,下面以Integer类的valueOf(int i)为例
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
-
理解:由于我们经常会将-128-127之间的数进行包装成类,所以我们就在Integer的内部定义了一个IntegerCache结构,IntegerCache中定义了Integer [] 数组在这个数组中保存了-128-127范围之间的整数,我们使用自动装箱的方式给Integer赋值时, Integer类的valueOf(int i)方法首先会判断i是否在-128~127之间,如果在的话,就返回的对象是Integer类中静态数组cache中的对象,如果不是在这之间,就会重写创建一个新的对象。
通过查看其它类该方法的源码之后,可以得到该表:
包装类 | valueOf(X i)返回对象原则 |
Byte | 直接取,数组范围为(-128,127),且byte值的范围也是(-128,127) |
Short | (-128,127)之间在数组中取,否则new |
Integer | (-128,127)之间在数组中取,否则new |
Long | (-128,127)之间在数组中取,否则new |
Float | 直接new |
Double | 直接new |
Boolean | 直接返回,不new |
Character | (0,127)之间从数组中取,否则new |
3.包装类比较
/*
自动装箱时采用valueOf方法,由于127在静态数组的范围内,所以不是new的,
而128的两个引用是指向 new出现对象的,所以第一个是true,第三个是false
而包装类和基本数据类型比较时,只要数值是相等的,就相等
*/
public class IntegerDemo {
public static void main(String[] args) {
Integer a1=127;
Integer a2=127;
int a3=127;
Integer b1=128;
Integer b2=128;
int b3=128;
System.out.println(a1==a2);//true
System.out.println(a1==a3);//true
System.out.println(b1==b2);//false
System.out.println(b1==b3);//true
}