JAVA集合框架
Java集合框架——线性表
1. 线性表
前文已经讲述过集合框架中的第一种容器类型——规则集,这种容器内只能存储不重复的元素。为了允许在一个集合中存储相同的元素,需要通过线性表来实现。线性表不仅可以存储相同的元素,还允许用户指定它们存储的位置,用户可以通过下标来访问元素,类似于数组。线性表(List)接口扩展了Collection接口,增加了面向位置的操作,还增加了一个能够双向遍历线性表的新迭代器,即listIterator,这个迭代器在《集合框架——迭代器》中已经有过讲述。下面我们来看一下List接口中的新方法。
方法 | 功能 |
---|---|
boolean add(int index,E element) | 在指定下标处添加一个新元素 |
boolean addAll(int index, Collection c) | 在指定下标处添加集合c中的所有元素 |
E get(int index) | 获得指定下标的元素 |
int indexOf(Object element) | 返回第一个匹配元素的下标 |
int lastIndexOf(Object element) | 返回最后一个个匹配元素的下标 |
ListIterator listIterator() | 返回线性表迭代器,能够双向遍历线性表 |
ListIterator listIterator(int startIndex) | 返回线性表迭代器,从startIndex下标开始的元素所使用的迭代器 |
E remove(int Index) | 返回指定下标处的元素并删除 |
E set(int index, E element) | 设置指定下标处的元素 |
List subList(int fromIndex, int toIndex) | 返回从fromIndex到toIndex-1的子列表 |
其中listIterator()方法返回了一个ListIterator实例,那么我们来看一下该线性表迭代器类中所包含的具体方法。
方法 | 功能 |
---|---|
void add(E e) | 添加指定的元素 |
boolean hasPrevious() | 判断是否有后向元素,有则返回true |
int nextIndex() | 返回下一个元素的下标 |
E previous() | 返回迭代器中前向元素值 |
int previousIndex() | 返回前向元素下标 |
void set(E e) | 使用指定的元素替换previous或next方法返回的最后一个元素 |
与规则集的实现相同,AbstractList类提供了List接口的部分实现。AbstractSequentialList类扩展了AbstractList类,以提供对链表的支持。
2. 数组线性表类ArrayList
ArrayLists是一个实现List接口的大小可变的数组。它还提供一些方法,用于管理存储线性表的内部数组的大小。每个ArrayList实例都有它的容量,这个容量是指存储线性表中元素的数组的大小,它一定不小于所存储的线性表的大小。向ArrayList添加元素时,其容量会自动增大。ArrayList不能自动减小,需要调用trimToSize()方法将内部数字缩小到线性表的大小。具体实现如下所示。
import java.util.*;
public class ListTest{
public static void main(String[] args){
List<Integer> arraylist=new ArrayList<Integer>();
arraylist.add(1);
arraylist.add(2);
arraylist.add(3);
arraylist.add(4);
System.put.println(arraylist);
}
}
3. 链表类LinkedList
LinkedList是实现List接口的一个链表,除了实现List接口之外,LinkedList类还提供了从线性表两端提取、插入和删除元素的方法,具体方法如下所示。
方法 | 功能 |
---|---|
void addFirst(E e) | 添加对象至列表头 |
void addLast(E e) | 添加对象至列表尾 |
E getFirst() | 获得列表头元素 |
E getLast() | 获得列表尾元素 |
E removeFirst() | 删除列表头并返回 |
E removeLast() | 删除列表尾并返回 |
除了调用LinkedList()构造空链表外,我们当然还可以调用LinkedList(Collection c)通过已有集合来构造链表,具体实现如下所示,代码承接第二节中的代码。
import java.util.*;
public class ListTest{
public static void main(String[] args){
LinkedList<Object> linkedList=new LinkedList<Object>(arraylist);
}
}
比较链表类和数组线性表类,可以发现上述两种线性表最主要的不同体现在其内部实现上。如果我们需要提取元素或在线性表的尾部插入和删除元素,数组线性表具有较高的效率。如果要在任意位置上插入和删除元素,那么链表的具有较高的效率。
4. 线性表和集合的静态方法
Java集合框架在Coleections类中提供了用于对线性表进行排序的静态方法,此外还提供了用于线性表的binarySearch、reverse、shuffle、copy以及fill方法。下面将对一系列常用的静态方法进行演示。
- void sort(List list):对指定列表进行排序,排序结果将以升序显示
List<String> list=Arrays.asList("red","blue","green");
Collections.sort(list);
- void sort(List list, Comparator c):按照指定比较器进行排序
List<String> list=Arrays.asList("red","blue","green");
Comparator comparator=Collections.reverseOrder();//reverseOrder()方法返回一个集合的逆序比较器
Collections.sort(list,comparator);//使用逆序比较器相当于逆序显示结果
- void reverse(List list):逆序排列指定列表
List<String> list=Arrays.asList("red","blue","green");
Collections.reverse(list);
- void shuffle(List list):随机打乱指定列表
List<String> list=Arrays.asList("red","blue","green");
Collections.sort(list);
- void copy(List des,List src):将源线性表中的所有元素以同样的下标复制到目标线性表中,仅复制元素的引用
List<String> list1=Arrays.asList("red","blue","green");
List<String> list2=Arrays.asList("red","yellow","gray");
Collections.reverse(list1,list2);
- void fill(List list,Object o):用指定元素替换线性表中的所有元素。
List<String> list=Arrays.asList("red","blue","green");
Collections.fill(list,"black");//这样集合中的所有元素都被替换为black
以上为部分线性表的静态方法,可作用于List的扩展类。
- Object max(Collection c)/Object min(Collection c):返回集合的最大最小值,集合元素必须是使用Comparable接口或Comparator接口可比较的对象。
Collection<String> collection=Arrays.asList("red","blue","green");//max和min方法只能用于Collection对象
System.out.println(Collections.max(collection));
System.out.println(Collections.min(collection));
- boolean disjoint(Collection c1, Collection c2):对两个集合求交,若没有相同元素返回true,反之返回false
Collection<String> c1=Arrays.asList("red","blue","green");
Collection<String> c2=Arrays.asList("red","yellow","black");
Collection<String> c3=Arrays.asList("yellow","gray","black");
System.out.println(Collections.disjoint(c1,c2));//返回false
System.out.println(Collections.disjoint(c1,c3));//返回true
以上为部分集合的静态方法
5. 向量类与栈类
5.1 Vector
除了包含用于访问和修改向量的同步方法之外,Vector与ArrayList是一样的。同步方法用于防止两个或者多个线程同时访问某个向量时引起的数据损坏。对于不需要同步的应用程序来说,使用ArrayList比使用Vector效率更高。Vector实现了List接口。
5.2 Stack
栈类是作为向量类的扩展来实现的。栈包含具体方法如下表格所示。
方法 | 功能 |
---|---|
boolean empty() | 如果栈为空则返回true |
E peek() | 返回栈顶元素 |
E pop() | 返回并删除栈顶元素 |
E push(E e) | 在栈顶增加新元素 |
int search(Object o) | 返回栈中指定元素的下标 |