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);
??
?}
?
?
總結
以上是生活随笔為你收集整理的java vector arraylist linkedlist用法与区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Vector与ArrayLis
- 下一篇: javascript实现的一个带下拉框功