淺談Java語言中ArrayList和HashSet的區別


Java語言中ArrayList和HashSet的區別

                                                                                                                                                          2019-04-10   13:22:49

一、基本區別

首先一起看個實例,其代碼如下:

package com.MrZ_baby.com;

import java.util.List;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Set;

public class test_4 {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        List list = new ArrayList();

        list.add("Test_4_1");

        list.add("Test_4_1");

        list.add("Test_4_1");

        list.add("Test_4_1");

        Set set = new HashSet();

        set.add("Test_4_1");

        set.add("Test_4_1");

        set.add("Test_4_1");

        set.add("Test_4_1");

       

        System.out.println("List中數據大小為:"+list.size()+"\nSet中數據大小為:"+set.size());

    }

}

 

運行結果為:

List中數據大小為:4

Set中數據大小為:1

 

 

結論:

  1. HashSet   

1)   HashSet不能夠存儲相同的元素,元素是否相同的判斷:重寫元素的equals方法。equals方法和hashCode方法必須兼容,如:equals方法判斷的是用戶的名字name,那么hashCode的返回的hashcode必須是name。hashcode();

2)   HashSet存儲是無序的,保存的順序與添加的順序是不一致的,它不是線性結構,而是散列結構,(通過散列表:散列單元指向鏈表)。因此,HashSet的查詢效率相對比較高。

3)   HashSet不是線程安全的,不是線程同步的。這需要自己實現線程同步:Collections.synchronizedCollection(),方法實現。

2.ArrayList

1)   ArrayList中存放順序和添加順序是一致的。並且可重復元素。

2)   不是線程安全的,不是線程同步的。

3)   ArrayList是通過可變大小的數組實現的,允許null在內的所有元素。

4)   ArrayList適合通過位子來讀取元素。

二、性能比較區別

首先一起看個實例,其代碼如下:

package com.MrZ_baby.com;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

public class Test4_1 {

public static void main(String[] args) {

    // TODO Auto-generated method stub

    Set<Integer> set = new HashSet<>();

    List<Integer> list = new ArrayList<>();

    Long time_1 = System.currentTimeMillis();

    for(int i = 0; i < 100000; i ++)

    {

    set.add(i);

    }

    Long time_2 = System.currentTimeMillis();

    for(int i = 0; i < 100000; i ++){

    list.add(i);

    }

    Long time_3 = System.currentTimeMillis();

    System.out.println("往HashSet里面添加100000條數據花費時間為:" + ( time_2 - time_1 ));

    System.out.println("往ArrayList里面添加100000條數據花費時間為:" + ( time_3 - time_2 ));

    Long time_4 = System.currentTimeMillis();

    for(Integer i : set){

    }

    Long time_5 = System.currentTimeMillis();

    Iterator<Integer> item = set.iterator();

    while (item.hasNext()) {

    Integer str = item.next();

    }

    Long time_6 = System.currentTimeMillis();

    for(Integer i : list){

    }

    Long time_7 = System.currentTimeMillis();

    System.out.println("HashSet重復迭代(foreach) 100000次花費時間為:" + ( time_5 - time_4 ));

    System.out.println("HashSet重復迭代(iterator) 100000次花費時間為:" + ( time_6 - time_5 ));

   System.out.println("ArrayList重復迭代(foreach) 100000次花費時間為:" + ( time_7 - time_6 ));

}

}

運行結果為:

以500為例

以100000為例

以5000000為例

 

 

結論:

1)   ArrayList始終比HashSet性能要高

2)   HashSet每次添加總要判斷hashcode導致效率低

3)   HashSet兩種循環中iterator 方式不穩定,不過總是比foreach要快一點


免責聲明!

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



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