> 文章列表 > 8种包装类型

8种包装类型

8种包装类型

包装类型

概述

因为8种基本数据类型不够用 , 所以java为8种基本数据类型又对应准备了8种包装类型。8种包装类属于引用数据类型,父类是Object

调用doSome()方法的时候需要传一个数字进去。但是数字属于基本数据类型,而doSome()方法参数的类型是Object。

  • 需要把基本数据类型的数字包装成对象传进去
  • 包装类型是引用数据类型 , 一定重写了 toString()方法 , 将其转换成字符串方便输出
public class IntegerTest01 {//入口public static void main(String[] args) {// 把100这个数字经过构造方法包装成对象传进去。MyInt myInt = new MyInt(100);doSome(myInt);}public static void doSome(Object obj){//包装类型是引用数据类型 , 一定重写了 toString 方法 , 方便输出System.out.println(obj);}
}

这种包装类目前是我自己写的。实际开发中我们不需要自己写。

public class MyInt {int value;public MyInt() {}public MyInt(int value) {this.value = value;}//重写 toString 方法 , 方便输出@Overridepublic String toString() {return String.valueOf(value);}
}
基本数据类型名 包装数据类型名
byte java.lang.Byte(父类Number)
short java.lang.Short(父类Number)
int java.lang.Integer(父类Number)
long java.lang.Long(父类Number)
float java.lang.Float(父类Number)
double java.lang.Double(父类Number)
boolean java.lang.Boolean(父类Object)
char java.lang.Character(父类Object)

Number(数字对应的包装类的父类)

Number是一个抽象类,无法实例化对象。 Number类中负责拆箱的 xxxValue() 方法( 引用 -> 基本 )

  • 在java5之后,引入了一种新特性,自动装箱和自动拆箱 , 有了自动拆箱之后,Number类中的这些方法就用不到了
方法名 功能
byte byteValue() 以 byte 形式返回指定的数值
double doubleValue() 以 double 形式返回指定的数值
float floatValue() 以 float 形式返回指定的数值
int intValue() 以 int 形式返回指定的数值
long longValue() 以 long 形式返回指定的数值
shortValue() 以 short 形式返回指定的数值
public class IntegerTest02 {public static void main(String[] args) {// 基本数据类型 -(Integer构造方法的包装)->引用数据类型(装箱)Integer i = new Integer(123);// 将引用数据类型--(Number类中负责拆箱的 xxxValue() 方法)-> 基本数据类型float f = i.floatValue();System.out.println(f); //123.0// 将引用数据类型--(转换为)-> 基本数据类型(拆箱)int retValue = i.intValue();System.out.println(retValue); //123}
}

Integer类的构造方法

其它的包装类型和Integer包装类型的构造方法原理相同 , 都是实现装箱的功能

  • 在java5之后,引入了一种新特性,自动装箱和自动拆箱 , 有了自动装箱之后,包装类这些构造方法就用不到了
  • 虽然有了自动装箱的功能 , 但本质还是调用的包装类构造方法创建的对象
方法名 功能
Integer Integer(int) 将int类型的数字包装成Integer类型 , Java9之后不建议使用该构造方法了 , Integer 类的静态方法 valueOf 可实现相同功能
Integer Integer(String) 将String类型的数字包装成Integer类型 , 字符串的内容不是一个数字不可以包装成Integer。运行时出现数字格式化异常:NumberFormatException
public class IntegerTest03 {public static void main(String[] args) {// 将数字100转换成Integer包装类型(int --> Integer)Integer x = new Integer(100);System.out.println(x);// 将String类型的数字,转换成Integer包装类型(String --> Integer)Integer y = new Integer("123");System.out.println(y);// 字符串的内容不是一个“数字”不可以包装成Integer。运行时出现数字格式化异常:NumberFormatException//Integer a = new Integer("中文");//其它的包装类型和Integer包装类型的方法原理相同// double -->DoubleDouble d = new Double(1.23);System.out.println(d);// String --> DoubleDouble e = new Double("3.14");System.out.println(e);}
}

自动装箱/拆箱(方便编程)

在java5之后,引入了一种新特性,自动装箱和自动拆箱(+ - * / == 等运算符会触发自动拆箱机制 )

自动装箱:基本数据类型自动转换成包装类 (装箱可以理解为将低级包装成高级的过程)

  • 底层先使用的是 Integer 类的静态的 valueOf(int i)方法 , 根据数字的范围判断是从整数型常量池中拿 , 还是在堆中创建

自动拆箱:包装类自动转换成基本数据类型 (拆箱可以理解将高级拆分成低级的过程)

  • 底层使用的是 Number 类的静态的 intValue() 方法
public class IntegerTest05 {public static void main(String[] args) {// 基本数据类型 --(自动转换)--> 包装类型:自动装箱Integer x = 900;System.out.println(x);// 包装类型 --(自动转换)--> 基本数据类型:自动拆箱int y = x;System.out.println(y);}
}

基本数据类型 和 包装类型在做 + - * / == 等运算时包装类型会自动拆箱

//只有有基本数据类型,判断的是值是否相同
Integer i11=127;
int i12=127;
System.out.println(i11==i12); //trueInteger i13=128;
int i14=128;
System.out.println(i13==i14);//true// z保存的是一个Integer对象的内存地址
Integer z = 1000; // + 两边要求是基本数据类型的数字,z是包装类不属于基本数据类型,这里会进行自动拆箱。在java5之前你这样写肯定编译器报错。
System.out.println(z + 1);

整数型常量池

java中为了提高程序的执行效率,将 [-128到127] 之间的256个包装对象提前创建好, 放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要再new了,直接从整数型常量池当中取出来(复用率高)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5d2vQWil-1680778021411)(D:\\笔记\\java\\每章课堂画图\\03-常用类\\004-Integer的内存结构.png)]

public class IntegerTest06 {public static void main(String[] args) {//直接手动两个Integer对象Integer i = new Integer(1);Integer j = new Integer(1);System.out.println(i == j); //false//底层使用的是 Integer 类的静态的 valueOf(int i)方法 , 会根据数字的范围判断是从整数型常量池中拿 , 还是在堆中创建Integer m = 1; //底层 Integer.valueOf(1);Integer n = 1;//底层 Integer.valueOf(1);System.out.println(m == n); //trueInteger x = 128;//底层 Integer.valueOf(128);Integer y = 128;//底层 Integer.valueOf(128);System.out.println(x == y);//False}
}

valueOf源码

  • 如果 i 在 IntegerCache.low(-128)~IntegerCache.high(127),就直接从数组返回 . 如果不在 -128~127,就直接 new Integer(i)
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

包装类的测试

三元运算符是一个整体 , 运算时精度会提升到最高

public class WrapperExercise01 {public static void main(String[] args) {//三元运算符是一个整体 , 运算时精度会提升到最高Object obj1 = true? new Integer(1) : new Double(2.0);System.out.println(obj1);// 1.0//分别计算Object obj2;if(true)obj2 = new Integer(1);elseobj2 = new Double(2.0);System.out.println(obj2);//1}
}

Integer类的常用的方法

方法名 功能
static int parseInt(String s) 传参String,返回int , 字符串的内容要求是个数字 。 网页上文本框中输入的100实际上是"100"字符串 , 后台数据库中要求存储100数字,此时java程序需要将"100"转换成100数字
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 str) 将String类型的数字转化为Integer类型 , 字符串的内容不是一个数字不可以包装成Integer , 底层会对数字的范围判断
public class IntegerTest07 {public static void main(String[] args) {Integer a = new Integer("123");// static int parseInt(String s)// 传参String,返回int类型int retValue = Integer.parseInt("123"); System.out.println(retValue + 100);// NumberFormatException//int retValue = Integer.parseInt("中文"); // 其他包装类型原理相同double retValue2 = Double.parseDouble("3.14");System.out.println(retValue2 + 1); //4.140000000000001(精度问题)float retValue3 = Float.parseFloat("1.0");System.out.println(retValue3 + 1); //2.0// static String toBinaryString(int i)// 将十进制转换成二进制字符串。String binaryString = Integer.toBinaryString(3);System.out.println(binaryString); //"11" 二进制字符串// static String toHexString(int i)// 将十进制转换成十六进制字符串。String hexString = Integer.toHexString(16);System.out.println(hexString); // "10"//static String toOctalString(int i)// 将十进制转换成八进制字符串。String octalString = Integer.toOctalString(8);System.out.println(octalString); // "10"//static Integer valueOf(int i)// 将int类型的数字转化为Integer类型Integer i1 = Integer.valueOf(100);System.out.println(i1);// static Integer valueOf(String s)// 将String类型的数字转化为Integer类型Integer i2 = Integer.valueOf("100");System.out.println(i2);}
}

静态方法和静态属性

public class WrapperMethod {public static void main(String[] args) {System.out.println(Integer.MIN_VALUE); //返回int的最小值System.out.println(Integer.MAX_VALUE);//返回int最大值System.out.println("byte的最大值:" + Byte.MAX_VALUE);System.out.println("byte的最小值:" + Byte.MIN_VALUE);System.out.println(Character.isDigit('a'));//判断是不是数字System.out.println(Character.isLetter('a'));//判断是不是字母System.out.println(Character.isUpperCase('a'));//判断是不是大写System.out.println(Character.isLowerCase('a'));//判断是不是小写System.out.println(Character.isWhitespace('a'));//判断是不是空格System.out.println(Character.toUpperCase('a'));//转成大写System.out.println(Character.toLowerCase('A'));//转成小写}
}

String int Integer之间互相转换

转换图

Integer --> String : 直接拼接空字符串 , 调用 Integer 类重写后的 toString 方法 , 调用 String 类静态的的 valueOf方法

String --> Integer: 直接调用 Integer 类的构造方法 , 调用 Integer 类静态的的 valueOf方法

int --> String : 直接拼接空字符串

String --> int: 调用 Integer 类静态的的 parseInt 方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbAMthfR-1680778021412)(D:\\笔记\\java\\每章课堂画图\\03-常用类\\005-String Integer int三种类型的互相转换.png)]

public class IntegerTest08 {public static void main(String[] args) {// String --> intint i = Integer.parseInt("100"); // i1是100数字System.out.println(i + 1); // 101// int --> StringString s2 = i + ""; // "100"字符串System.out.println(s2 + 1); // "1001"// int --> Integer , 自动装箱Integer x = 1000;// Integer --> int , 自动拆箱int y = x;// String --> IntegerInteger k = Integer.valueOf("123");// Integer --> StringString str1 = k + "";String str2 = String.valueOf(k);String str3 = k.toString();}
}