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<String> c = new ArrayList<String>();
		
		c.add("烤羊排");
		c.add("油焖大虾");
		c.add("土豆牛肉");
		c.add("黄焖鸡米饭");
		
		System.out.println(c);
		
		/*
		 * 获取当前集合对应的Iterator迭代器对象
		 */
		Iterator<String> 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<String> c = new ArrayList<String>();

		c.add("烤羊排");
		c.add("油焖大虾");
		c.add("土豆牛肉");
		c.add("黄焖鸡米饭");
		c.add("麻辣香锅");
		c.add("孜然肉片");
		c.add("酸汤肥牛");
		
		Iterator<String> 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<? extends E> c);
      List接口下,当前方法是添加另一个集合到当前集合末尾,要求添加的集合中保存的元素和当前集合保存元素一致
   add(int index, E e);
      在指定的下标位置,添加指定元素
   addAll(int index, Collection<? extends E> 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();

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值