List的主要特征是其元素以线性方式存储,List接口主要有:ArrayList和LinkedList;两者的主要区别是ArrayList代表可以代表可变长的数组,允许对元素进行快速随机访问,但对元素的插入和删除速度比较慢;LinkedList采用链表数据结构,插入和删除速度比较快,查询则会比较慢。
- 为列表排序
Collections是java集合的辅助类,提供sort()方法对集合元素排序
import java.util.ArrayList;
import java.util.*;
public class list {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(3));
list.add(new Integer(4));
list.add(new Integer(3));
list.add(new Integer(2));
Collections.sort(list);
for(Integer i : list){
System.out.println(i + "");
}
}
}
2.ListIterator接口
List的ListIterator()方法返回一个Listterator对象,ListIterator接口继承了Iterator接口,此外还提供专门的操纵列表的方法:
- add():向列表插入一个元素。
- hasNext():判断类表中是否还有下一个元素。
- hasPrevious():判断类表中是否还有上一个元素。
- next():返回类表中的下一个元素。
- previous():返回列表中的上一个元素。
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class ListInserter {
//向List列表中按顺序插入数据
public static void insert(List<Integer> list,int data){
ListIterator<Integer> it = list.listIterator();
while(it.hasNext()){
Integer in = it.next();
if(data <= in.intValue()){
it.previous();
it.add(data);
break;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个链接列表
List<Integer> list = new LinkedList<Integer>();
list.add(3);
list.add(2);
list.add(5);
list.add(9);
Collections.sort(list);
insert(list,6);
System.out.println(Arrays.toString(list.toArray()));
}
}
`
3.获得固定长度的list对象
java.util.Arrays类提供的asList()方法能够把一个Java数组包装为一个List对象,这个对象代表固定长度的数组
`import java.util.Arrays;
import java.util.List;
public class listSize {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] ss = {"Tom","MIke","Jack"};
List<String> list = Arrays.asList(ss);
list.set(0,"Jane");
System.out.println(Arrays.toString(ss));
//list.remove("Mike");运行时会抛java.lang.UnsupportOperationException
//list.add("Mary");运行时会抛java.lang.UnsupportOperationException
}
由于数组长度不能改变所以这种情况不能调用List对象的add()和remove()方法
否则会抛出java.lang.UnsupportOperationException运行时异常。
4.比较Java数组和各种list的性能
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
public class PerformanceTester {
private static final int TIMES = 100000;
public static abstract class Tester{
private String operation;
public Tester(String operation){
this.operation = operation;
}
public abstract void test(List<String> list);
public String getOperation(){
return operation;
}
}
//执行遍历操作的匿名类
static Tester iterateTester = new Tester("iterate"){
@Override
public void test(List<String> list) {
// TODO Auto-generated method stub
for(int i = 0; i < 10; i++){
Iterator<String> it = list.iterator();
while(it.hasNext()){
it.next();
}
}
}
};
//执行随机访问操作的匿名类
static Tester getTester = new Tester("get"){
@Override
public void test(List<String> list) {
// TODO Auto-generated method stub
for(int i = 0; i < list.size(); i++){
for(int j = 0; j < 10; j++){
list.get(j);
}
}
}
};
//执行插入操作的匿名类
static Tester insertTester = new Tester("insert"){
@Override
public void test(List<String> list) {
// TODO Auto-generated method stub
ListIterator<String> it = list.listIterator(list.size() / 2);
for(int i = 0; i < TIMES / 2; i++){
it.add("hello");
}
}
};
//执行删除操作的匿名类
static Tester removeTester = new Tester("remove"){
@Override
public void test(List<String> list) {
// TODO Auto-generated method stub
ListIterator<String> it = list.listIterator();
while(it.hasNext()){
it.next();
it.remove();
}
}
};
static public void testJavaArray(List<String> list){
Tester[] testers = {iterateTester,getTester};
test(testers,list);
}
static public void testList(List<String> list){
Tester[] testers = {insertTester,iterateTester,getTester,removeTester};
test(testers,list);
}
static public void test(Tester[] testers, List<String> list) {
// TODO Auto-generated method stub
for(int i = 0; i < testers.length; i++){
System.out.print(testers[i].getOperation() + "操作: ");
long t1 = System.currentTimeMillis();
testers[i].test(list);
long t2 = System.currentTimeMillis();
System.out.print(t2 - t1 + "ms");
System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = null;
//测试java数组
System.out.print("---测试java数组---");
String[] ss = new String[TIMES];
Arrays.fill(ss, "hello");
list = Arrays.asList(ss);
testJavaArray(list);
ss = new String[TIMES / 2];
Collection<String> col = Arrays.asList(ss);
//测试Vector
System.out.print("---测试Vector---");
list = new Vector<String>();
list.addAll(col);
testList(list);
//测试LinkedList
System.out.print("---测试LinkedList---");
list = new LinkedList<String>();
list.addAll(col);
testList(list);
//测试ArrayList
System.out.print("---测试ArrayList---");
list = new ArrayList<String>();
list.addAll(col);
testList(list);
}
}
结果:—测试java数组—iterate操作: 34ms
get操作: 21ms
—测试Vector—insert操作: 826ms
iterate操作: 57ms
get操作: 35ms
remove操作: 5422ms
—测试LinkedList—insert操作: 7ms
iterate操作: 27ms
get操作: 33ms
remove操作: 10ms
—测试ArrayList—insert操作: 785ms
iterate操作: 19ms
get操作: 11ms
remove操作: 3261ms
以上结果可以看出,对java数组进行随机访问和遍历操作具有最快的速度;对LinkedList进行插入和删除操作具有最快的速度;对ArrayList进行随机访问也具有较快的速度。Vector类在各方面都没有突出的性能,属于历史集合类,目前已经不提倡使用。