美文网首页
3/10day07_Collection_迭代器_泛型_数据结构

3/10day07_Collection_迭代器_泛型_数据结构

作者: 蹦蹦跶跶的起床啊 | 来源:发表于2020-03-10 16:07 被阅读0次

    今日内容

    • Collection集合
    • 迭代器
    • 泛型
    • 数据结构

    Collection集合[重点]

    集合的介绍,集合和数组的区别

    • 集合是数据的容器
    • 数组:
      数据类型[] 变量名 = new 数据类型[数组的长度]
      集合:
      ArrayList<数据类型> 变量名 = new ArrayList<数据类型>
    • 区别
      1.数组的长度是固定的,集合的长度是可以改变的
      2.数组中的元素类型可以是基本类型或引用类型. 集合的元素类型必须是引用类型或包装类

    集合常用类的继承体系[重要]

    • 两类集合接口特点
      List 的特点是元素有索引,有序,元素可重复
      Set 的特点是无索引,无序,元素不可重复。



    Collection 中的通用方法

    public    boolean    add(E e);  添加元素,返回值表示添加成功
    
    public    boolean    remove(E e);  删除元素, 返回值表示是否删除成功
    
    • 改(无)
     因为List接口有索引和Set接口无索引. 所以根接口无改方法
    
    • 查(无)
    根接口中没有
    
    • 其他
    public   boolean  contais(object  obj);判断集合中是否包含某个元素
    
    public  void  clear(); 清空集合(把集合中元素全部删除, 不是把集合置为null)
    
    public  boolean isEmpty();判断集合是否为空
    
    public  int size();返回集合中的元素个数
    
    public  Object[]  toArray();将集合转为数组
    

    Iterator迭代器[重点]

    集合迭代器的介绍和使用

    (因为set接口的实现类集合无索引, 没有办法使用fori来遍历)

    • 迭代器: 用来遍历集合的对象(遍历集合不需要索引),就是Iterator
    • 迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
    • 使用步骤:
      1.创建Iterator对象(使用集合对象.iterator()的方法, 这个方法写在Collection中返回一个迭代器对象)
      2.使用调用对象.hasNext()方法(是否有元素, 有返回true)
      3.使用调用对象.next()方法
         Iterator<String> it = coll.iterator();
            //  泛型指的是 迭代出 元素的数据类型
         while(it.hasNext()){ //判断是否有迭代元素
                String s = it.next();//获取迭代出的元素
                System.out.println(s);
            }
    
    • 迭代器的注意事项(两个异常)
      1.NoSuchElementException; 没有元素异常
      出现原因:没有元素了,还是用迭代器的next()方法, 就会出现异常
      2.ConcurrentModificationException; 并发修改异常
      出现原因: Java迭代器规定, 在使用迭代器过程中,无法使用增删元素(无法更改集合长度)
      但是可以使用迭代器本身的 remove方法是可以删除的(迭代器本身没有增加方法)

    注意:
    1.使用迭代器时,必须先使用hasNext方法判断,且结果为true,才能调用next方法
    2.使用迭代器时,尽量只做遍历,不允许在使用过程中,用了增加或删除元素的操作
    3.迭代器遍历一次之后,就结束了,再使用的时候需要重新使用 list.iterator() 获取新的迭代器

    迭代器原理

    迭代器底层使用了"指针原理"

    增强for循环[重点]

    • 什么是增强for循环
      实际上是一种简便格式(语法糖).内部原理是迭代器的简便格式

    • 使用方法

    for(数据类型  变量名:集合/数组){
        System.out.println(变量名);
    }//遍历一次集合/数组, 取出一个元素赋值给变量名;
    
    • 注意事项:
      1.增强for循环必须有被遍历的目标,目标只能是Collection或者是数组;
      2.增强for(迭代器)仅仅作为遍历操作出现,不能对集合进行增删元素操作,否则抛出ConcurrentModificationException并发修改异常

    泛型

    概述

    • 是jdk1.5之后的新特性
    • 什么是泛型:
      是一种不确定的类型,程序员使用时再确定下来
    • 泛型的格式
      <E>
      <K,V>

    使用泛型的好处

    • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
    • 避免了类型强转的麻烦。

    泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。

    如何定义和使用泛型[理解]

    泛型可以定义在类上,方法上,接口上
    泛型在定义的时候不具体,使用的时候才变得具体。在使用的时候确定泛型的具体数据类型。

    定义不具体,使用的时候具体

    • 泛型类(泛型定义在类上)
      在创建对象的时候确定类型

    泛型类的定义

    class ArrayList<E>{ 
        public boolean add(E e){ }
        public E get(int index){ }
        ....
    }
    

    泛型类的使用

    ArrayList<String> list = new ArrayList<String>();
    
    • 泛型方法(泛型定义在方法上)

    泛型方法的定义

    public <MVP> void show(MVP mvp) {
            System.out.println(mvp.getClass());
        }
    

    泛型方法的使用

    public class Dog{
        public <E> void show(E num){
            System.out.println(num);
      }
    }
    public class TestDog{
      public static void main(){
        Dog dd= new Dog();
        dd.show("Java");
        dd.show(10);
        dd.show(10.33);  
      }  
    }
    
    • 泛型接口(定义在接口上)
      1.在实现类中实现该接口时,确定具体类型
      2.在实现类中实现该接口时,保留泛型相当于继承父类泛型

    泛型接口的定义

    public interface MyGenericInterface<E>{
        public abstract void add(E e);
        
        public abstract E getE();  
    }
    

    泛型接口的使用

    1.定义类时确定泛型的类型

    public class MyImp1 implements MyGenericInterface<String> {
        @Override
        public void add(String e) {
            // 省略...
        }
     
        @Override
        public String getE() {
            return null;
        }
    }
    

    2.始终不确定泛型的类型,直到创建对象时,确定泛型的类型

    定义泛型
    public class MyImp2<E> implements MyGenericInterface<E> {
        @Override
        public void add(E e) {
             // 省略...
        }
     
        @Override
        public E getE() {
            return null;
        }
    }
    确定泛型:
    /*
     * 使用
     */
    public class GenericInterface {
        public static void main(String[] args) {
            MyImp2<String>  my = new MyImp2<String>();  
            my.add("aa");
        }
    }
    

    小结:泛型是一种未知的数据类型,定义在类上的泛型,使用类的时候会确定泛型的类型,定义在方法上的泛型,会在使用方法的时候确定泛型,定义在接口上的泛型,需要使用接口的时候确定泛型。

    泛型的通配符

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

     void method(ArrayList<?> arr){
    //表示任何引用类型的集合都可以作为形参传递
    }
    

    泛型的上下限[重点]

    • <?> 什么泛型都可以
    • <? extent Animal>,是泛型的上限,表示该泛型必须是Animal本类或其子类
    • <? super Student>,叫做泛型的下限, 表示该泛型必须是Student本类或者其父类

    数据结构

    介绍

    是容器保存数据的方式(数据用什么样的方式组合在一起)

    常见的数据结构[重点]

    栈结构

    • 介绍
      又称堆栈,它是运算受限的线性表

    • 理解
      栈结构可以看做只有一端开口的容器
      1.压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
      2.弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

    • 特点:
      1.先进后出
      2.栈的入口、出口的都是栈的顶端位置。


    队列结构

    • 介绍
      简称队,它同堆栈一样,也是一种运算受限的线性表

    • 理解
      队列结构可以看做是 两端都有开口的容器(一端进一端出)

    • 特点
      1.先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,小火车过山洞,车头先进去,车尾后进去;车头先出来,车尾后出来。
      2.队列的入口、出口各占一侧。

    数组结构

    • 介绍
      数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
    • 特点:
      1.查找元素快:通过索引,可以快速访问指定位置的元素
      2.增删元素慢

    链表结构

    • 介绍
      在链表结构中,每一个元素成为节/结点(Node)
      每个节点至少有两部分内容,一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
    • 特点
      链表结构在内存中可以是分散的
      1.多个结点之间,通过地址进行连接。
      2.查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素。
      3.增删元素快:


    树结构

    红黑树查询效率很高

    今日总结

    1.Collection 集合根接口【重点】
        i.集合继承体系
        ii. Collection中定义的通用方法
        iii.明白集合和数组的区别
        
    2.迭代器【重点】
        i.迭代器使用的三个步骤: 获取迭代器,判断有没有下一个,取出下一个元素
        ii.增强for循环使用(底层使用就是迭代器)   
        iii.迭代器和增强for使用过程 不能增删元素   
            
    3.泛型【理解】
        i.泛型怎么写 <E>
        ii.泛型类,泛型接口,泛型方法怎么定义和使用
        iii.泛型通配符以及上下限【重点】
            <?> 代表任意泛型均可
            <? extends 类名> 上限
            <? super 类名> 下限
    4.数据结构【重点】
        栈结构: 先进后出
        队列结构: 先进先出
        数组结构: 增删慢,查询快
        链表结构: 增删快,查询慢
        红黑树: 查询效率非常恐怖!!  【记住结论即可】  
    

    相关文章

      网友评论

          本文标题:3/10day07_Collection_迭代器_泛型_数据结构

          本文链接:https://www.haomeiwen.com/subject/qayidhtx.html