一、概述:
(1)Java中为8中基本数据类型又准备了8种包种类,8种包装类型属于引用数据类型,父类是Object
(2)为什么要提供8个包装类:
当我们调用一个对象,要往一个方法里面传递参数时候,参数可能只限定传入一个Object对象,则无法直接传入基本数据类型,那就需要变成引用数据类型
,即传入基本数据类型的包装类
二、各基本数据类型所属的包装类
基本数据类型 | 包装类 | 包装类所属父类 |
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 |
double | java.lang.Double | java.lang.Number |
float | java.lang.Float | java.lang.Number |
char | java.lang.Char | java.lang.Object |
boolean | java.lang.Boolean | java.lang.Object |
2.1 八种包装类中,其中六种包装类都是数字对应的包装类,他们的父类都是Number,Number是一个抽象类,无法实例化对象,这些包装类方法它的子类都有,都可以调用,
这些方法是负责拆箱的。
Number中的方法:
byte byteValue() | 以byte形式返回指定的数组 |
abstract double doubleValue() | 以double的形式返回指定的数组 |
abstract float floatValue() | 以folat的形式返回指定的数组 |
abstract int intValue() | 以int的形式返回指定的数组 |
abstract long longValue() | 以long的形式返回指定的数组 |
short shortValue() | 以short的形式返回指定的数组 |
三、八种包装类,我们讲解Integer包装类,其它的使用方式差不多:
3.1构造方法:
Integer包装类,有两个构造方法
Integer(int value) |
创建一个构造对象,将int数字类型转换成Integer包装类 |
Integer(String s) |
创建一个构造对象,它表示 String 参数所指示的 int 值,字符串内容只能是数字。 |
package daily; public class date5_8 { public static void main(String[] args) { Integer i = new Integer(65);//jdk9开始已经不建议使用 Integer s = new Integer("97");//只能传入数字型的字符串,其它文字字符串会报错 System.out.println(i); System.out.println(s); } }
输出结果:65
97
3.2 Integer包装类的静态关键字:
static int MAX_VALUE |
值为 231-1 的常量,它表示 int 类型能够表示的最大值。 |
static int MIN_VALUE
|
值为 -231 的常量,它表示 int 类型能够表示的最小值。 |
static int SIZE | 用来以二进制补码形式表示 int 值的比特位数。 |
static Class<Integer> TYPE | 表示基本类型 int 的 Class 实例。 |
package daily; public class date5_8 { public static void main(String[] args) { System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); } } 运行结果: 2147483647 -2147483648
3.3Integer常用的方法:
static int parseInt(String s) | 将数字型的字符串,转换成整型 |
static int parseInt(String s,int radix) | 将数字型的字符串,转换成指定基数参数(10/2/8/16进制)的整型, (基数可以是 10, 2, 8, 或 16 等进制数) |
static String toBinaryString(int i) | 将十进制转换成二进制 |
static String toHexString(int i) | 将十进制转换成十六进制 |
static String toOctalString(int i) | 将十进制转换成八进制 |
static Integer ValueOf(int i) | 将一个int 包装成Integer |
static Integer ValueOf(String s) | 将一个String包装成Integer |
static String toString(int i) | 将一个整型i转换成字符串,并返回String类型 |
static String toString(int i,int radix) | 将一个整型i按基数参数进行进制转换,并转换成字符串,并返回String类型 |
四、自动拆箱/自动装箱
4.1在JDK1.5之后,支持自动拆箱/自动装箱的机制,不用再通过new关键字实现包装,无需再调用Number父类的抽象方法进行转换成基本数据类型
装箱:基本数据类型转换成引用数据类型
拆箱:引用数据类型转换成基本数据类型,有了自动拆箱后,Number类中的方法就用不到了
package daily; public class date5_8 { public static void main(String[] args) { //装箱:基本数据类型转换成引用数字类型,需要new关键字 Integer i = new Integer(500); Double j = new Double(250.0); //自动装箱:无需new关键字 Integer k = 510; //拆箱:引用数据类型调用number包装类的抽象方法进行拆箱 int i1 = i.intValue(); double j1 = j.doubleValue(); //自动拆箱:将引用数据类型自动转换成基本数据类型,不需要再调用Number的抽象方法进行拆箱 int k1 = k; System.out.println(i1); System.out.println(j1); //双等号==运算符不会自动触发自动拆箱机制,只有+ - * /,和其它关系运算符会触发 System.out.println(k1+1); System.out.println(i>j); } } 运行结果: 500 250.0 511 true
4.2 通过==来比较Integer对象:integer类加载的时候,会自动往方法区的整数型常量池,加载-128到127的数据
a.当Integer创建的不同对象数据范围不在[-128,+127]时,会在栈内存创建新的对象
package daily; public class date5_8 { public static void main(String[] args) { Integer a = 1000; //a是个引用保存内存地址指向对象,等价于 Integer a = new Integer(1000) Integer b = 1000; //b是个引用保存内存地址指向对象,等价于 Integer a = new Integer(1000) System.out.println(a==b);//==比较的是两个对象的内存地址,==运算符不会触发自动拆箱机制 } } 运行结果: false
内存分析:
b.当Integer创建的不同对象数据范围在[-128,+127]时,不会创建新的对象,而是共同的去引用去字符串常量池里面该数据的内存地址
package daily; public class date5_8 { public static void main(String[] args) { Integer a = 127; //数据127没有超过范围,则取引用方法区的整数型常量池该数据的内存地址 Integer b = 127; // System.out.println(a==b);//==比较的是两个对象的内存地址,==运算符不会触发自动拆箱机制 } } 运行结果: true
内存分析:
面试题:
(1)String为什么是不可变的?
不可变是指双引号里的内容不可变,即放到方法区的字符串常量池字符串对象不可变,但引用是可以变得,
String类中有一个byte[]数组,这个byte数组采用了final修饰,因为数组一旦创建长度不可变,
并且被final关键字修饰的引用一旦指向某个对象之后,不能再指向其它对象,所以String是不可变的!
(2)StringBuffer/StringBuilder 为什么是可变的?
StringBuffer/StringBuilder 内部实际上是一个byte[]数组,这个byte数组没有被final关键字修饰,StringBuffer/StringBuilder的初始化容量是16,
当存满后会自动扩容,底层调用了数组拷贝的方法System.Arraycopy()...是这样扩容的,所以StringBuffer/StringBuilder 适用于字符串的拼接。