ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。顾名思义,ArrayList是一个数组列表,因此其内部是使用一个数组来存放对象的,因为Object是一切类型的父类,因而ArrayList内部是有一个Object类型的数组类存放对象。ArrayList类常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同时ArrayList内部有一个私有类实现Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同时,还有一个私有类实现了ListIterator接口,因此ArrayList也可以调用listIterator()方法得到ListIterator迭代器。
由于ArrayList是依靠数组来存放对象的,只不过封装起来了而已,因此其一些查找方法的效率都是O(n),跟普通的数组效率差不多,只不过这个ArrayList是一个可变”数组“,并且可以存放一切指定的对象。
另外,由于ArrayList的所有方法都是默认在单一线程下进行的,因此ArrayList不具有线程安全性。若想在多线程下使用,应该使用Colletions类中的静态方法synchronizedList()对ArrayList进行调用即可。
LinkedList可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了Deque接口和List接口。同样,LinkedList也是线程不安全的,如果在并发环境下使用它,同样用Colletions类中的静态方法synchronizedList()对LinkedList进行调用即可。
在LinkedList的内部实现中,并不是用普通的数组来存放数据的,而是使用结点<Node>来存放数据的,有一个指向链表头的结点first和一个指向链表尾的结点last。不同于ArrayList只能在数组末尾添加数据,LinkList可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据,还提供了取走链表头或链表尾的结点,或取走中间某个结点,还可以查询某个结点是否存在。add()方法默认在链表尾部插入数据。总之,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明显高于ArrayList类型,但是查询的效率要低一点,因为它是一个双向链表。
因此,LinkedList与ArrayList最大的区别是LinkedList更加灵活,并且部分方法的效率比ArrayList对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
long startTime = System.currentTimeMillis() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.add( 0 ,i) ; //print : 803
//li.add(i) ; //print : 790
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
|
下面的代码得不出结果速度太慢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.add( 0 ,i) ; //print : 803
//li.add(i) ; //print : 790
}
long startTime = System.currentTimeMillis() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.get(i) ;
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
|
下面化成ArrayList速度就超快
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new ArrayList<Integer>() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.add(i) ;
}
long startTime = System.currentTimeMillis() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.get(i) ; //print : 15
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
|
remove方法对LinkedList类的使用
a.利用iterator类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.add(i) ;
}
long startTime = System.currentTimeMillis() ;
Iterator<Integer> it = li.iterator() ;
while (it.hasNext()){
if (it.next()% 2 == 0 ){
it.remove() ;
}
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
|
b.不利用iterator的话则则需要调用get方法。则效率很低
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import java.util.* ;
public class ListDemo01{
public static void main(String args[]){
List<Integer> li = new LinkedList<Integer>() ;
for ( int i= 0 ;i< 1000000 ;i++){
li.add(i) ;
}
long startTime = System.currentTimeMillis() ;
for ( int i= 0 ;i< 10000 ;i++){
if (li.get(i)% 2 == 0 ){
li.remove(i) ;
}
}
long endTime = System.currentTimeMillis() ;
System.out.println(endTime-startTime) ;
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
相关文章
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 72
-
2025-05-29 29
-
2025-05-25 19
-
2025-05-25 31
-
2025-05-25 79