Java中List、Set、Map區別

三者異同

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


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

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

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


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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章