包装类&初识泛型

一.包装类

在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型)

1.基本类型对应的包装类

  • byte -- Byte
  • short -- Short
  • int -- Integer
  • long -- Long
  • float -- Float
  • double -- Double
  • char -- Character
  • boolean -- Boolean

我们可以从中找到规律: 除了int和char, 其余基本类型的包装类都是首字母大写.

2.装箱和拆箱

(1) 装箱: 就是把基本类型变成包装类型. 装箱需要调用Integer类的valueOf方法, 装箱有两种方式:手动装箱和自动装箱 (显式装箱和隐式装箱)

int a = 10;

Integer ii = Integer.valueOf(a); // 手动装箱(显式装箱)

Integer ii2 = a; //自动装箱(隐式装箱)

(2) 拆箱: 就是把引用类型(包装类型)变成基本类型.拆箱需要用到intValue方法,拆箱也有两种方式:手动拆箱和自动拆箱 (显式拆箱和隐式拆箱)

Integer ii = 10;

int a = ii.intValue(); //手动拆箱(显式拆箱)

int a = ii; //自动拆箱(隐式拆箱)

[面试题] :

    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        
        Integer c = 200;
        Integer d = 200;

        System.out.println(a == b);
        System.out.println(c == d);
    }

问, 上述代码输出什么?

答案:

为什么输出true和false呢?  我们可以看到, 四行代码进行的操作都是装箱.装箱操作会调用valueOf方法, 我们查看valueOf的源码:

从中可以看到 , 如果i是在[low, high)这个范围之内(对于Integer来说, low = -128, high = 127), 那么就是去cache数组中取值返回; 相反,如果i不在这个范围内, 就会实例化一个Integer类的对象返回.

此时我们在看这个代码: a和b在这个范围内, 那么a,b都是从这个数组中取值.又因为a和b的值相等,所以a,b是从数组的同一位置取值的. 所以a,b的包装类值相等 ;  而c,d不在这个范围内,所以c,d是都是新实例化的对象, c和d是两个不同的对象, 地址肯定不相同,所以c,d的包装类值不等.

二.泛型

1.泛型的概念

一般的类和方法,只能使用基本类型和引用类型,这种刻板的限制对代码的束缚就很大. 所以Java引入了"泛型"这个语法. 泛型: 就是适用于许多类型. (泛型实现了类型的参数化 -- 可以传指定类型的参数).

首先我们先看一个代码示例:

我们可以看到,上述代码的问题是: (1) 这个数组中任何类型的数据都能存放.  (2) 用String类的对象接收"hello"时,需要强转(因为在这里"hello"是Object类型的)   但是, 更多情况下,我们还是更希望数组中只存放一种类型的数据.此时就要用到泛型.

所以,泛型的主要目的就是: 指定当前容器(类 / 方法)要持有什么类型的对象,并以参数形式传递此类型(需要什么类型,就传入什么类型), 让编译器去做检查.

注意: 类型参数传的必须是引用类型(包装类型), 不能是基本类型!!!

2.泛型类

语法形式:

class 泛型类名称<类型参数列表> {
  // 在这里可以使用类型参数
}

代码示例:

泛型类的使用示例:

 运行结果:

3.泛型方法

泛型方法: 即方法的返回值以参数方式指定

代码示例:

注意事项: 引用类型对象的大小比较,是不能直接使用 ">", "<" 的, 需要重写Object类的CompareTo方法, 再调用CompareTo方法对两者进行比较.

4.泛型的上界

泛型的上界, 就是对泛型表示类型的范围做出了限制.

例如:

此行代码表示: 传进来的类型参数E 必须是继承于Comparable接口的.

上述代码表示: 传进来的类型参数T 必须是继承于Number类的. 

以上就是本篇博客的全部内容啦,如果喜欢小编的文章,可以点赞,评论,收藏~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值