java vector arraylist linkedlist用法与区别

首先,它们是list的实现类,大致说一下vector arraylist linkedlist的区别。


1、线程安全来讲,
vector是线程安全,arraylist linkedlist线程不安全。
2、底层实现来讲,

vector arraylist是数组,linkedlist是双向链表。

3、效率上讲,
vector比arraylist慢。
由于vector和arraylist底层是数组,所以查找起来很快,
而linkedlist是通过指针查找,所以查找起来相对较慢。
而数组的增、删元素,会引起移动数据,而链表则不会。
例如linkedlist删除某一元素,是将这个元素前后两个元素连接在一起,然后将移出的元素置空,
而如果是往arraylist中增加一个元素,比如add(3,"aaa")是把原来第3这个元素移到第4位,第4位移到第5位,依此类推,空出一个位置用来放加进去的元素。
由此可见,arraylist在增删元素时效率会比linkedlist要慢。
linkedlist有头尾指针,于是它可以addFirst("第一个")和addLast("最后一个"),以及getFirst()和getLast()。
是不是arraylist一定就比linkedlist在增删数据慢呢?
未必!
如果已经找到位置的情况下,确实linkedlist要快一点。但实际上,很多时候都需要先找位置,然后插入。
如果找得太久,arraylist就占优势了。
例如,我们往90000这个位置插入一个元素,arraylist很快就能找到这个位置,然后插入,
而linkedlist需要将指针一个个移到这个位置,再插入。
同样是完成往90000这个位置插入一个元素的任务,谁更快,可想而知。
当然,如果linkedlist一直addFirst或addLast,这样也可以省去查找的时间。
另外,假如有100000个元素,如果是arraylist,往第一个位置增加一个元素,和住第50000个增加元素,和往第100000个增加元素,效果是有很大区别的。
主要是区别在于,移动数据的多少。

4、vector和arraylist的扩容问题,
由于底层是数组,它们在初始化时,都是有长度的。
arraylist初始化的三种方式:
1)不初始化起容量  ArrayList al = new ArrayList();//默认容量为10
2)初始化容量ArrayList al = new ArrayList(3);//初始容量为3
3)以一个集合或数组初始化ArrayList al = new ArrayList(a);//a为集合或数组
当一个长度为10的arraylist在添加第11个元素时,它会以当前长度的1.5倍在堆内存中重新创建一个数组对象,然后把原数组内的数据复制过来,放弃原数组,指向新数组。
vector是同样的道理,只不过,它是以2倍的速度扩容,也就是如果原数组长度是10,那么新数组的长度就是20。

 

下面是用法例子:

package wzq.j2se.obj;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class ListDemo {

 public static void main(String[] args) {
  System.out.println("-------vector--------");
  Vector v = new Vector(4);
  v.add("Test0");
  v.add("Test1");
  v.add("Test0");
  v.add("Test2");
  v.add("Test2");

  v.remove("Test0"); //删除指定内容的元素
  v.remove(0); //按照索引号删除元素

  int size = v.size();
  System.out.println("size:" + size);
  
  for(int i = 0;i < v.size();i++){
  System.out.println(v.get(i));
  }


  System.out.println("-------arraylist--------");

  List list = new ArrayList();
  list.add("test0");
  list.add("test1");
  list.add("test2");
  //list.addAll(v);
  list.add("test3");
  list.remove("test1");
  list.remove(2);//注意这儿,是指重新排序后的元素,也就是test3成了第二个元素:test0,test2,test3
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i));
  }
  
  System.out.println("---------------");
  /*ArrayList与数组之间的转换:
   */
  List list1 = new ArrayList();
  list1.add("1");
  list1.add("2");
  final int size1 = list1.size();
  String[] arr = (String[])list1.toArray(new String[size1]);

  System.out.println("arr=="+arr[0]);
  System.out.println("arr=="+arr[1]);
  
  
  String[] arr2 = new String[] {"4", "5"};
  List list2 = Arrays.asList(arr2);
  for(int i=0;i<list2.size();i++){
   System.out.println(list2.get(i));
  }


  System.out.println("-------linkedlist--------");
  
     //初使化一个链表
     LinkedList head = new LinkedList();
     head.add(new String("小狗"));
     head.add(new String("美国"));
     head.add(new String("Japanese!"));
     head.add(2, "小猪");
     //链表会自动用遍历的方式打印所有內容
     System.out.println(head);
     //利用Vector或者是ArrayList等Collection往链表中加数据
     Vector v1 = new Vector();
     //向Vector中加入东西
     v1.add("大狗");
     v1.add("老美");
     v1.add("JAPAN");
     v1.add("老猪");
     //将当前Vector加在当前链表的最后
     head.addAll(v1);
     System.out.println(head);
     //将当前Vector加在当前链表的指定位置
     head.addAll(2, v1);
     System.out.println(head);
     //打印指定位置的內容
     System.out.println(head.get(2));
     head.addFirst("第一个");
     System.out.println(head);
     head.addLast("最后一个");
     System.out.println(head);
     //刪除第一个
     head.remove(head.getFirst());
     System.out.println(head);
     //再刪除第一个,采用下标的方式,下标是从0开始的
     head.remove(0);
     System.out.println(head);
     head.remove(head.getLast());
     System.out.println(head);

  
 }
 
 

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值