java--集合-List
一、List接口
- List是有序的集合,集合中每个元素都有对应的顺序序列。List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加顺序设置元素的索引,比如第一个元素的索引就是0,好似数组。
- List作为Collection子接口当然拥有其所有方法,同时也有自己的方法:
- void add(int index,Object e):将元素e添加到List集合中的index处;
- boolean addAll(int index,Collection c):将集合c所包含的所有元素都插入在List集合的index处;
- Object get(int index):返回集合index索引处的元素;
- int indexOf(Object o):返回对象o在List集合中第一次出现位置的索引;
- int lastIndexOf(object o):返回对象o在List集合中最后一次出现的位置索引;
- Object remove(int index):删除并返回index索引处的元素;
- Object set(int index,Object e):把集合index处的元素替换为e对象,返回以前在指定位置的元素;
- List subList(int fromIndex,int toIndex):返回从所有fromIndex(包括)到toIndex(不包括)处所有集合元素的子集合。
二、ListIterator
- Iterator的子接口,专门用于操作List集合的输出;
- List自己还有一个listIterator()方法,该方法返回ListIterator对象,ListIterator继承了Iterator接口,提供了专门操作List的方法。在Iterator上额外增加的方法:
- 支持双向输出:
- boolean hasPrevious():返回该迭代器关联集合是否还有上一个元素;
- Object previous():返回该迭代器的上一个元素;
三、List接口中常用类
- Vector:线程安全,但速度慢,已被ArrayList替代。
- ArrayList:线程不安全,查询速度快。
- LinkedList:链表结构,增删速度快。取出List集合中元素的方式:
- get(int index):通过脚标获取元素。
- iterator():通过迭代方法获取迭代器对象。
- ArrayList和Vector类都是基于数组实现的List类,Vector比较古老,被ArrayList取代了;
- ArrayList是线程不安全的,而Vector是线程安全的,但是即使这样,也不推荐使用Vector,因为Collections有方法可以得到线程安全的ArrayList对象;
- 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);
}
}