Java基础_泛型、数据结构

泛型通配符:

  当使用泛型类或者泛型接口,传递的数据中,泛型的类型不确定,可以通过通配符<?>表示。一旦程序中使用泛型通配符后,只能使用Object 类中的共性方法,集合中元素自身方法无法使用

通配符的基本使用:

  泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?    问号代表未知的通配符

  此时只能接收数据,不能往该集合当中存储数据

public static void main(String[] args) {
    // 可以存储整数的集合
    Collection<Integer> list01 = new ArrayList<Integer>();
    // 此时list01可以存储整数的数据
    // 展示list01集合当中的数据
    getElement(list01);
    // 可以存储String字符串的集合
    Collection<String> list02 = new ArrayList<String>();
    // 此时list02可以存储字符串的数据
    getElement(list02)//   Collection<Object>  ×  不可以
    // 此时如果换成泛型通配符? 就可以接收
    getElement(list02);// 可以        
}
// 可以接收任意的数据类型
public static void getElement(Collection<?> coll){
    // 只能接收Integer类型的数据
    // 此时? 可以代表任意类型
}

通配符的高级用法---受限泛型

  之前设置泛型的时候,实际上是可以任意设置的。只要是类就可以,但是在java的泛型当中还可以指定一个泛型的上限和下限

泛型的上限

  格式:类型名称<?extend 类名> 对象名称

  意义:只能接受该类型及其子类

泛型的下限:

  格式:类型名称<?super 类名>对象名 

  意义:只能接受该类型及其父类类型

public static void main(String[] args) {
    // 初始化三个集合
    Collection<Integer> list01 = new ArrayList<Integer>();
    Collection<String>  list02 = new ArrayList<Integer>();
    Collection<Number>  list03 = new ArrayList<Integer>();
    Collection<Object>  list04 = new ArrayList<Integer>();
     
    
}
// 定义方法  此时可以接收任意的数据类型
public static void getElement(Collection<?> coll) {//.....}
 // 定义方法,此时我只让该方法接收数字类型 Number类型或者Number的子类
pubic static void getElement(Collection<? extends Number> coll){//...}    
// 定义方法,此时我只让接收Number类型及其以上的类型
public static void getElement(Collection<? super Number> coll) {//....}    

数据结构:

  数据存储常用结构:栈、队列、数组、链表和红黑树

栈:

  stack,又称堆栈,他是运算受限的线性表结构,它的限制是仅允许在标的一端进行插入和删除操作,不允许在去其他任何位置进行添加、查找、删除等操作

  采用该结构的集合,对元素的存取有一下特点:

    1、先进后出(存进去的元素,要在他后面的元素依次取出后才能取出该元素)。例如:压子弹进弹夹(进栈),子弹弹出弹夹(弹栈)

    2、栈的入口、出口都是栈的顶端位置(有点像水杯只能从一个地方进出)

空栈:栈顶:栈底:

  压栈:就是存储元素,把元素存储到栈的顶端位置,栈中已有的元素依次向栈底方向一定一个位置

  弹栈:就是取出元素,把栈的顶端位置元素取出,栈中已有元素依次 向栈顶方向移动一个位置

队列:queue,简称对,它同堆栈几乎一样的,也是一种运算受限的线性表结构,它的限制是仅允许在标的一端进行插入,在标的另一端 进行删除

  采用该结构的集合,对元素的存取有以下特点:

  1、先进先出(存进去的元素,要在它前面的元素依次取出后,才能取出该元素)。列如火车进山洞,出山洞

  2、队列的入口、出口各占一侧

  • 数组:Array,是有序的元素序列,数组是在内存当中开辟一段连续的空间,并在此空间内存储元素。例如:

    生活中的酒店,酒店当中的房间号是连续的,不间断,有50个房间,从001---050每个房间都有固定编号,通过编号就可以快速找到酒店房间的住户。

    简单的说,采用此结构的集合,对元素存取有以下特点:

  • 查找元素快:通过索引,可以快速的访问到指定位置的元素。

  • 增删元素慢:

    1. 指定索引位置增加元素:需要创建一个新数组,将指定的新元素存储到指定的索引位置,再把源数组元素根据他原来的索引,复制到新数组对应的索引位置。

    2. 指定索引位置删除元素:需要创建一个新数组,把源数组当中的元素根据索引,复制到新数组对应索引的位置,源数组中指定的索引位置元素不复制到新数组当中。

  • 链表:linked list,由一系列结点node(链表当中的每个元素称为结点)组成,结点可以在运行时动态生成。每个结点包含两个部分:一个是用于存储数据元素的数据域,另一个是用来存储下一个结点地址的指针域。我们常说的链表结构有单向链表和双向链表

    简单的说,采用此结构的集合,对元素的存取有以下特点:

  • 多个结点之间,通过地址进行连接。比如:多个人玩丢手绢,每个人右手拉住下一个人的左手,上一个人的左手拉住该人的右手。依次类推,多个人就被连接起来。

  • 查找元素比较慢:想要查找某个元素,需要通过连接的结点,依次向后查询指定的元素。

  • 删除元素比较快:

    1. 增加一个元素:只需要修改连接下个元素的地址即可。

    2. 删除一个元素:只需要修改连接下一个元素的地址即可。

  • 二叉树:binary tree,每个节点数不超过2的树(tree)

    简单的理解,就是类似于我们生活中的树的结构,只不过每个节点上都最多只能有两个子节点。

    顶上的节点称为根节点,两边的被称为“左子树”和“右子树”

    在二叉树中有一种比较特殊树结构叫做红黑树,红黑树本身就是一个二叉树

    红黑树的约束:

      1. 节点可以是红色的也可以是黑色的
    1. 根节点是黑色的

    2. 叶子节点(空节点)是黑色的

    3. 每个红色节点的子节点都是黑色的

    4. 任何一个节点到其每一个叶子节点的所有路径上的黑色节点数是相同的。

红黑数的特点:

查询速度非常快,趋*于*衡树,查找叶子元素最小和最大不能超过2倍。

原文地址:https://www.cnblogs.com/9080dlb/p/14082517.html