Java中的List集合

  1 Java中的List集合

  1.1 迭代器

  通过集合对象获取对应的Iterator< E >迭代器

  Iterator< E > iterator();

  常用方法:

  boolean hasNext();

  判断当前Iterator是否可以继续运行。

  E next();

  获取Iterator当前指向元素,并且指向下一个元素。

  void remove();

  删除

  【注意】

  1. remove方法有且只能删除通过next方法获取的元素

  2. remove方法如果想要使用,必须紧挨着next方法

  代码示例:

  import java.util.ArrayList;

  import java.util.Collection;

  import java.util.Iterator;

  public class Demo1 {

  public static void main(String[] args) {

  Collection c = new ArrayList();

  c.add("烤羊排");

  c.add("油焖大虾");

  c.add("土豆牛肉");

  c.add("黄焖鸡米饭");

  System.out.println(c);

  /*

  * 获取当前集合对应的Iterator迭代器对象

  */

  Iterator iterator = c.iterator();

  /*

  System.out.println("当前Iterator是否可以继续运行:" +iterator.hasNext());

  System.out.println("获取当Iterator指向元:" + iterator.next());

  System.out.println("获取当Iterator指向元:" + iterator.next());

  iterator.remove();

  System.out.println(c);

  iterator.remove();

  System.out.println(c);

  */

  while (iterator.hasNext()) {

  iterator.next();

  iterator.remove();

  }

  System.out.println(c.isEmpty());

  }

  }

  1.2 Iterator使用注意问题

  代码示例:

  import java.util.ArrayList;

  import java.util.Collection;

  import java.util.Iterator;

  public class Demo2 {

  public static void main(String[] args) {

  ArrayList c = new ArrayList();

  c.add("烤羊排");

  c.add("油焖大虾");

  c.add("土豆牛肉");

  c.add("黄焖鸡米饭");

  c.add("麻辣香锅");

  c.add("孜然肉片");

  c.add("酸汤肥牛");

  Iterator iterator = c.iterator();

  /*

  * ConcurrentModificationException

  * Iterator在创建的过程中,会对整个集合所有元素打招呼,记录每一个元素位置。

  * Iterator在执行next方法过程中,会按照初始条件一个一个遍历

  * 当前集合通过remove方法,删除已经被Iterator记录的元素时,是有可能导致

  * Iterator一脸懵逼!!!元素不见了!!!

  *

  * 这里就会发生冲突!

  *

  * 这里因为集合中元素,对于集合本身和当前Iterator而言是一个共享资源

  * 不管是哪一方操作元素,都存在影响对方操作的情况。【共享资源冲突问题】

  *

  * ArrayList存储元素不是连续的吗,土豆牛肉删除了,他的位置不是会被后面的元素顶上来吗

  */

  while (iterator.hasNext()) {

  System.out.println(iterator.next());

  // 这里通过集合删除土豆牛肉元素

  // 后期代码中会出现很多相同名字方法,这里一定要注意!!!

  // 调用当前方法的是哪一个

  c.remove("酸汤肥牛");

  }

  }

  }

  1.3 List

  1.3.1 List集合接口特征和方法

  特征:

  有序,可重复

  有序: 添加顺序和存储顺序一致

  可重复:相同元素可以同时添加

  List< E >接口下的实现类,存在一定的下标操作机制

  ArrayList< E > 底层数组形式操作,可以通过下标直接访问

  LinkedList< E > 底层是一个双向链表结构,下标 --> 计数器

  特定的方法:

  增:

  add(E e);

  List接口下,当前方法是添加元素到集合的末尾,尾插法

  addAll(Collection c);郑州看妇科哪家医院好 http://www.hnzzkd.com/

  List接口下,当前方法是添加另一个集合到当前集合末尾,要求添加的集合中保存的元素和当前集合保存元素一致

  add(int index, E e);

  在指定的下标位置,添加指定元素

  addAll(int index, Collection c);

  在指定的下标位置,添加指定的集合,集合要求同上一个addAll方法

  删:

  void clear();

  清空整个集合

  remove(Object obj);

  删除集合中的指定元素

  removeAll(Colletion c);

  删除两个集合的交集

  retainAll(Colletion c);

  保留两个集合的交集

  E remove(int index);

  删除集合中指定下标的元素。返回值是被删除的元素

  改:

  E set(int index, E e);

  使用指定元素替换指定下标index的元素,返回值是被替换掉的元素。

  查:

  int size();

  有效元素个数

  boolean isEmpty();

  判断当前集合是否为空

  boolean contains(Object obj);

  boolean containsAll(Collection c);

  int indexOf(Object obj);

  找出指定元素在集合中的第一次出现位置

  int lastIndexOf(Object obj);

  找出指定元素在集合中最后一次出现位置

  E get(int index);

  获取指定下标的元素

  List< E > subList(int fromIndex, int endIndex);

  获取当前集合的子集合

  【特征】

  获取数据的范围是 fromIndex <= n < endIndex

  要头不要尾

  1.3.2 ArrayList可变长数组

  特征:

  数组形式的操作方式,查询效率高,但是删除,增加效率低。

  数组:

  Object类型数组

  方法:

  ArrayList使用的方法基本上都是从List接口中遵从实现的方法。

  特征:

  ensureCapacity(int minCapacity);

  判断当前容量是否足够

  trimToSize();

  截断整个数组容量 ==> size有效元素个数

  时间换空间,空间换时间

  1.3.3 ArrayList性能问题

  增加慢

  1. 增加元素有可能出现调用grow方法,grow需要进行数组的扩容操作,操作过程中需要大

  量的移动和拷贝过程,浪费时间

  2. 在某一个指定位置添加元素,会导致从指定位置开始,之后的元素整体向后移动,涉及

  移动复制操作,浪费时间。

  删除慢:

  1. 按照ArrayList可变长数组要求,删除元素之后,之后的内容都需要整体向前移动。

  1.4 LinkedList

  1.4.1 LinkedList特征

  底层是一个双向链表

  链子 自行车链子 船锚 手链

  自行车链子

  维修很方便,前断,后断,链接搞定!!! 找到损坏的位置,需要一个一个来

  链表结构

  1. 增删快

  2. 查询很慢很慢很慢

  1.4.2 LinkedList需要了解的方法

  LinkedList使用的方法,大部分都是从List接口中遵从实现的方法

  但是有一些特征方法

  addFirst(E e);

  addLast(E e); ==> add(E e);

  E getFirst();

  E getLast();

  removeFirst();

  removeLast();

  以上方法组合可以完堆栈队列操作

  堆

  先进后出

  弹夹

  addLast(E e); E getLast(); removeLast();

  队列

  先进先出

  addLast(E e); E getFrist(); removeFirst();

posted @ 2020-03-04 15:07  网管布吉岛  阅读(184)  评论(0编辑  收藏  举报