美文网首页java随笔
迭代器----List(ArrayList、LinkedList

迭代器----List(ArrayList、LinkedList

作者: 71150ce14a00 | 来源:发表于2017-06-27 15:27 被阅读19次

    迭代器:遍历
    迭代: 一个一个取数据,去之前先判断有没有,如果有取数据,如果没有则不取。
    hasNext()判断是否有下一个元素
    next() 取数据
    remove() 移除

    一个hasNext对应一个next, 如果对应不上,就会报错NoSuchElementException

    当迭代器对象调用next方法的时候,隐式光标向下移动
    当隐式光标移动到集合最后,那么这个迭代器就变成一个垃圾,需要回收
    如果再想迭代集合,那么只能根据集合对象重新成一个新的迭代器

    如果我们使用迭代器正在迭代集合的时候, 如果想修改集合那么只能使用迭代器中的方法修改,不能使用集合中的方法修改

    ListIterator迭代器只能被List集合使用, 其他集合不能使用
    使用ListIterator你想迭代的时候一定要使用带有参数的listIterator(index)函数,这里的index是list.size(), 不是list.size()-1,以为是获取元素的前一个元素

    Iterator是一个工作在一个独立的线程中,并且用有一个mutex锁,Iterator被创建后会建立一个指向原来对象的单链索引表,党员来的对象数据发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到迭代对象。 所以Iterator在工作的时候是不允许被迭代的对象被改变,但你可以使用Iterator本身方法。

    List集合接口:

    可以存储重复元素,恶意存储null,有角标,存储有序

    ArrayList:

    实现List接口。ArrayList集合中的特有方法是实现List底层使用可变数组结构,查询遍历的效率比较高,增删的效率比较低,属于线程不安全的集合类,执行效率比较高

    LinkedList:

    实现list接口。底层使用链表结构(链表:有头有尾),LinkedList集合中的特有方法都是围绕表的头尾设计,查询遍历效率比较慢,增删效率比较高,属于线程不安全的集合,执行效率比较高

    ArrayList无参构造默认长度为10 ,倍增开辟空间
    LinkedList无参构造没有长度

    ArrayList和LinkedList区别:

    ArrayList: 数组数据结构,长度固定,存储有序,数据类型单一,有下标,能够存储多个数据,数组数据结构特点,查询快增删慢
    LinkedList:链表数据结构,将一条链表将多个节点链接起来的数据结构,没有存储规律,
    节点:用来存储数据的独立空间,分层多个部分,一部分用来存储数据,其他部分用来存储其他节点的内存地址。

    为什么ArrayList集合增删效率低,而查询快:
    因为我们向集合中添加元素的时候,有时候会将元素添加到集合中的最前面,或者有可能删除最前面的数据,这样就导致其他数据向后移动或删除时向前移动,所以效率低
    对于查询ArrayList集合的时候可以按照排序去查询,或者直接可以通过某个下标去查询,这样就会导致查询速度相对快很多

    为什么LinkedList集合增删效率快,查询慢
    LinkedList集合增删效率高是应为底层是链表结构,如果增加或者删除只需要增加或者删除的节点位置上记住新的节点地址即可,而其他节点不需要移动,所以速度快
    而查询遍历由于链表结构特点,查询只能从头一直遍历的到链表的结尾,所以速度会慢

    结论:
    如果对集合进行查询操作建议使用ArrayList
    如果对集合进行增删操作建议使用LinkedList

    用LinkedList描述队列和堆栈数据结构

    队列数据结构: 先进先出

    class Queue{
    private LinkedList list = new LinkedList();
     public void addElement(Object obj){
      list.add(obj);
     }
     public Object getElement(){
       list.removeFirst();
     }
     public boolean isNull(){
     list.isEmpty();
     }
     }
    

    堆栈数据结构:先进后出

     class Queue{
    private LinkedList list = new LinkedList();
     public void addElement(Object obj){
      list.add(obj);
     }
     public Object getElement(){
       list.removeLast();
     }
     public boolean isNull(){
     list.isEmpty();
     }
     }

    相关文章

      网友评论

        本文标题:迭代器----List(ArrayList、LinkedList

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