数据结构之集合类&包装类&简单认识泛型

集合类

首先我们了解一下集合框架,我们看一下类和接口的总览:
在这里插入图片描述
我们可以看到,所有的接口和类,除了Map,都实现了Iterable接口,这个接口是迭代器接口,也就是说,实现了这个接口的所有的类都能迭代,就是利用foreach来遍历我们的集合。因为Map本身是没有实现Iterable接口的,所以Map不能通过foreach来遍历,但是如果Map想要遍历,我们进入Map里面去看看:
在这里插入图片描述
在这里插入图片描述
HashMap和TreeMap的区别之一:TreeMap是根据比较K来插入的,而HashMap是根据它自己的哈希函数得出来的哈希值来进行数据存储的。
在这里插入图片描述
我们可以看到,TreeMap中的put方法是具有比较器的功能的,也就是每次put都会比较,而HashMap中的put方法,我们没有看到比较器。

接下来,回到Collection接口,要使用Collection接口中的方法,因为它是个接口,不能直接new,所以我们用ArrayList类来实现这个接口
在这里插入图片描述

包装类

在这里插入图片描述

装包/装箱 & 拆包/拆箱

在这里插入图片描述
了解的拆包和装包,我们来看一道面试题:

在这里插入图片描述

泛型

  1. 类名后的代表占位符,表示当前类是一个泛型类
  2. 基本数据类型,不能作为泛型类型的参数,要封装类
  3. 类型后加入<数据类类型>,该类型只能处理规定的数据类型
  4. 编译的时候,自动进行类型的检查
  5. 取出数据的时候,不需要强制类型转换
  6. 泛型类型的数组,不能直接new或者实例化:
    T[] t = new T[]; 是错误的,T[] array = new (T[])Object[]; 这样能通过编译

泛型是如何编译的

  • 擦除机制
    查看字节码文件,所有的T都被换成了Objiect

  • 提出问题:
    1、那为什么,T[] ts = new T[5]; 是不对的,编译的时候,替换为Object,不是相当于:Object[] ts = new Object[5]吗?
    2、类型擦除,一定是把T变成Object吗?

在这里插入图片描述

那么如果要创建一个泛型数组,只能用反射的方式来创建

class MyArray<T> {
    public T[] array;
    public MyArray() {}
    public MyArray(Class<T> clazz, int capacity) {
        array = (T[]) Array.newInstance(clazz, capacity);
    }
    public T getPos(int pos) {
        return this.array[pos];
    }
    public void setVal(int pos,T val) {
        this.array[pos] = val;
    }
    public T[] getArray() {
        return array;
    }
}

public class test {
    public static void main(String[] args) {
        MyArray<Integer> myArray1 = new MyArray<>(Integer.class,10);
        Integer[] integers = myArray1.getArray();
    }
}

泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束

  • 语法
class 泛型类名称 <类型形参 extends 类型边界> 
public class MyArray <E extends Number>{
}
//只接受Number的子类型作为E的类型参数(E 可以是Number或者Number的子类),这就叫做泛型上界
MyArray<Integer> m1; // 正确,因为Integer是Number的子类型
MYArray<String> m2; // 编译错误,因为String不是Number的子类型
  • 示例:
public class MyArray<E extends Comparable<E>> {
}

写一个泛型类,找出数组中的最大值

在这里插入图片描述

class Array<T extends Comparable<T>>{
    public T findMax(T[] array) {
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }
}

public class test {
    public static void main(String[] args) {
        Array<Integer> array = new Array<>();
        Integer[] a = new Integer[]{2,1,9,6};
        System.out.println("max = " + array.findMax(a));
    }
}

泛型方法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
//<类型形参列表> 一般只有在静态方法中,写在static后面

在这里插入图片描述
泛型进阶请移步到鄙人的另一篇博客:
泛型和泛型的进阶

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java基本数据类包装类是Java中用来表示数据的两种不同方式。 1. 基本数据类(Primitive Data Types): - Java的基本数据类有8种:byte、short、int、long、float、double、char和boolean。 - 这些基本数据类直接存储着数据的值,它们是直接操作内存的,因此效率较高。 - 基本数据类不具有任何方法,不能调用任何方法。 2. 包装类(Wrapper Classes): - 包装类是用来将基本数据类包装起来,以便能够以对象的形式使用。 - Java提供了对应于每种基本数据类包装类:Byte、Short、Integer、Long、Float、Double、Character和Boolean。 - 包装类提供了许多有用的方法,可以进行类转换、比较、运算等操作。 - 包装类是不可变的(immutable),即一旦创建就无法修改其值。 区别: - 基本数据类是直接存储数据的值,而包装类是将基本数据类包装成对象。 - 基本数据类效率较高,而包装类的效率较低,因为需要进行对象的创建和销毁操作。 - 基本数据类不能调用任何方法,而包装类提供了许多有用的方法。 - 包装类可以用于集合类等需要对象作为参数的场景,而基本数据类则不能直接使用。 - 基本数据类在内存中占据的空间大小是固定的,而包装类的内存消耗较大,因为需要额外存储一些信息。 总的来说,基本数据类适合用于简单的数据操作,而包装类适合用于需要更多功能和灵活性的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值