前面简单介绍集合框架和迭代器,下面来了解下List。
List接口下的一共三个实现类:ArrayList,Vector,LinkedList。
List集合的特有功能概述
* void add(int index,E element)
* E remove(int index)
* E get(int index)
* E set(int index,E element)
List迭代器(ListIterator)
* boolean hasNext()是否有下一个
* boolean hasPrevious()是否有前一个
* Object next()返回下一个元素
* Object previous();返回上一个元素
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a ");
list.add("b ");
list.add("c ");
list.add("d ");
ListIterator<String> iterator = list.listIterator();
while(iterator.hasNext()) {
System.out.print(iterator.next());
}
System.out.println();
//此时指针已到达末尾,所以会逆着输出一遍。若上面的while循环和下面交换,则达不到此效果
while(iterator.hasPrevious()) {
System.out.print(iterator.previous());
}
}
/*outPut:
* a b c d
* d c b a
*/
Vector类特有功能
* public void addElement(E obj)
* public E elementAt(int index)
* public Enumeration elements()
使用上述特有功能进行迭代
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.addElement("a ");
vector.addElement("b ");
vector.addElement("c ");
vector.addElement("d ");
Enumeration<String> enumeration = vector.elements();
while(enumeration.hasMoreElements()) {
System.out.print(enumeration.nextElement());
}
}
/*outPut:
* a b c d
*/
LinkedList类特有功能
* public void addFirst(E e)及addLast(E e)
* public E getFirst()及getLast()
* public E removeFirst()及public E removeLast()
* public E get(int index);
使用LinkedList模拟 栈 数据结构
class Stack {
private LinkedList linkedList;
public Stack() {
linkedList = new LinkedList();
}
public boolean empty() {
return linkedList.isEmpty();
}
public void push(Object obj) {
linkedList.addFirst(obj);
}
public Object pop() {
return linkedList.removeFirst();
}
}
测试
public static void main(String[] args) {
Stack stack = new Stack();
stack.push("a ");
stack.push("b ");
stack.push("c ");
stack.push("d ");
while(!stack.empty()) {
System.out.print(stack.pop());
}
}
/*outPut:
* d c b a
*/
ArrayList
下面我们通过一个例子来学习ArrayList
去除ArrayList中重复的字符串元素
/*
* 思路:创建一个新集合,迭代需去重集合的元素,每次判断新集合中是否包含该元素,无则添加
*/
public static ArrayList<String> distinct(ArrayList<String> list) {
ArrayList<String> newList = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String temp = iterator.next();
if(!newList.contains(temp)) {
newList.add(temp);
}
}
return newList;
}
测试:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a ");
list.add("c ");
list.add("a ");
list.add("b ");
list.add("d ");
list.add("a ");
list.add("b ");
list.add("c ");
System.out.println(list);
ArrayList<String> newList = distinct(list);
System.out.println(newList);
}
/*outPut:
* [a , c , a , b , d , a , b , c ]
* [a , c , b , d ]
*/
更多功能请查看API
总结
先讲讲数组和链表的区别:
数组
查询快修改也快
增删慢
链表
查询慢,修改也慢
增删快
List的三个子类的特点:
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
Vector和ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的