1. 程式人生 > 程式設計 >區分Java中的ArrayList和LinkedList

區分Java中的ArrayList和LinkedList

一:ArrayList和LinkedList的大致區別如下:

1.ArrayList是實現了基於動態陣列的資料結構,ArrayList實現了長度可變的陣列,在記憶體中分配連續的空間。遍歷元素和隨機訪問元素的效率比較高

2.LinkedList基於連結串列的資料結構, 插入、刪除元素時效率比較高 故:【插入、刪除操作頻繁時,可使用LinkedList來提高效率】

LinkedList提供對頭部和尾部元素進行新增和刪除操作的方法,插入/刪除第一個和最後一個效率比較高;

3:ArrayList和LinkedList都是List介面的實現,都儲存一組不唯一,有序(插入順序)的物件,對元素進行新增、刪除等操作[ 即:List的性質]

4.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。

5.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。

6:LinkedList比ArrayList更佔記憶體

eg:(程式碼示例01)----ArrayList與LinkedLis的資料新增和查詢耗時對比

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

public class HFSD {
  static final int N=50000;   //新增5000條資料
   static long timeList(List list){    //新增資料所需時間
         long start=System.currentTimeMillis();
        Object o = new Object();
         for(int i=0;i<N;i++) {
             list.add(0,o);
           }
         return System.currentTimeMillis()-start;
       }
   static long readList(List list){      //查詢資料所需時間
         long start=System.currentTimeMillis();
         for(int i=0,j=list.size();i<j;i++){

           }
         return System.currentTimeMillis()-start;
       }

       static List addList(List list){
         Object o = new Object();
         for(int i=0;i<N;i++) {
            list.add(0,o);
           }
         return list;
       }
   public static void main(String[] args) {
        System.out.println("ArrayList新增"+N+"條耗時:"+timeList(new ArrayList()));
         System.out.println("LinkedList新增"+N+"條耗時:"+timeList(new LinkedList()));

       List list1=addList(new ArrayList<>());
       List list2=addList(new LinkedList<>());
        System.out.println("ArrayList查詢"+N+"條耗時:"+readList(list1));
        System.out.println("LinkedList查詢"+N+"條耗時:"+readList(list2));
     }

區分Java中的ArrayList和LinkedList

從以上結果,我i們可以看出 ArrayList更適合讀取資料,linkedList更多的時候新增或刪除資料。

ArrayList:內部是使用可増長陣列實現的,所以是用get和set方法是花費少數時間的,但是如果插入元素和刪除元素,除非插入和刪除的位置都在表末尾,否則程式碼開銷會很大,因為裡面需要陣列的移動。

LinkedList:是使用雙鏈表實現的,所以get會非常消耗資源,除非位置離頭部很近。但是插入和刪除元素花費少數時間。

二:ArrayList和LinkedList的共有方法(即List的方法):

區分Java中的ArrayList和LinkedList

eg:(程式碼示例02)----ArrayList程式碼示例

package JIhekuangjia006.ArrayList;

/**
 * 小豬類
 */
public class Pig {
  private String name;
  private String sex;

  public Pig(String name,String sex){
    this.name=name;
    this.sex=sex;
  }
  public void setName(String name){
    this.name=name;
  }
  public String getName(){
    return name;
  }
  public void setSex(String sex){
    this.sex=sex;
  }
  public String getSex(){
    return sex;
  }
}
package JIhekuangjia006.ArrayList;

import java.util.*;

/**
 * 使用ArrayList集合進行操作資料
 */
public class Test1 {
  public static void main(String[] args) {
    //1.儲存小豬資訊
    Pig xiaojia=new Pig("小佳","母");//索引為0
    Pig xiaolong=new Pig("小龍","公");//索引為1
    Pig jiajia=new Pig("佳佳","女");//索引為2
    Pig longlong=new Pig("龍龍","男");//索引為3(與陣列相同,從0開始)

    //為小豬排序
    List list=new ArrayList();
    //直接將元素新增排序
    list.add(xiaojia);
    list.add(jiajia);
    list.add(xiaolong);

    //將龍龍新增到索引為2的位置
    list.add(2,longlong);

    //list.add(jiajia);//List 介面儲存一組不唯一,有序(插入順序)的物件

    //2.獲得小豬的總數
    //通過list.size()方法獲取元素的個數
    list.size();
    System.out.println("小豬的總數為"+list.size());

    //3.逐條列印小豬資訊
    //方法一:for迴圈與get()方法配合實現遍歷
    for(int i=0;i<list.size();i++){
      Pig center=(Pig)list.get(i);//因為list.get()的返回值為Object的型別,所以需要強轉為Pig的型別
      System.out.println(center.getName()+","+center.getSex());
    }

    //方法二:通過迭代器Iterator實現遍歷
//    Iterator it=list.iterator();
//    while (it.hasNext()){
//      Pig center=(Pig)it.next();
//      System.out.println(center.getName()+","+center.getSex());
//    }


    System.out.println("*********************************************************");
    //4.刪除小豬資訊
    //刪除第一隻小豬,小佳
    list.remove(0);//與陣列下標相對應
    //刪除指定小豬,小龍
    list.remove(xiaolong);
    //將剩下的小豬資訊進行輸出
    System.out.println("刪除之後還有"+list.size()+"只小豬,\n分別是:");
    for(int i=0;i<list.size();i++){
      /**
       * Object get(int index)返回指定索引位置處的元素。取出的元素是Object型別,
       * 使用前需要進行強制型別轉換
       */
      Pig center=(Pig)list.get(i);//所以需要強轉為Pig的型別

      System.out.println(center.getName()+","+center.getSex());
    }

    System.out.println("*******************************************************");
    //5.判斷集合中是否包含指定小豬
    if (list.contains(xiaojia)){//使用list.contains()方法進行判斷
      System.out.println("集合中有小佳");
    }else{
      System.out.println("集合中沒有小佳");
    }
  }
}

測試執行結果如下:

區分Java中的ArrayList和LinkedList

三:LinkedList的特有方法:

區分Java中的ArrayList和LinkedList

eg:(程式碼示例03)----LinkedList程式碼示例:

package JIhekuangjia006.LinkedList;

/**
 * 小豬類
 */
public class Pig {
  private String name;  //暱稱
  private String sex;   //性別

  public Pig(String name,String sex){
    this.name=name;
    this.sex=sex;
  }
  public void setName(String name){
    this.name=name;
  }
  public String getName(){
    return name;
  }
  public void setSex(String sex){
    this.sex=sex;
  }
  public String getSex(){
    return sex;
  }
}
package JIhekuangjia006.LinkedList;

import java.util.Iterator;
import java.util.LinkedList;

/**
 * 使用LinkedList集合操作資料
 */
public class Test2 {
  public static void main(String[] args) {
    //1.儲存小豬資訊
    Pig xiaojia=new Pig("小佳","男");//索引為3(與陣列相同,從0開始)

    //為小豬排序
    LinkedList list=new LinkedList();
    //直接將元素新增排序
    list.add(xiaolong);
    list.add(longlong);
    list.addFirst(jiajia);//將佳佳新增到第一個位置
    list.addLast(xiaojia);//將小龍新增到最後一個位置

    //list.add(jiajia);//List 介面儲存一組不唯一,有序(插入順序)的物件

    //2.獲得小豬的總數
    //通過list.size()方法獲取元素的個數
    list.size();
    System.out.println("小豬的總數為"+list.size());

    //3.逐條列印小豬的資訊

    //方法一:通過迭代器Iterator實現遍歷
    Iterator it=list.iterator();
    while (it.hasNext()){
      Pig center=(Pig)it.next();
      System.out.println(center.getName()+","+center.getSex());
    }

    //方法二:for迴圈與get()方法配合實現遍歷
//    for(int i=0;i<list.size();i++){
//      Pig pig=(Pig)list.get(i);
//      System.out.println(pig.getName()+","+pig.getSex());
//    }

    System.out.println("************************************************");

    //4.
    //獲取第一隻小豬的資訊
    Pig center=(Pig)list.getFirst();
    System.out.println("第一條狗狗資訊是:"+center.getName()+","+center.getSex());
    //獲取最後一隻小豬的資訊
    Pig center1=(Pig)list.getLast();
    System.out.println("最後一條狗狗資訊是:"+center1.getName()+","+center1.getSex());

    System.out.println("*****************************************************");

    //5.刪除第一隻小豬和最後一隻小豬
    list.removeFirst();
    list.removeLast();

    System.out.println("*****************************************************");

    //6.輸出剩下小豬的資訊
    System.out.println("剩下還有"+list.size()+"只小豬,\n分別是:");
    for(int i=0;i<list.size();i++){
      Pig pig=(Pig)list.get(i);
      System.out.println(pig.getName()+","+pig.getSex());
    }
    //7.判斷集合中是否存在小佳
    if(list.contains(xiaojia)){
      System.out.println("集合中存在小佳");
    }else{
      System.out.println("集合中不存在小佳");
    }
  }
}

測試執行結果如下:

區分Java中的ArrayList和LinkedList

以上就是區分Java中的ArrayList和LinkedList的詳細內容,更多關於Java中ArrayList和LinkedList的資料請關注我們其它相關文章!