包装类型
概述
因为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 方法 , 方便输出
@Override
public 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 -->Double
Double d = new Double(1.23);
System.out.println(d);
// String --> Double
Double 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); //true
Integer 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); //true
Integer 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);
else
obj2 = 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 --> int
int i = Integer.parseInt("100"); // i1是100数字
System.out.println(i + 1); // 101
// int --> String
String s2 = i + ""; // "100"字符串
System.out.println(s2 + 1); // "1001"
// int --> Integer , 自动装箱
Integer x = 1000;
// Integer --> int , 自动拆箱
int y = x;
// String --> Integer
Integer k = Integer.valueOf("123");
// Integer --> String
String str1 = k + "";
String str2 = String.valueOf(k);
String str3 = k.toString();
}
}