数据结构------泛型

1. 泛型

1.1 泛型的引入

  在我们之前的学习中,我们所实现的代码,类型都写死了。如果我们需要实现其他类型,就需要重新写个类。
那么我们能否只写一份代码,实现任意类型都可以存储呢?
  在Java中,Object是所有类的基类,如果将底层数组的类型设置成Object[],那么所有的类型都可以存储。但是,我们在后面获取元素的时候,必须要向下转型,用户使用起来要非常小心,很可能导致代码崩溃。本该在编译期间报的错误却推到了运行时,用户将会承担很大的风险。
  因此,Java中引入了泛型编程的思想。

1.2 泛型的概念

泛型类型参数化。即写代码的时候,将类型设置一个特定格式的参数,编译器在编译代码时自动推导。
泛型分类:泛型方法和泛型类。

1.3 泛型的使用

public class MyArray <E>{
    private E[] array;
    private int size;

    public MyArray(int initCap){
        array=(E[])new Object[initCap];
        size=0;
    }
    public void add(E p){
        if(size==array.length){
            System.out.println("元素已经存满了,无法再添加元素");
        }
        array[size++]=p;
    }
    public E get(int index){
        if(index>=size){
            throw new IndexOutOfBoundsException("数组下标越界");
        }
        return array[index];
    }
    public int size(){
        return size;
    }

    public static void main(String[] args) {
      MyArray<Person>myArray=new MyArray<>(10);
      myArray.add(new Person("hanmei",13));
        System.out.println(myArray.size());
    }
}

注意

  1. 泛型是作用在编译期间的一种机制。
  2. 泛型代码在运行期间,会将类型擦除掉,底层实际使用的也是Object实现的。但是用户不需要在代码中进行强制类型转换,让编译器在编译阶段检查。
    在这里插入图片描述在这里插入图片描述

2. 包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

2.1 基本数据类型及其对应的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

除了Integer和Character,其余基本类型的包装都是首字母大写。

2.2 装箱和拆箱

public class Test {
    int i=10;
    //装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中
    Integer ii=Integer.valueOf(i);
    Integer ij=new Integer(i);
    //拆箱操作,将Integer对象的值取出,放到一个基本数据类型中
    int j=ii.intValue();
}

2.3 自动装箱和自动拆箱

可以看到在使用过程中,装箱和拆箱带来了不少的工作量,所以为了减少开发者的负担,Java提供了自动机制。

int i=10;
    Integer ii=i;//自动装箱
    Integer ij=(Integer) i;//自动装箱

    int j=ii;//自动拆箱
    int k=(int)ii;//自动拆箱

在这里插入图片描述
自动拆箱习题:
1.在jdk1.5之后,下列 java 程序输出结果为______。

int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

正确答案true,true
解析
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“= =”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值