详解List列表

List的主要特征是其元素以线性方式存储,List接口主要有:ArrayList和LinkedList;两者的主要区别是ArrayList代表可以代表可变长的数组,允许对元素进行快速随机访问,但对元素的插入和删除速度比较慢;LinkedList采用链表数据结构,插入和删除速度比较快,查询则会比较慢。

  1. 为列表排序
    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类在各方面都没有突出的性能,属于历史集合类,目前已经不提倡使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值