判斷集合元素唯一的原理-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);
            }
        }
        
    }

}

 


免責聲明!

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



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