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));
          }

分別在ArrayList和LinkedList集合中添加5萬條數據,測試運行結果如下:

 

從以上結果,我i們可以看出 ArrayList更適合讀取數據,linkedList更多的時候添加或刪除數據。

ArrayList:內部是使用可増長數組實現的,所以是用get和set方法是花費少數時間的,但是如果插入元素和刪除元素,除非插入和刪除的位置都在表末尾,否則代碼開銷會很大,因為里面需要數組的移動。
LinkedList:是使用雙鏈表實現的,所以get會非常消耗資源,除非位置離頭部很近。但是插入和刪除元素花費少數時間。

 

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

 

 

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("集合中沒有小佳");
        }
    }
}

測試運行結果如下:

 

三: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("小佳","母");//索引為0
        Pig xiaolong=new Pig("小龍","公");//索引為1
        Pig jiajia=new Pig("佳佳","女");//索引為2
        Pig longlong=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("集合中不存在小佳");
        }
    }
}

測試運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM