赞
踩
javalist
List是Java中比较常用的调集类,关于List接口有许多完成类,本文就来简略介绍下其间几个重点的完成ArrayList、LinkedList和Vector之间的联系和差异。
List是一个接口,它承继于Collection的接口。它代表着有序的队列。当我们讨论List的时分,一般都和Set作比较。
List中元素能够重复,并且是有序的(这儿的有序指的是依照放入的次序进行存储。如依照次序把1,2,3存入List,那么,从List中遍历出来的次序也是1,2,3)。
Set中的元素不能够重复,并且是无序的(从set中遍历出来的数据和放入次序没有联系)。
下面是Java中的调集类的联系图。从中能够大致了解调集类之间的联系
ArrayList、LinkedList和Vector之间的差异
从上图能够看出,ArrayList、LinkedList和Vector都完成了List接口,是List的三种完成,所以在用法上十分相似。他们之间的首要差异体现在不同操作的功能上。后面会详细分析。
ArrayList
ArrayList底层是用数组完成的,能够以为ArrayList是一个可改动巨细的数组。跟着越来越多的元素被添加到ArrayList中,其规划是动态添加的。
LinkedList
LinkedList底层是经过双向链表完成的。所以,LinkedList和ArrayList之前的差异首要就是数组和链表的差异。
数组中查询和赋值比较快,由于能够直接经过数组下标访问指定方位。
链表中删除和添加比较快,由于能够直接经过修正链表的指针(Java中并无指针,这儿能够简略理解为指针。其实是经过Node节点中的变量指定)进行元素的增删。
所以,LinkedList和ArrayList比较,增删的速度较快。可是查询和修正值的速度较慢。同时,LinkedList还完成了Queue接口,所以他还供给了offer(),peek(),poll()等办法。
Vector和ArrayList相同,都是经过数组完成的,可是Vector是线程安全的。和ArrayList比较,其间的许多办法都经过同步(synchronized)处理来保证线程安全。
假如你的程序不涉及到线程安全问题,那么运用ArrayList是更好的挑选(由于Vector运用synchronized,必然会影响功率)。
二者之间还有一个差异,就是扩容策略不相同。在List被第一次创立的时分,会有一个初始巨细,跟着不断向List中添加元素,当List以为容量不行的时分就会进行扩容。Vector缺省情况下主动增加原来一倍的数组长度,ArrayList增加原来的50%。
ArrayList和LinkedList的功能比照
运用以下代码对ArrayList和LinkedList中的几种首要操作所用时刻进行比照:
ArrayListarrayList=newArrayList();
LinkedListlinkedList=newLinkedList();
//ArrayListadd
longstartTime=System.nanoTime();
for(inti=0;i<100000;i++){
arrayList.add(i);
}
longendTime=System.nanoTime();
longduration=endTime-startTime;
System.out.println(“ArrayListadd:”+duration);
//LinkedListadd
startTime=System.nanoTime();
for(inti=0;i<100000;i++){
linkedList.add(i);
}
endTime=System.nanoTime();
duration=endTime-startTime;
System.out.println(“LinkedListadd:”+duration);
//ArrayListget
startTime=System.nanoTime();
for(inti=0;i<10000;i++){
arrayList.get(i);
}
endTime=System.nanoTime();
duration=endTime-startTime;
System.out.println(“ArrayListget:”+duration);
//LinkedListget
startTime=System.nanoTime();
for(inti=0;i<10000;i++){
linkedList.get(i);
}
endTime=System.nanoTime();
duration=endTime-startTime;
System.out.println(“LinkedListget:”+duration);
//ArrayListremove
startTime=System.nanoTime();
for(inti=9999;i>=0;i–){
arrayList.remove(i);
}
endTime=System.nanoTime();
duration=endTime-startTime;
System.out.println(“ArrayListremove:”+duration);
//LinkedListremove
startTime=System.nanoTime();
for(inti=9999;i>=0;i–){
linkedList.remove(i);
}
endTime=System.nanoTime();
duration=endTime-startTime;
System.out.println(“LinkedListremove:”+duration);
成果:
ArrayListadd:13265642
LinkedListadd:9550057
ArrayListget:1543352
LinkedListget:85085551
ArrayListremove:199961301
LinkedListremove:85768810
他们的表现的差异是显而易见的。在添加和删除操作上LinkedList更快,但在查询速度较慢。
如何挑选
假如涉及到多线程,那么就挑选Vector(当然,你也能够运用ArrayList并自己完成同步)。
假如不涉及到多线程就从LinkedList、ArrayList中选。LinkedList更适合从中间刺进或者删除(链表的特性)。ArrayList更适合检索和在末尾刺进或删除(数组的特性)。
javalist排序sort升序、降序
首要实体类需求完成Comparable接口
完成compareTo()办法
下面是降序如果需求升序则把位置交换一下就好了
然后调用Collections.sort(list);
publicstaticvoidmain(String[]args){
Listlist=newArrayList();
list.add(newStudent(“张三”,”WN001″,88));
list.add(newStudent(“李四”,”WN002″,75));
list.add(newStudent(“王五”,”WN003″,99));
list.add(newStudent(“赵六”,”WN004″,58));
list.add(newStudent(“田七”,”WN005″,67));
list.add(newStudent(“小八”,”WN006″,58));
list.add(newStudent(“唐七”,”WN007″,35));
list.add(newStudent(“商十”,”WN008″,78));
Collections.sort(list);
for(inti=0;i
System.out.println(list.get(i).toString());
}
}
publicclassStudentimplementsComparable{
privateStringname;
privateStringid;
privateintscore;
//…………省略结构函数和GETSET办法
@Override
publicintcompareTo(Studento){
returno.getScore()-this.score;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。