集合接口list與集合接口set的區別


  • 在Java中 除了 Map以外的集合的根接口都是Collection接口,而在Collection接口的子接口中,最重要的莫過於List和Set集合接口。

  今天我們就來談談List集合接口與Set集合接口的差異性。

 

  • 查看List集合接口的接口方法

  

  

  • 查看Set集合接口的API

  

 

  • 從兩者的API中,以add和get為例來看,
  • List中提供索引的方式來添加元素和獲取元素,而Set並不提供。由此可見List集合可是達到精確的存儲和獲取,而Set只能一個一個的比較,顯然效率和實用性是比不上List集合的

 

  • List集合是有序存儲,Set集合是無序存儲。這里的有序和無序針對的是存儲地址來說的。
  • List可以存儲重復的值,Set不可以存儲重復的值

  我們看下面的例子

 

/**
*向List集合里面添加一百個隨機數
*/
@Test
public void listTest() { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { Random random = new Random(); list.add(random.nextInt(101)); } Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()) { System.out.print(iterator.next().toString()+" "); } System.out.println("list 的大小="+list.size()); }

 

輸出結果是:58  30  16  71  84  89  86  19  52  15  80  10  2  53  62  96  47  100  54  83  91  68  43  39  23  11  52  ...
      其中 值為52的重復出現
list的大小 = 100
      遍歷了一百次,每一次的值都放到了List集合里面。

  

 

 

    /**
     * 向Set集合里面添加一百個隨機數
     */
    @Test
    public void setTest() {
        
        Set<Object> set = new HashSet<>();
        
        for (int i = 0; i < 100; i++) {
            Random random = new Random();
            set.add(random.nextInt(101));
        }
        
        Iterator<Object> iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.print("   "+iterator.next());
        }
        System.out.println();
        System.out.println("set的大小="+set.size());
    }
 輸出結果:0   1   2   5   6   7   8   9   10   12   13   14   15   16   18   19   21   23   24   26   27   28   30   31   ...
     發現set集合里面並沒有重復的值 
 set的大小=66;
     我們本來是遍歷了一百次,但是set的集合的大小只有66次。因為產生的隨機數有重復的,這也證明了set集合里面不能儲存重復的值。
認真觀察,你會發現set集合里面遍歷出來的值是有序的(從小到大),而List結合遍歷出來的值是無序的。
但是怎么說Set結合是無序集合而List結合是有序集合呢。 因為我們說的有序和無序針對的是集合存儲地址來說的。
在一百次循環中,獲取什么值,就往List所獲取的地址中存儲,從低位到到位,比如:第一個是99,99就存儲在第一位,第二位是2,就存儲在第二位...以此類推
而對於Set集合來說,由於我們是通過HashSet的初始化它的,所以的存儲方式與HashSet存儲方式有關,都是根據Hash碼來存儲的。例如:獲取的值是88,
那它就把這個值存儲在Hash碼為88的地址,如果是9,就把這個值存儲在Hash碼為9的地址,而遍歷的時候,Set是根據Hash碼的大小來遍歷的,所以呈現出來的就是有序的效果。
但是在底層存儲的時候它是亂序的。

 


免責聲明!

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



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