Java的包装类(装箱和拆箱面试题)

1.为什么要有包装类(或封装类)

为了使基本数据类型的变量具有类的特征,引入包装类。

2.基本数据类型与对应的包装类:

在这里插入图片描述

3.装箱和拆箱

基本数据类型包装成 包装类的实例—装箱

通过包装类的构造器实现:
int i= 500; Integer t = new Integer(i);

还可以通过字符串参数构造包装类对象:
    Float f = new Float(4.56);
    Long l = new Long(“asdf”); //NumberFormatException 报错 不是一个类型

获得包装类对象中 包装的基本类型变量—拆箱

调用包装类的.xxxValue()方法:
    boolean b = Boolean.booleanValue();

JDK1.5之后,支持自动装箱自动拆箱。但类型必须匹配


	public void test3(){
		
		//自动装箱:基本数据类型 --->包装类
		int num2 = 10;
		Integer in1 = num2;//自动装箱
		
		boolean b1 = true;
		Boolean b2 = b1;//自动装箱
		
		//自动拆箱:包装类--->基本数据类型
		System.out.println(in1.toString());
		int num3 = in1;//自动拆箱
		
	}

字符串转换成 基本数据类型

通过包装类的构造器实现:
    int i= new Integer(12);
通过包装类的parseXxx(String s)静态方法:
    Float f = Float.parseFloat(12.1);

包装类在实际开发中用的最多的在于字符串变为基本数据类型。
    String str1 = "30" ;
    String str2 = "30.3" ;
    int x = Integer.parseInt(str1) ;// 将字符串变为int型
	float f = Float.parseFloat(str2) ; // 将字符串变为int型

基本数据类型转换成字符串

调用字符串重载的valueOf()方法:

String fstr= String.valueOf(2.34f);

更直接的方式:String intStr = 5 + “”;

面试题:

如下两个题目输出结果相同吗?各是什么

Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);//1.0    因为 要使得上述三目运算编译通过 冒号前后的类型要一致,
所以会对int自动类型提升为double --->1.0 
(三目运算符中IntegerDouble先转为intdouble的基本数据类型去做比较)Java 中,当条件表达式的两个分支类型不一致时,会进行类型转换以满足统一的类型要求在这种情况下,会发生数值类型的自动提升。
根据 Java 的数值类型转换规则,Integer 类型可以自动转换为更宽容的数值类型,例如 double。
而 Double 类型本身就是 double 类型的包装类,因此无需进行类型转换。

在这个条件表达式中,由于 new Integer(1)Integer 类型,而 new Double(2.0)Double 类型,
Java 在进行类型转换时会选择更宽容的类型,将整数类型的 1 自动转换为浮点数类型的 1.0。因此,最终的输出结果为 1.0。

如果希望输出结果为整数 1,可以将条件表达式中的 new Double(2.0) 改为整数类型的 2,
即 true ? new Integer(1) : 2。这样,整数类型的 1 将会被赋值给 o1,输出结果就是 1public void test3() {
		Integer i = new Integer(1);
		Integer j = new Integer(1);
		System.out.println(i == j);//false 比较地址(new一次生成一个地址)
		
		//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
		//保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在
		//-128~127范围内时,可以直接使用数组中的元素,不用再去new了。目的:提高效率
		
		Integer m = 1;
		Integer n = 1;
		System.out.println(m == n);//true 没有new新地址 用的是缓存中的1

		Integer x = 128;//相当于new了一个Integer对象  因为缓存没有128
		Integer y = 128;//相当于又new了一个Integer对象
		System.out.println(x == y);//false
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值