java--集合-List

一、List接口

 

  • List是有序的集合,集合中每个元素都有对应的顺序序列。List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加顺序设置元素的索引,比如第一个元素的索引就是0,好似数组。
  • List作为Collection子接口当然拥有其所有方法,同时也有自己的方法:

 

 

  1. void add(int index,Object e):将元素e添加到List集合中的index处;
  2. boolean addAll(int index,Collection c):将集合c所包含的所有元素都插入在List集合的index处;
  3. Object get(int index):返回集合index索引处的元素;
  4. int indexOf(Object o):返回对象o在List集合中第一次出现位置的索引;
  5. int lastIndexOf(object o):返回对象o在List集合中最后一次出现的位置索引;
  6. Object remove(int index):删除并返回index索引处的元素;
  7. Object set(int index,Object e):把集合index处的元素替换为e对象,返回以前在指定位置的元素;
  8. List subList(int fromIndex,int toIndex):返回从所有fromIndex(包括)到toIndex(不包括)处所有集合元素的子集合。

 

 

二、ListIterator

 

  • Iterator的子接口,专门用于操作List集合的输出;
  • List自己还有一个listIterator()方法,该方法返回ListIterator对象,ListIterator继承了Iterator接口,提供了专门操作List的方法。在Iterator上额外增加的方法:
  • 支持双向输出:

 

 

 

  1. boolean hasPrevious():返回该迭代器关联集合是否还有上一个元素;
  2. Object previous():返回该迭代器的上一个元素;

 

 

 

三、List接口中常用类

 

  • Vector:线程安全,但速度慢,已被ArrayList替代。
  • ArrayList:线程不安全,查询速度快。
  • LinkedList:链表结构,增删速度快。取出List集合中元素的方式:

 

 

 

 

 

  1. get(int  index):通过脚标获取元素。
  2. iterator():通过迭代方法获取迭代器对象。
  3. ArrayList和Vector类都是基于数组实现的List类,Vector比较古老,被ArrayList取代了;
  4. ArrayList是线程不安全的,而Vector是线程安全的,但是即使这样,也不推荐使用Vector,因为Collections有方法可以得到线程安全的ArrayList对象;
  5. Collections类: static  List synchronizedList(List list) 返回指定列表支持的同步(线程安全的)列表。 

四、Queue接口

 

  • 继承Collection接口
  • 模拟队列:先进先出(FIFO);
  • void add(Object e):将e插入到队列尾部;
  • Object element():获取队列头部的元素;
  • boolean offer(Object e):将e插入到队列的尾部,当使用有容量限制的队列时,此方法比add(Object e)方法更好。
  • Object peek():获取队列头部的元素。如果此双端队列为空,则返回 null。
  • Object poll():获取并删除队列头部的元素。如果此双端队列为空,则返回 null。
  • Object remove():获取并删除队列头部的元素。

五、LinkedList

 

  • LinkedList实现了Deque接口,而Deque是Queue的子接口。
  • Deque自定义方法:
  • void addFirst(Object e):把元素插入到该双向队列的开头;
  • void addLast(Object e):把该元素插入到该双向队列的末尾。
  • Object getFirst():获取但不删除队列第一个元素;
  • Object getLast():获取但不删除队列最后一个元素;
  • boolean offerFirst(Object e):将指定的元素插入到该双向队列的开头;
  • boolean offerLast(Object e):将指定元素插入到双向队列的末尾;
  • Object removeFirst():删除第一个元素
  • Object removeLast():删除最后一个元素
  • Object peekFirst():获取但不删除队列第一个元素,如队列为null,返回null;
  • Object peekLast():获取但不删除队列最后一个元素,如队列为null,返回null;
  • Object pollFirst():获取并删除队列第一个元素,如队列为null,返回null;
  • Object pollLast():获取并删除队列最后一个元素,如队列为null,返回null;
  • Object  pop():从此双端队列所表示的堆栈中弹出一个元素。
  • void push(Object e):将e推入进该队列栈中。
  • Object removeFirst():获取并删除队列第一个元素。
  • Object removeFirstOccurrence(Object o):删除队列第一次出现的o元素;
  • removeLast():获取并删除队列最后一个元素;
  • removeLastOccurrence(Object o):删除队列中最后一次出现的o元素;

 

六、根据上面的方法实现ArrayList、LinkedList、实例

    ArrayList实例

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListDemo {
	public static void main(String[] args) {

		/*
		 * boolean add(E e) 向列表的尾部添加指定的元素(可选操作)。 void add(int index, E element)
		 * 在列表的指定位置插入指定元素(可选操作)。 boolean addAll(Collection<? extends E> c) 添加指定
		 * collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
		 * boolean addAll(int index, Collection<? extends E> c) 将指定 collection
		 * 中的所有元素都插入到列表中的指定位置(可选操作)。
		 */

		List l = new ArrayList();

		l.add("A");// 0
		l.add("B");// 1
		l.add("C");//
		l.add("B");// 1
		l.add(0, "D");

		System.out.println(l);

		/*
		 * Object get(int index) 返回列表中指定位置的元素。
		 */
		Object o = l.get(0);
		System.out.println(o);
		/**
		 * int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 int
		 * lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
		 */
		System.out.println(l.indexOf("B"));
		System.out.println(l.lastIndexOf("B"));

		/*
		 * Object remove(int index) 移除列表中指定位置的元素(可选操作)。 ,返回删除的对象 boolean
		 * remove(Object o) 从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。 boolean
		 * removeAll(Collection<?> c) 从列表中移除指定 collection 中包含的其所有元素(可选操作)。
		 */

		System.out.println("----删除------");
		o = l.remove(0);
		System.out.println(o);
		System.out.println(l);
		/**
		 * Object set(int index, Object element) 用指定元素替换列表中指定位置的元素(可选操作)。
		 * 返回被替换的对象
		 */

		System.out.println(l.set(0, "春哥"));
		System.out.println(l);
		/*
		 * List<E> subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和
		 * toIndex(不包括)之间的部分视图。
		 */

		System.out.println(l.subList(1, 3));

		l.clear();

		l.add("A");
		l.add("A");
		l.add("A");
		l.add("A");
		System.out.println(l);

		l.remove("A");// 从此列表中移除第一次出现的指定元素
		System.out.println(l);
		//
		l.clear();

		l.add("A");
		l.add("B");
		l.add("C");
		l.add("D");
		
		System.out.println(l);
		
		for(Iterator it = l.iterator(); it.hasNext();){
			System.out.println("--> "+it.next());
		}
		
		/**
		 *  ListIterator<E> listIterator()  返回此列表元素的列表迭代器(按适当顺序)。 
		 */
		
		ListIterator lit = l.listIterator();
		
		System.out.println(lit.hasPrevious());//false,表示指针前没有元素
		//System.out.println(lit.previous());//获取指针前一个元素
		
		 o = lit.next();//指针相后移动一格
		System.out.println("----->"+o);
		System.out.println("前一个元素索引= " + lit.previousIndex());
		System.out.println("前一个元素= " + lit.previous());
		
		/**
		 * 相后迭代
		 */
		System.out.println("----------------------");
		while(lit.hasNext()){
			System.out.println(lit.next());
		}
		
		/**
		 * 相前迭代
		 */
		while(lit.hasPrevious()){
			System.out.println("-xian->" +lit.previous());
		}
	}
}

 

    LinkedList实例

 

import java.util.LinkedList;


public class LinkedListDemo {
	public static void main(String[] args) {
		
		/**
		 *  void addFirst(Object e):把元素插入到该双向队列的开头;
			void addLast(Object e):把该元素插入到该双向队列的末尾。
			boolean offerFirst(Object e):将指定的元素插入到该双向队列的开头;
			boolean offerLast(Object e):将指定元素插入到双向队列的末尾;
			
			
			Object getFirst():获取但不删除队列第一个元素;
			Object getLast():获取但不删除队列最后一个元素;
			Object peekFirst():获取但不删除队列第一个元素,如队列为null,返回null;
			Object peekLast():获取但不删除队列最后一个元素,如队列为null,返回null;
			
			Object removeFirst():删除第一个元素
			Object removeLast():删除最后一个元素
			Object pollFirst():获取并删除队列第一个元素,如队列为null,返回null;
			Object pollLast():获取并删除队列最后一个元素,如队列为null,返回null
		 */
		LinkedList list = new LinkedList();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");
		list.add("E");
		
		
		
		list.addFirst("0");
		list.offerLast("春哥哥");
		System.out.println(list);
		
		//list.clear();
		//list.removeFirst();
		//list.removeLast();
		list.pollFirst();
		list.pollLast();
		System.out.println(list);
		
		/*
		 *  Object peek():获取队列头部的元素。如果此双端队列为空,则返回 null。
			Object poll():获取并删除队列头部的元素。如果此双端队列为空,则返回 null。
			Object remove():获取并删除队列头部的元素。
		 * 
		 * */
		
		System.out.println(list.peek());
		System.out.println(list);
		System.out.println(list.poll());
		System.out.println(list);
		
		
	}
}