集合框架

集合框架

类似数组

查api来学习

方便对多个对象的操作,

集合的由来

面向对象语言,对事物的描述通过对象来操作
,存储多个对象,应该用容器类型的变量
适应变化的需求,所以使用集合.

数组长度是固定的

集合长度可变

数组存储的是同一类型的元素

集合可以存储不同类型的元素

元素的数据类型问题

数组可以存储基本数据类型,也可以存储引用数据类型

集合只能存引用类型

Java提供了很对个集合类
这些集合类的数据结构不同,
存储东西,并且能够使用这些东西,比如判断,获取

数据结构:

数据的存储方式。
面试题:常见的数据结构的优缺点?(数据结构加算法)

栈
    先进后出
        入口压栈,出口弹栈。 比如:子弹夹
队列
    先进先出
        (排队买票)
数组
    存储同一个类型的多个元素的容器,有索引,方便获取 ,缺点是但是增加和删除很慢
链表
    由一个链子把多个结点连起来组成的数据
    结点: 有数据和地址组成(数据域和指针域组成)
           没有地址值为null
    从头开始来,任意元素都是从头开始找 
    特点:查询慢,增删快

Collection:

Collection
        |--List
            |--ArrayList
            |--Vector
            |--LinkedList
        |--Set
            |--HashSet
            |--TreeSet

集合的顶层接口

功能概述:

添加:

    boolean add(Object obj)添加一个元素,

删除  
    void clear()移除所以元素,
    boolean remove(Object o)移除一个元素
    boolean removeAll(Collection c)

判断  
    boolean contains(Object o)判断集合中是否包含指定的元素,
    boolean containsAll(Collction c)判断集合中是否有指定的集合元素,
    boolean isEmpty()判断集合是否为空


获取  
    Iterator<E> iterator()重点


长度功能
        int size();元素的个数
        面试题:数组有没有length方法?字符串有没有length()方法呢?集合有没有length()方法呢?答:集合有Size()方法。
交集功能
        boolean retainAll(Collection c)
把集合转换成数组
        Object[] toArray()

Iterator: 迭代器,集合的专用遍历方式

    遍历  
        while循环
        //      Iterator it = c.iterator();
        //      while(it.hasNext()){
        //          Students s = (Students)it.next();
        //          System.out.println(s.getName()+"----"+s.getAge());
        //      }
    **使用for循环遍历效率更高,for循环完成后,it就自动被视为垃圾了
        //for循环遍历**
        for(Iterator it = c.iterator();it.hasNext();){
            Students s = (Students)it.next();
            System.out.println(s.getName()+"----"+s.getAge());
        }
为什么迭代器是接口而不是一个类:因为集合中的数据结构都是不同的

Set:

List:

有序的集合,允许重复
特有迭代器ListIterator

ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 

 * 产生的原因:
 *      迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
 *      其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
 * 如何解决呢?
 *      A:迭代器迭代元素,迭代器修改元素
 *          元素是跟在刚才迭代的元素后面的。
 *      B:集合遍历元素,集合修改元素(普通for)
 *          元素在最后添加的。

并发修改异常(ConcurrentModificationException)
    A:出现的现象
        迭代器遍历集合,集合修改集合元素
    B:原因
        迭代器是依赖于集合的,而集合的改变迭代器并不知道。
    C:解决方案
        a:迭代器遍历,迭代器修改(ListIterator)
            元素添加在刚才迭代的位置
        b:集合遍历,集合修改(size()和get())
            元素添加在集合的末尾

List:(面试题List的子类特点)

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

List有三个儿子,我们到底使用谁呢?
    看需求(情况)。

要安全吗?
    要:Vector(即使要安全,也不用这个了,后面有替代的)
    不要:ArrayList或者LinkedList
        查询多:ArrayList
        增删多:LinkedList

如果你什么都不懂,就用ArrayList。
posted @ 2017-10-25 15:30  aniymx  阅读(130)  评论(0)    收藏  举报