包装类-Wrapper

包装类的分类

  1. 针对八种基本数据类型相应的引用类型-包装类
  2. 有了类的特点,就可以调用对应的类中的方法
    在这里插入图片描述
    在这里插入图片描述

装箱和拆箱

Java是一种面向对象的编程语言,学习Java时就被明确灌输了一个概念:OOP,即面向对象编程。一切皆对象。但是基本类型是不具备Java中对象的某些特征,对象内部可以封装一系列属性和行为,但是这些在基本数据类型中都无法满足,所以对应的包装类型就应运而生了。也就是说单独的一个 int a = 100;那么这个a它只能是代表一个值,并无法把它当作一个对象来操作。
装箱就是把 值类型变成引用类型的一个过程,拆箱就是把一个引用类型重新变成值类型的过程。只有装过箱的才能拆箱

jdk5以前是需要手动装箱拆箱的:

演示:手动装拆箱

public class test1 {
    public static void main(String []args){
        int a = 100;
        //手动装箱
        Integer integer = new Integer(a);//第一种
        Integer integer1 = Integer.valueOf(a);//第二种
        System.out.println(integer);//输出100
        System.out.println(integer1);//输出100
        //手动拆箱
        int b = integer.intValue();
        System.out.println(b);//输出100
    }
}

运行结果:
100
100
100
由运行结果可以看出,所谓装箱拆箱,就是把一个基本类型变成引用类型的,然后又从引用类型变成基本类型的一种方式。
之所以要这样玩,是为了可以使用引用类型的方法等等…,但所保存的值是不会变化的

jdk5以后就是自动装拆箱了
演示:

public class test1 {
    public static void main(String []args){
        int a = 100;
        //自动装箱
        Integer integer = a;//其实底层还是使用Integer的方法实现的只不过省略了
        System.out.println(a);
        //自动拆箱
        int b = integer;
        System.out.println(b);//同理也是使用的方法,但是省略了
    }
}

运行结果:
100
100

其他的包装类也是类似的

包装类小测试

  1. 下面代码正确吗
Double d = 100d;
Float f = 1.5f;

正确,对包装类的自动装箱 等同于调用包装类的valueOf();方法

  1. 下面代码输出结果是什么
Object obj = true? new Integer(1) : new Double(2.0);
System.out.println(obj);

三元运算符,当为真是走第一个 为假时走第二个 所以走new Integer(1),而又因为当两种数据类型在进行比较时,会自动转换成比较大的类型,所以 1 会变成1.0,输出结果1.0

  1. 下面代码输出结果是什么
Object obj2;
if(true){
obj2 = new Ineger(1);
}else{
obj2 = new Double(2.0);}
System.out.pritln(obj2)

布尔值为真,走obj2 = new Ineger(1);这里是向上转型,所以输出 1

基本数据的包装类型与String类型的相互转换

把Intger类型转成String类型

public class test1 {
    public static void main(String []args){
        Integer n1 = 12345;
        String s1 = n1.toString();// 第一种使用toString方法
        System.out.println(s1);
        String s2 =String.valueOf(n1);//第二种 使用valueOf方法
        System.out.println(s2);
        String s3 = n1+" ";
        System.out.println(s3);//第三种使用+" "
    }
}

String 类型转成 Intger

public class test1 {
    public static void main(String []args){
        String s1 = "234";
        Integer i = new Integer(s1);//第一种使用默认自动装箱
        System.out.println(i);
        Integer i2 = Integer.valueOf(s1);//第二种 使用valueOf方法
        System.out.println(i2);
    }
}

Intger和Character的常用方法

在这里插入图片描述

Intger常见面试题

1.看以下代码输出什么

		Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j);
        Integer m = 1;
        Integer n = 1;
        System.out.println(m == n);
        Integer x = 128;
        Integer y = 128;
        System.out.println(x == y);

首先看第一个 ,由于 i和j都是new出来的对象,所以==用在比较对象时比较的是地址,所以是第一个输出false
第二个是自动装箱等同于调用valueOf(int x)方法,在这个方法的源码中如果传递进来的值>= -128 且 <= 127时就直接返回指向IntegerCache.cache中已经存在的对象的引用
如果超出这个范围就new一个Intger对象保存
。而1在这个范围之内,所以不会返回new新对象,m和n指向的是同一个对象所以输出true
第三个,同理还是会调用valueOf(int x)方法,但由于128超出了valueOf(int x)里规定的范围所以会返回创建对象,因为又是对比地址,所以返回false,

2.下列代码会输出什么

Intger a = 127;
int b = 127;
System.out.println(a == b);
Intger c = 128;
int d = 128;
System.out.println(c == d);

在 == 的对比中,如果是基本类型和和基本类型的包装类进行对比,那么就是值对比
所以两个都是true;


在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则是分别指向不同的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值