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