JAVA基础复习十五-Collection集合子类-List集合的子类

一、数组与集合

* 数组和集合存储引用数据类型,存的都是地址值

二、集合的由来及集合继承体系图

* A:集合的由来
    * 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 

* B:数组和集合的区别
    * 区别1 : 
        * 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
        * 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是其实是在存储的时候会自动装箱变成对象
    * 区别2:
        * 数组长度是固定的,不能自动增长
        * 集合的长度的是可变的,可以根据元素的增加而增长,1.5倍增长(部分集合底层也是用数组来做的)

* C:数组和集合什么时候用
        * 1,如果元素个数是固定的推荐用数组
        * 2,如果元素个数不是固定的推荐用集合

这里写图片描述

三、Collection集合的基本功能

这里写图片描述

1.boolean add(E e)E是添加的泛型,表示本集合中只能添加那种类型的元素
    add方法如果是list集合,一致返回true,因为list集合中是可以储存重复元素的,如果是set集合上存储重复元素的时候,就会返回false
arraylist的父类的父类重写了toString方法
    可以添加所有的数据类型
2.boolean remove(Object o)//删除指定元素
3.void clear()//清空集合
4.boolean contains(Object o)//是否包含
5.boolean isEmpty()//判断集合是否为空
6.int size()//获取集合中元素的个数

四、Collection集合的带All功能

boolean addAll(Collection c)
boolean removeAll(Collection c)//删除的是交集
boolean containsAll(Collection c)//可以有重复的
boolean retainAll(Collection c)//取交集,并把交集赋值给调用者,若交集为空,调用者也被赋值为空,值改变了所以返回true,只要调用者值改变了就返回true(包括交集为空),否则返回false(调用者是被调用者的子集)

五、集合的遍历之迭代器遍历

* A:迭代器概述
    * 集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历) 
        Iterator it = c.iterator();//获取迭代器的引用
        while(it.hasNext()) {   //如果集合中有下一个元素
            System.out.println(it.next());取出下一个元素(从0开始)
        }

六、迭代器的原理及源码解析

* A:迭代器原理
    * 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
        *比如ArrayList有自己特有的迭代器ListIterator

七、List集合的特有功能

* A:List集合的特有功能概述
    * void add(int index,E element)
    * E remove(int index)只能删除索引,因为不会自动装箱,否则就乱了。比如说集合中有一个元素是1,那么remove(1)是删除1这个元素,还是1这个索引位置的元素呢。所以不自动装箱,就删除索引位置对应的元素,下同
    * E get(int index)
    * E set(int index,E element)
    * 

八、集合遍历中的并发修改异常产生的原因及解决方案

* A:需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。

        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("world");
        list.add("d");
        list.add("e");

        Iterator it = list.iterator();
        while(it.hasNext()) {
            String str = (String)it.next();
            if(str.equals("world")) {
                list.add("javaee");         //这里会抛出ConcurrentModificationException并发修改异常,遍历的同时增删元素,引起并发修改异常。因为集合在用迭代器之前就已经告诉它自己有多少个元素了,迭代器就按这么多元素去迭代,结果在迭代途中增删元素,迭代器就受不了了。
            }
        }

* B:解决方案
    * a:迭代器迭代元素,用特有的迭代器修改元素(ListIterator的特有功能add)
    * b:集合遍历元素,集合修改元素

        ListIterator lit = list.listIterator();     //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
        while(lit.hasNext()) {
            String str = (String)lit.next();
            if(str.equals("world")) {
                lit.add("javaee");  
                //list.add("javaee");
            }
        }

九、ListIterator

* boolean hasNext()是否有下一个
* boolean hasPrevious()是否有前一个
* Object next()返回下一个元素
* Object previous();返回上一个元素

十、Vector,已经被淘汰

* A:Vector类概述
    * Vector是JDK1.0出来的,从JDK1.2之后出现Collection集合,其中的ArrayList代替了Vector的功能,就把它放在了List集合的下面。它是线程安全的所以相比较ArrayList效率低,底层也是用数组实现的。
* B:Vector类特有功能
    * public void addElement(E obj)
    * public E elementAt(int index)
    * public Enumeration elements()
* C:案例演示    
    * Vector的迭代

        Vector v = new Vector();                //创建集合对象,List的子类
        v.addElement("a");
        v.addElement("b");
        v.addElement("c");
        v.addElement("d");

        //Vector迭代
        Enumeration en = v.elements();          //获取枚举
        while(en.hasMoreElements()) {           //判断集合中是否有元素
            System.out.println(en.nextElement());//获取集合中的元素
        }

十一、数据结构之数组和链表

* A:数组
    * 查询快修改也快(给相应索引,就直接给到相应所以对应的值,所以查找快,找到了才能修改,所以修改也快)
    * 增删慢(数组增加一个元素,是把想要增加元素的索引位置后面的的所有元素全部复制,向后移动一位,再把增加的元素增加进去。删除一个元素就是把后面所有的元素复制,向前覆盖,再把最后一个元素置空,所以增删很费事,慢)

这里写图片描述
* B:链表
* 查询慢,修改也慢(先判断要查询的索引在中间位置的左边还是右边,在左边就从头一个一个向后查找,在右边就从最后一个对象向前一个一个查找,所以查询慢,查到了才能修改,自然修改也慢)
* 增删快(链表结构中,每个对象只需要记住自己前面和后面对象即可,所以增加一个元素,只需要破坏增加位置的原来两个元素的链接,增加进去就可以了,删除也是一样,所以快。)
这里写图片描述

十二、List的三个子类的特点

ArrayList:
    底层数据结构是数组,查询快,增删慢。
    线程不安全,效率高。
Vector:
    底层数据结构是数组,查询快,增删慢。
    线程安全,效率低。
    Vector相对ArrayList查询慢(线程安全的)
    Vector相对LinkedList增删慢(数组结构)
LinkedList:
    底层数据结构是链表,查询慢,增删快。
    线程不安全,效率高。

Vector和ArrayList的区别
    Vector是线程安全的,效率低
    ArrayList是线程不安全的,效率高
    共同点:底层都是数组实现的
ArrayList和LinkedList的区别
        ArrayList底层是数组结构,查询和修改快
        LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
    共同点:都是线程不安全的
* B:List有三个儿子,我们到底使用谁呢?
    查询修改多用ArrayList
    增删多用LinkedList
    如果都多ArrayList
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值