1.为什么需要包装类?
Java并不是纯面向对象的语言。虽然我们常说Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的。而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要转换成double类型等。那么,想实现字符串与基本数据之间转换怎么办呢?
Java提供8种基本数据类型对应的包装类,使得基本数据类型变量具有类的特征。
2.使用包装的好处
可以提供更多的操作基本数值的功能。
3.包装类的分类
- 数值型包装类(Number的直接子类):Byte、Double、Float、Short、Long、Integer
- 对象型包装类(Object的直接子类):Boolean、Character(char)
4.装箱和拆箱(以int类型来举例)
- 装箱:将基本数据类型变为包装类对象。调用每个包装类提供的构造器
- 拆箱:将包装类中包装的基本数据类型取出。利用xxValue( )方法
构造器 | 功能 |
---|---|
Integer(int value) | 构造一个新分配的Integer对象,它表示指定的int值 |
Integer(String s) | 构造一个新分配的Integer对象,它表示String参数所指的int值 |
成员方法 | 功能 |
int intValue() | 以int类型返回该Integer的值 |
static int parseInt(String s) | 将字符串参数作为有符号的十进制整数进行解析 |
static String toString() | 返回一个表示该Integer值的int对象 |
/**
* 基本数据类型-->包装类
*/
@Test
public void test1() {
int num1 = 10;
Integer in1 = new Integer(num1);
//Integer重写了toString()方法,所以输出in1的内容
System.out.println(in1.toString());
Integer in2 = new Integer("123");
System.out.println(in2.toString());
}
/**
* 包装类-->基本数据类型
*/
@Test
public void test2() {
Integer in = new Integer(10);
int num = in.intValue();
//包装类是类类型的,所以不能做运算,能做运算就说明已转成基本数据类型
System.out.println(num + 1);
}
5.阿里编码规范:int or Integer?
- 强制所有POJO类(简单Java类)属性必须使用包装类。
- 强制RPC方法返回值和参数必须使用包装类
- 推荐所有的局部变量使用基本类型
6.自动装箱与拆箱
以上操作采用的均是手工装箱和拆箱。在JDK1.5之后,提供了自动拆装箱的机制,最为重要的是,由于此类机制的存在,可以直接利用包装类的对象进行各种数学计算。
public class Test {
public static void main(String[] args) {
Integer i = 10;//自动装箱
System.out.println(i + 10);//20
}
}
7.包装类与字符串的转换
7.1 String–>int
- 方式1:int intValue()
public class Test01 {
public static void main(String[] args) {
Integer i = new Integer("10");
int a = i.intValue();
System.out.println(a + 10);//20
}
}
- 方式2: static int parseInt(String s)
public class Test02 {
public static void main(String[] args) {
int b = Integer.parseInt("10");
System.out.println(b + 10);//20
}
}
7.2 int–>String
- 方式1:" "+基本数据变量
public class Test03 {
public static void main(String[] args) {
Integer i = new Integer(10);
String s = "" + i;
System.out.println(s + 10);//1010
}
}
- 方式2:String toString()
public class Test {
public static void main(String[] args) {
String s = Integer.toString(10);
System.out.println(s + 10);//1010
}
}
- 方式3:调用String类提供的静态方法valueof(基本类型)【不产生垃圾空间,推荐使用】
public class Test {
public static void main(String[] args) {
Integer i = new Integer(10);
String s = String.valueOf(i.intValue());
System.out.println(s + 10);//1010
}
}
8.面试题
package 转型;
import org.junit.Test;
/**
* @BelongsProject: untitled
* @BelongsPackage: 转型
* @Author: mcc
* @CreateTime: 2020-08-21 07:58
* @Description:
*/
public class InterviewTest {
@Test
public void test1() {
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);
/**
* 编译时要将类型统一,所以INteger提升为Double类型,所以执行后输出1.0
*/
}
@Test
public void test2() {
Object o2;
if (true) {
o2 = new Integer(1);
} else {
o2 = new Double(2.0);
}
System.out.println(o2);
/**
* 从上到下执行,由于是true只进入第一个括号,所以执行后输出1
*/
}
@Test
public void test3() {
/**
* 首先,对于引用数据类型来说==均比较地址值
*/
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
/**
* Integer内部定义了IntegerCache结构,IntegerCache定义了Integer[],
* 保存了从-128~127范围的整数,如果我们使用自动装箱的方式,给Integer赋值
* 范围在-128~127中时,可以直接使用数组中的元素,不用再去new了。目的:提高
* 效率
*/
Integer m = 1;
Integer n = 1;
System.out.println(m == 1);//true
/**
* x,y相当于各自new了一个Integer对象
*/
Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
}
}