今日内容

泛型的通配符

泛型的上下限

数据结构

泛型的通配符

  泛型可以用于类或者接口,在其传递数据时,如果类型不确定的时候可以使用  通配符<?>表示所有类型,一旦使用泛型通配符后,只能使用Object类中的共性方法,集合中元素自身的方法无法使用。

  1.通配符的基本使用:

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

泛型没有继承关系:Collection<Objiet>list = new ArrayList<String>();//错误

泛型不能用于创建对象
Collection<?> coll = new ArrayList<>();//错误,泛型需要具体的数据类型,通配符是未知数据类型。  在这里这个对象存不进数据没有意义

 

通配符的高级用法:

可一给泛型设置上限和下限

  1.泛型的上限:

格式: 类型名称<? extends 类名> 对象名称
意义: 只能接收该类型及其子类

  2.泛型的下限:

格式:类型名称<? super类名> 对象名
意义: 只能接收该类类型及其父类类型

数据结构:

  java中数据存储的常用结构:栈,队列,数组,链表和红黑树。

  1.栈

栈:statck,又称堆栈,他是运算受限的线性表结构,它的限制是仅允许在标的的一段进行插入和删除操作,不允许在其他任何位置进行添加,查找,删除等操作。简单地说,采用该结构的集合,对元素的存取有以下特点:
    1.先进后出(存进去的元素要在他后面的元素依次取出后,才能取出该元素)。例如:子弹压进弹夹从弹夹弹出的动作
    2.栈的入口和出口都是栈的顶端位置,
    3.栈底,栈顶
    4.空栈:里面没有元素,栈底和栈顶在同一个位置
    5.压栈:就是存储元素,把元素存储到栈顶端的位置,栈中已有的元素依次向栈底方向移动一个位置。
    6.弹栈:就是去除元素,把栈的顶端位置元素取出,占中已有的元素依次往栈顶方向移动一个位置。

  2.队列

队列:queue,简称队,它同堆栈几乎一样的,也是一种运算受限的线性表结构,它的限制是仅允许在标的的一段进行插入,另一端进行删除
采用队列对元素存取有以下特点:
    先进先出(存进去的先出去)例如:火车过山洞,车头先进,车头先出来
    队列的入口/出口各占一侧
    入队:元素进入队列,出队:元素离开队列
    队头,队尾

  3.数组

数组:Array,是有序的元素的序列,数组在内存当中开辟一段连续的空间,并在此空间内存储元素。例如:生活中的酒店,酒店当中的房间号是连续的,通过房间号就可以快速的找到酒店房间的住户。
采用数组结构对元素的存取有以下特点:
    查找元素快:通过索引快速访问到指定位置的元素。
    增删元素慢:
        1. 指定所引位置增加元素:创建一个新数组,将指定的新元素存储到指定的索引位置,再把源数组元素根据他原来的索引,复制到新数组对应的所引位置。
        2. 指定索引位置删除元素:需要创建一个新数组,把源数组的元素根据索引,复制到新数组对应索引的位置,源数组中指定的索引位置元素不复制到新数组当中。

  4.链表结构

链表: linked list,由一系列结点node(链表当中的每个元素称为结点)组成,结点可以在运行时动态生成,每个结点中包含两个部分:一个用于存储数据元素的数据域,另一个是用来存储下一个结点地址的指针域。我们常说的链表结构有单向链表和双向链表
    单向链表:(不常用)
        链表当中只有一条链子,不能保证存储元素的顺序(存储元素的顺序和取出元素的顺序有可能不一致)
    双向链表:
         链表中有两条链子,有一条链子是专门用来记录元素的顺序的,是有序的集合。
        采用链表结构对元素存取有以下特点:
            多个节点之间,通过地址进行连接,比如:多个人玩丢手娟,每个人右手蜡烛下一个人的左手,上一个人的左手拉住该人的右手。以此类推,多个人就被连接起来
            查找元素慢:想要查找元素,需要通过连接的结点,依次向后查询指定的元素。
            删除元素比较快:     
               1. 增加一个元素:只需要修改连接下个元素的地址即可。
               2. 删除一个元素:只需要修改下一个元素的地址即可。

  5.红黑树

二叉树:binary tree 每个节点不超过两个的树,顶上的节点称为根节点,两边的被称为左子树,右子树。

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

     排序树/查找树:在二叉树基础上,元素是有大小顺序的,左子树小,右子树大

     *衡树:左分支和右分支相等 (对称)

     不*衡树:左分支不等右分支
红黑树:
        特点:趋*于*衡树,查询速度非常快,查询叶子元素最小次数和最大次数不能超过2倍,超过两倍就不是红黑树了。
        约束:1.节点可以是红色或者黑色的

        2.根节点必须是黑色的

        3.叶子节点(空节点(尾部节点))必须是黑色的

        4.每个红色的节点的子节点是黑色的

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