Java中List、Set、Map區別

三者異同java

List,Set都是繼承自Collection接口;安全


List特色:元素有放入順序,元素可重複; ide

Set特色:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,可是元素在set中的位置是有該元素的HashCode決定的,其位置實際上是固定的); this

Map特色:元素按鍵值對存儲,無放入順序 (應該知道什麼是鍵值對吧!) ;線程


List接口有三個實現類:LinkedList,ArrayList,Vector; code

LinkedList:底層基於鏈表實現,鏈表內存是散亂的,每個元素存儲自己內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢; 對象

ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低; 繼承

Set接口有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet; 接口

SortedSet接口有一個實現類:TreeSet(底層由平衡二叉樹實現) 內存

Query接口有一個實現類:LinkList 

Map接口有三個實現類:HashMap,HashTable,LinkeHashMap 

HashMap非線程安全,高效,支持null;HashTable線程安全,低效,不支持null 

SortedMap有一個實現類:TreeMap 

其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,存儲的是鍵值對 

set 通常無序不重複.map kv 結構 list 有序


Map至關於和Collection一個級別的;Map

去重的問題

package yn;


import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;


/**

 * 類描述:set集合針對String類型和8大基礎數據類型過濾掉重複數據,若是存放的是其餘類型對象,

 * 則須要重寫hashCode方法和equals方法,當equals比較相等時,

 * 則會去比較hashCode值 hashCode的值 若是一致的話,則不會存進set

 * @author yxx

 */

public class ListSetMap {  


    public static void main(String[] args) {  

        Set<String> nameSet = new HashSet<String>();  

        nameSet.add("張三");  

        nameSet.add("李四");  

        nameSet.add("王五");  

        nameSet.add("張三");  


        // 輸出結果 張三  李四  王五  

        for(String name : nameSet){  

            System.out.print(name + "\t");  

        }  

        System.out.println();


        // List集合去除重複基礎數據  

        List<String> nameList = new ArrayList<String>();  

        nameList.add("張三");  

        nameList.add("李四");  

        nameList.add("王五");  

        nameList.add("趙六");  

        nameSet.addAll(nameList);  


        // 輸出結果 張三  李四  王五  趙六  

        for(String name : nameSet){  

            System.out.print(name + "\n");  

        }  


        // 去除編號和用戶名同樣的 對象,須要重寫 equals 方法 和 hashCode方法  

        User admin = new User(1, "admin");  

        User user = new User(2, "user");  

        User user1 = new User(2, "user");  

        User admin1 = new User(3, "admin");  



        Set<User> userSet = new HashSet<User>();  

        userSet.add(admin);  

        userSet.add(user);  

        userSet.add(admin1);  

        userSet.add(user1);  

        // 輸入結果 admin1  admin3  user2  

        for(User u : userSet){  

            System.out.print(u.username + u.id + "\t");  

        }  


        System.out.println(user.equals(null));  

    }  

}  


class User{  


    protected Integer id;  


    protected String username;  


    public User(Integer id, String username){  

        this.id = id;  

        this.username = username;  

    }  



    /** 

     * 若是對象類型是User 的話 則返回true 去比較hashCode值 

     */  

    @Override  

    public boolean equals(Object obj) {  

        if(obj == null) return false;  

        if(this == obj) return true;  

        if(obj instanceof User){   

            User user =(User)obj;  

//          if(user.id = this.id) return true; // 只比較id  

            // 比較id和username 一致時才返回true 以後再去比較 hashCode  

            if(user.id == this.id && user.username.equals(this.username)) return true;  

            }  

        return false;  

    }  




    /** 

     * 重寫hashcode 方法,返回的hashCode 不同才認定爲不一樣的對象 

     */  

    @Override  

    public int hashCode() {  

//      return id.hashCode(); // 只比較id,id同樣就不添加進集合  

        return id.hashCode() * username.hashCode();  

    }  



}  


運行截圖

c4af31136efa15a3.png


這樣一來基本就明白了重寫equal是幹什麼的,也知道了set集合針對String類型和8大基礎數據類型過濾掉重複數據,若是存放的是其餘類型對象,則須要重寫hashCode方法和equals方法,當equals比較相等時,則會去比較hashCode值 hashCode的值 若是一致的話,則不會存進set

相關文章
相關標籤/搜索