1. 程式人生 > >判斷集合元素唯一的原理-ArrayList的contains和HashSet的contains、add。Map介面、 集合巢狀

判斷集合元素唯一的原理-ArrayList的contains和HashSet的contains、add。Map介面、 集合巢狀

1、判斷集合元素唯一的原理

(1)ArrayList的contains方法判斷元素是否重複原理

 Contains():boolean型別,當此列表中含有元素的時候,返回true

ArrayList的contains方法會使用呼叫方法時,傳入的元素的equals方法依次與集合中的舊元素所比較,從而根據返回的布林值判斷是否有重複元素。此時,當ArrayList存放自定義型別時,由於自定義型別在未重寫equals方法前,判斷是否重複的依據是地址值,所以如果想根據內容判斷是否為重複元素,需要重寫元素的equals方法。

 (2)HashSet的contains、add判斷元素重複的原理

 add():新增指定元素

contains():當set中含有元素的時候,返回true

Set集合不能存放重複元素,其新增方法在新增時會判斷是否有重複元素,有重複不新增,沒重複則新增。

HashSet集合由於是無序的,其判斷唯一的依據是元素型別的hashCode與equals方法的返回結果。規則如下:

先判斷新元素與集合內已經有的舊元素的HashCode值

 如果不同,說明是不同元素,新增到集合。

 如果相同,再判斷equals比較結果。返回true則相同元素;返回false則不同元素,新增到集合。

所以,使用HashSet儲存自定義型別,如果沒有重寫該類的hashCode與equals方法,則判斷重複時,使用的是地址值,如果想通過內容比較元素是否相同,需要重寫該元素類的hashcode與equals方法。

 2、Map介面

 (1)Map介面介紹:

Map介面下的集合與Collection介面下的集合,它們儲存資料的形式不同,如下圖。

 Collection中的集合,元素是孤立存在的(理解為單身),向集合中儲存元素採用一個個元素的方式儲存。

 Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。

 Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。

 需要注意的是,Map中的集合不能包含重複的鍵,值可以重複;每個鍵只能對應一個值。

 Map中常用的集合為HashMap集合、LinkedHashMap集合。

 

 (2)Map介面中的常用集合

Map有多個子類,我們主要介紹HashMap集合、LinkedHashMap集合。

 HashMap<K,V>:儲存資料採用的雜湊表結構(陣列和連結串列的結合結構),元素的存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。

 LinkedHashMap<K,V>HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表結構+連結串列結構。通過連結串列結構可以保證元素的存取順序一致;通過雜湊表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。

 (3)Map介面中的常用方法

 get方法:獲取指定鍵(key)所對應的值(value)

 put方法:將指定的鍵與值對應起來,並新增到集合中

 方法返回值為鍵所對應的值

使用put方法時,若指定的鍵(key)在集合中沒有,則沒有這個鍵對應的值,返回null,並把指定的鍵值新增到集合中;

使用put方法時,若指定的鍵(key)在集合中存在,則返回值為集合中鍵對應的值(該值為替換前的值),並把指定鍵所對應的值,替換成指定的新值。

remove方法:根據指定的鍵(key)刪除元素,返回被刪除元素的值(value)。

(4)Map介面遍歷

鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值

keySet()方法

步驟:

1、獲取Map集合的鍵,因為鍵是唯一的,所以返回一個Set集合儲存所有的鍵

Map<String,String> map=new HashMap<String,String>();

2、返回一個Set集合儲存所有的鍵Set<String> set=map.keySet();

3、

遍歷鍵的Set集合,得到每一個鍵

4.根據鍵,獲取鍵所對應的值

流程圖:

entrySet();方法

Map類設計時,提供了一個巢狀介面:Entry,Entry將鍵值對的對應關係封裝成了物件。即鍵值對物件,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)物件中獲取對應的鍵與對應的值。

Entry是Map介面中提供的一個靜態內部巢狀介面。

 

entrySet()方法:用於返回Map集合中所有的鍵值對(Entry)物件,以Set集合形式返回。

 getKey()方法:獲取Entry物件中的鍵

 getValue()方法:獲取Entry物件中的值

entrySet()方法:用於返回Map集合中所有的鍵值對(Entry)物件,以Set集合形式返回。

map方法、遍歷練習:兩種方法:keySet和entrySet

package demo02;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Demo02 {

    public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
        //Map的常用方法
        map.put("1", "a");
        map.put("2", "b");
        map.put("2", "z");
        map.put("3", "c");
        //移除
        map.remove("3");
        //取資料
        System.out.println(map.get("1"));
        System.out.println(map.get("2"));
        System.out.println(map.get("3"));
        //遍歷keySet()
        //第一步=獲取map中的key鎖物件應的Sst集合
        Set<String> set=map.keySet();
        //第二部遍歷set找到每一個key值
        for(String s:set){
            String key=s;
            String value=map.get(key);
            System.out.println(key+" "+value);
        }
        //2、entryset()遍歷
        Set<Map.Entry<String, String>>s1=map.entrySet();
        for(Map.Entry<String, String> e:s1){
            String key=e.getKey();
            String value=e.getValue();
            System.out.println(key+" "+value);
        }
        //簡寫
        for(Map.Entry<String, String> e:map.entrySet()){
            System.out.println(e);
        }

    }

}

 可變引數

格式:

修飾符 返回值型別 方法名(引數型別... 形參名){  }

 等價於:

修飾符 返回值型別 方法名(引數型別[] 形參名){  }

package demo02;

public class Demo06 {

    public static void main(String[] args) {
        System.out.println(add(1,2,3,45));
        System.out.println(add(3,5,7,9));

    }
    //想要做一個求和的方法,單引數個數不一定,型別一定,int
    public static int add(int...a){
        int sum=0;
        for(int i:a){
            sum=sum+i;//相等於sum+=i;
        }
        return sum;
    }

}

 集合巢狀

 ArrayList巢狀 ArrayList

    ArrayList< ArrayList<String> >
    Collection< ArrayList<Integer> >

 Map巢狀 ArrayList

HashMap<String, ArrayList<Person>>

ArrayList< HashMap<String, String>>

l Map集合巢狀的遍歷

HashMap<String, HashMap<String,String>>

HashMap<String, HashMap<Person,String>>
package demo05;

import java.util.HashMap;
import java.util.Set;

public class Demo02 {

    public static void main(String[] args) {
        method();
    }
    public static void method(){
        HashMap<String, HashMap<String,String>> map=new 
                HashMap<String, HashMap<String,String>>();
        HashMap<String,String> m1=new HashMap<String,String>();
        m1.put("1", "王二");
        m1.put("2", "張三");
        HashMap<String,String> m2=new HashMap<String,String>();
        m2.put("3", "李四");
        m2.put("4", "王五");
        map.put("一中", m1);
        map.put("二中", m2);
        Set<String>school=map.keySet();
        for(String s:school){
            String sch=s;
            HashMap<String,String>classes=map.get(sch);
            Set<String>class1=classes.keySet();
            for(String ss:class1){
                String classname=ss;
                String stuname =classes.get(classname);
                System.out.println("學校為"+sch+",班級為"+
                        classname+",姓名為"+stuname);
            }
        }
    }
}
package demo05;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Demo01 {

    public static void main(String[] args) {
        method();
    }//HashMap<String, HashMap<String,String>>
    public static void method(){
        HashMap<String, HashMap<String,String>> map=new 
                HashMap<String, HashMap<String,String>>();
        HashMap<String,String> m1=new HashMap<String,String>();
        m1.put("1", "王二");
        m1.put("2", "張三");
        HashMap<String,String> m2=new HashMap<String,String>();
        m2.put("3", "李四");
        m2.put("4", "王五");
        map.put("一中", m1);
        map.put("二中", m2);
        Set<String> school=map.keySet();
        for(String s:school){
            String sch=s;
            HashMap<String,String> classes=map.get(sch);
            Set<String>class1=classes.keySet();
            for(String ss:class1){
                String classname=ss;
                String stuname=classes.get(classname);
                System.out.println("學校為"+sch+",班級為"+
                        classname+",姓名為"+stuname);
            }
        }
        
    }

}