11、Map、可變參數、Collections
阿新 • • 發佈:2019-02-05
hashcode 同名 重寫 部分 rgs 允許 遍歷 速度 for循環
Map接口
Map集合概述
*A:Map集合概述: 我們通過查看Map接口描述,發現Map接口下的集合與Collection接口下的集合,它們存儲數據的形式不同 a:Collection中的集合,元素是孤立存在的(理解為單身),向集合中存儲元素采用一個個元素的方式存儲。 b:Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。 Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。 需要註意的是,Map中的集合不能包含重復的鍵,值可以重復;每個鍵只能對應一個值。 Map |--HashMap |--LinkedHashMap
Map接口中的常用方法 ?
*A:Map接口中的常用方法 /* * Map接口中的常用方法 * 使用Map接口的實現類 HashMap */ public class MapDemo { public static void main(String[] args) { function_2(); } /* * 移除集合中的鍵值對,返回被移除之前的值 * V remove(K) */ public static void function_2() { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); System.out.println(map); String value = map.remove(33); System.out.println(value); System.out.println(map); } /* * 通過鍵對象,獲取值對象 * V get(K) * 如果集合中沒有這個鍵,返回null */ public static void function_1() { //創建集合對象,作為鍵的對象整數,值的對象存儲字符串 Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); System.out.println(map); String value = map.get(4); System.out.println(value); } /* * 將鍵值對存儲到集合中 * V put(K,V) K 作為鍵的對象, V作為值的對象 * 存儲的是重復的鍵,將原有的值,覆蓋 * 返回值一般情況下返回null, * 存儲重復鍵的時候,返回被覆蓋之前的值 */ public static void function() { //創建集合對象,HashMap,存儲對象,鍵是字符串,值是整數 Map<String, Integer> map = new HashMap<String, Integer>(); map.put("a", 1); map.put("b", 2); map.put("c", 3); System.out.println(map); } }
Map集合遍歷方式keySet方法
*A:Map集合遍歷方式keySet方法 1.獲取Map集合中所有的鍵,由於鍵是唯一的,所以返回一個Set集合存儲所有的鍵 2.遍歷鍵的Set集合,得到每一個鍵 3.根據鍵利用get(key)去Map找所對應的值 /* * Map集合的遍歷 * 利用鍵獲取值 * Map接口中定義方法keySet * 所有的鍵,存儲到Set集合 */ public class MapDemo1 { public static void main(String[] args) { /* * 1. 調用map集合的方法keySet,所有的鍵存儲到Set集合中 * 2. 遍歷Set集合,獲取出Set集合中的所有元素 (Map中的鍵) * 3. 調用map集合方法get,通過鍵獲取到值 */ Map<String, Integer> map = new HashMap<String, Integer>(); map.put("a", 11); map.put("b", 12); map.put("c", 13); map.put("d", 14); //1. 調用map集合的方法keySet,所有的鍵存儲到Set集合中 Set<String> set = map.keySet(); //2. 遍歷Set集合,獲取出Set集合中的所有元素 (Map中的鍵) Iterator<String> it = set.iterator(); while (it.hasNext()) { //it.next返回是Set集合元素,也就是Map中的鍵 //3. 調用map集合方法get,通過鍵獲取到值 String key = it.next(); Integer value = map.get(key); System.out.println(key + "...." + value); } System.out.println("======================="); for (String key : map.keySet()) { Integer value = map.get(key); System.out.println(key + "...." + value); } } }
Map集合Entry對象
*A:Map集合Entry對象
interface Map {
interface Entry {//Entry是Map的一個內部接口
//由Map的子類的內部類實現
}
}
class HashMap {
static class Entry<K, V> implements Map.Entry<K, V> {//Entry對象指的就是該類的對象
final K key;
V value;
}
}
/*
在Map類設計時,提供了一個嵌套接口:Entry。
Entry將鍵值對的對應關系封裝成了對象。
即鍵值對對象,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)對象中獲取對應的鍵與對應的值。
a:Entry是Map接口中提供的一個靜態內部嵌套接口。
b:相關方法
getKey()方法:獲取Entry對象中的鍵
getValue()方法:獲取Entry對象中的值
entrySet()方法:用於返回Map集合中所有的鍵值對(Entry)對象,以Set集合形式返回。
*/
Map集合遍歷方式entrySet方法
*A:Map集合遍歷方式entrySet方法
/*
*Map集合獲取方式
*entrySet方法,鍵值對映射關系(結婚證)獲取
*實現步驟:
*1.調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
*Set<Entry<K, V> >
*2.叠代Set集合
*3.獲取出的Set集合的元素,是映射關系對象
*4.通過映射關系對象方法 getKet,getValue獲取鍵值對
*
*創建內部類對象 外部類.內部類=new
*/
public class MapDemo2 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "abc");
map.put(2, "bcd");
map.put(3, "cde");
//1. 調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
Set<Map.Entry<Integer, String>> set = map.entrySet();
//2. 叠代Set集合
Iterator<Map.Entry<Integer, String>> it = set.iterator();
while (it.hasNext()) {
// 3. 獲取出的Set集合的元素,是映射關系對象
// it.next 獲取的是什麽對象,也是Map.Entry對象
Map.Entry<Integer, String> entry = it.next();
//4. 通過映射關系對象方法 getKet, getValue獲取鍵值對
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "...." + value);
}
}
}
Map集合遍歷方式增強for循環
*A:Map集合遍歷方式增強for循環
*A:Map集合遍歷方式entrySet方法
/*
*Map集合獲取方式
*entrySet方法,鍵值對映射關系(結婚證)獲取
*實現步驟:
*1.調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
*Set<Entry<K, V> >
*2.叠代Set集合
*3.獲取出的Set集合的元素,是映射關系對象
*4.通過映射關系對象方法 getKet,getValue獲取鍵值對
*
*創建內部類對象 外部類.內部類=new
*/
public class MapDemo2 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "abc");
map.put(2, "bcd");
map.put(3, "cde");
//1. 調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
Set<Map.Entry<Integer, String>> set = map.entrySet();
//2. 叠代Set集合
Iterator<Map.Entry<Integer, String>> it = set.iterator();
while (it.hasNext()) {
// 3. 獲取出的Set集合的元素,是映射關系對象
// it.next 獲取的是什麽對象,也是Map.Entry對象
Map.Entry<Integer, String> entry = it.next();
//4. 通過映射關系對象方法 getKet, getValue獲取鍵值對
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "...." + value);
}
System.out.println("=========================");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "..." + entry.getValue());
}
}
}
註意:Map集合不能直接使用叠代器或者foreach進行遍歷。但是轉成Set之後就可以使用了。
HashMap集合存儲和遍歷
*A:HashMap集合存儲和遍歷
/*
* 使用HashMap集合,存儲自定義的對象
* 自定義對象,作為鍵,出現,作為值出現
*/
public class HashMapDemo {
public static void main(String[] args) {
function_1();
}
/*
* HashMap 存儲自定義對象Person,作為鍵出現
* 鍵的對象,是Person類型,值是字符串
* 保證鍵的唯一性,存儲到鍵的對象,重寫hashCode equals
*/
public static void function_1() {
HashMap<Person, String> map = new HashMap<Person, String>();
map.put(new Person("a", 20), "裏約熱內盧");
map.put(new Person("b", 18), "索馬裏");
map.put(new Person("b", 18), "索馬裏");
map.put(new Person("c", 19), "百慕大");
for (Person key : map.keySet()) {
String value = map.get(key);
System.out.println(key + "..." + value);
}
System.out.println("===================");
for (Map.Entry<Person, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "..." + entry.getValue());
}
}
/*
* HashMap 存儲自定義的對象Person,作為值出現
* 鍵的對象,是字符串,可以保證唯一性
*/
public static void function() {
HashMap<String, Person> map = new HashMap<String, Person>();
map.put("beijing", new Person("a", 20));
map.put("tianjin", new Person("b", 18));
map.put("shanghai", new Person("c", 19));
for (String key : map.keySet()) {
Person value = map.get(key);
System.out.println(key + "..." + value);
}
System.out.println("=================");
for (Map.Entry<String, Person> entry : map.entrySet()) {
String key = entry.getKey();
Person value = entry.getValue();
System.out.println(key + "..." + value);
}
}
}
LinkedHashMap的特點
*A:LinkedHashMap的特點
/*
* LinkedHashMap繼承HashMap
* 保證叠代的順序
*/
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();
link.put("1", "a");
link.put("13", "a");
link.put("15", "a");
link.put("17", "a");
System.out.println(link);
}
}
Hashtable的特點
*A:Hashtable的特點
/*
* Map接口實現類 Hashtable
* 底層數據結果哈希表,特點和HashMap是一樣的
* Hashtable 線程安全集合,運行速度慢
* HashMap 線程不安全的集合,運行速度快
*
* Hashtable命運和Vector是一樣的,從JDK1.2開始,被更先進的HashMap取代
*
* HashMap 允許存儲null值,null鍵
* Hashtable 不允許存儲null值,null鍵
*
* Hashtable他的孩子,子類 Properties 依然活躍在開發舞臺
*/
public class HashtableDemo {
public static void main(String[] args) {
Map<String, String> map = new Hashtable<String, String>();
map.put(null, null);
System.out.println(map);
}
}
靜態導入
*A:靜態導入:
如果本類中有和靜態導入的同名方法會優先使用本類的
如果還想使用靜態導入的,依然需要類名來調用
/*
* JDK1.5新特性,靜態導入
* 減少開發的代碼量
* 標準的寫法,導入包的時候才能使用
*
* import static java.lang.System.out;最末尾,必須是一個靜態成員
*/
public class StaticImportDemo {
public static void main(String[] args) {
out.println("hello");
int[] arr = {1, 4, 2};
sort(arr);
}
}
方法的可變參數
*A:方法的可變參數
/*
* JDK1.5新的特性,方法的可變參數
* 前提: 方法參數數據類型確定,參數的個數任意
* 可變參數語法: 數據類型...變量名
* 可變參數,本質就是一個數組
*/
public class VarArgumentsDemo {
public static void main(String[] args) {
//調用一個帶有可變參數的方法,傳遞參數,可以任意
// getSum();
int sum = getSum(5, 34, 3, 56, 7, 8, 0);
System.out.println(sum);
}
/*
* 定義方法,計算10個整數和
* 方法的可變參數實現
*/
public static int getSum(int... a) {
int sum = 0;
for (int i : a) {
sum = sum + i;
}
return sum;
}
/*
* 定義方法,計算3個整數和
*/
/*public static int getSum(int a,int b ,int c){
return a+b+c;
}*/
/*
* 定義方法,計算2個整數和
*/
/*public static int getSum(int a,int b){
return a+b;
}*/
}
可變參數的註意事項
*A:可變參數的註意事項
/*
* 可變參數的註意事項
* 1. 一個方法中,可變參數只能有一個
* 2. 可變參數,必須寫在參數列表的最後一位
*/
public static void function(Object...o){}
Collections工具類?
*A:Collections工具類
/*
* 集合操作的工具類
* Collections
*/
public class CollectionsDemo {
public static void main(String[] args) {
function_2();
}
/*
* Collections.shuffle方法
* 對List集合中的元素,進行隨機排列
*/
public static void function_2() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(5);
list.add(9);
list.add(11);
list.add(8);
list.add(10);
list.add(15);
list.add(20);
System.out.println(list);
//調用工具類方法shuffle對集合隨機排列
Collections.shuffle(list);
System.out.println(list);
}
/*
* Collections.binarySearch靜態方法
* 對List集合進行二分搜索,方法參數,傳遞List集合,傳遞被查找的元素
*/
public static void function_1() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(5);
list.add(8);
list.add(10);
list.add(15);
list.add(20);
//調用工具類靜態方法binarySearch
int index = Collections.binarySearch(list, 16);
System.out.println(index);
}
/*
* Collections.sort靜態方法
* 對於List集合,進行升序排列
*/
public static void function() {
//創建List集合
List<String> list = new ArrayList<String>();
list.add("ewrew");
list.add("qwesd");
list.add("Qwesd");
list.add("bv");
list.add("wer");
System.out.println(list);
//調用集合工具類的方法sort
Collections.sort(list);
System.out.println(list);
}
}
集合的嵌套
*A:集合的嵌套
/*
* Map集合的嵌套,Map中存儲的還是Map集合
* 要求:
* 傳智播客
* Java基礎班
* 001 張三
* 002 李四
*
* Java就業班
* 001 王五
* 002 趙六
* 對以上數據進行對象的存儲
* 001 張三 鍵值對
* Java基礎班: 存儲學號和姓名的鍵值對
* Java就業班:
* 傳智播客: 存儲的是班級
*
* 基礎班Map <學號,姓名>
* 傳智播客Map <班級名字, 基礎班Map>
*/
public class MapMapDemo {
public static void main(String[] args) {
//定義基礎班集合
HashMap<String, String> javase = new HashMap<String, String>();
//定義就業班集合
HashMap<String, String> javaee = new HashMap<String, String>();
//向班級集合中,存儲學生信息
javase.put("001", "張三");
javase.put("002", "李四");
javaee.put("001", "王五");
javaee.put("002", "趙六");
//定義傳智播客集合容器,鍵是班級名字,值是兩個班級容器
HashMap<String, HashMap<String, String>> czbk =
new HashMap<String, HashMap<String, String>>();
czbk.put("基礎班", javase);
czbk.put("就業班", javaee);
keySet(czbk);
}
}
集合的嵌套keySet遍歷?
*A:集合的嵌套keySet遍歷
/*
* Map集合的嵌套,Map中存儲的還是Map集合
* 要求:
* 傳智播客
* Java基礎班
* 001 張三
* 002 李四
*
* Java就業班
* 001 王五
* 002 趙六
* 對以上數據進行對象的存儲
* 001 張三 鍵值對
* Java基礎班: 存儲學號和姓名的鍵值對
* Java就業班:
* 傳智播客: 存儲的是班級
*
* 基礎班Map <學號,姓名>
* 傳智播客Map <班級名字, 基礎班Map>
*/
public class MapMapDemo {
public static void main(String[] args) {
//定義基礎班集合
HashMap<String, String> javase = new HashMap<String, String>();
//定義就業班集合
HashMap<String, String> javaee = new HashMap<String, String>();
//向班級集合中,存儲學生信息
javase.put("001", "張三");
javase.put("002", "李四");
javaee.put("001", "王五");
javaee.put("002", "趙六");
//定義傳智播客集合容器,鍵是班級名字,值是兩個班級容器
HashMap<String, HashMap<String, String>> czbk =
new HashMap<String, HashMap<String, String>>();
czbk.put("基礎班", javase);
czbk.put("就業班", javaee);
keySet(czbk);
}
public static void keySet(HashMap<String, HashMap<String, String>> czbk) {
//調用czbk集合方法keySet將鍵存儲到Set集合
Set<String> classNameSet = czbk.keySet();
//叠代Set集合
Iterator<String> classNameIt = classNameSet.iterator();
while (classNameIt.hasNext()) {
//classNameIt.next獲取出來的是Set集合元素,czbk集合的鍵
String classNameKey = classNameIt.next();
//czbk集合的方法get獲取值,值是一個HashMap集合
HashMap<String, String> classMap = czbk.get(classNameKey);
//調用classMap集合方法keySet,鍵存儲到Set集合
Set<String> studentNum = classMap.keySet();
Iterator<String> studentIt = studentNum.iterator();
while (studentIt.hasNext()) {
//studentIt.next獲取出來的是classMap的鍵,學號
String numKey = studentIt.next();
//調用classMap集合中的get方法獲取值
String nameValue = classMap.get(numKey);
System.out.println(classNameKey + ".." + numKey + ".." + nameValue);
}
}
System.out.println("==================================");
for (String className : czbk.keySet()) {
HashMap<String, String> hashMap = czbk.get(className);
for (String numKey : hashMap.keySet()) {
String nameValue = hashMap.get(numKey);
System.out.println(className + ".." + numKey + ".." + nameValue);
}
}
}
}
集合的嵌套entrySet遍歷
*A:集合的嵌套entrySet遍歷
/*
* Map集合的嵌套,Map中存儲的還是Map集合
* 要求:
* 傳智播客
* Java基礎班
* 001 張三
* 002 李四
*
* Java就業班
* 001 王五
* 002 趙六
* 對以上數據進行對象的存儲
* 001 張三 鍵值對
* Java基礎班: 存儲學號和姓名的鍵值對
* Java就業班:
* 傳智播客: 存儲的是班級
*
* 基礎班Map <學號,姓名>
* 傳智播客Map <班級名字, 基礎班Map>
*/
public class MapMapDemo {
public static void main(String[] args) {
//定義基礎班集合
HashMap<String, String> javase = new HashMap<String, String>();
//定義就業班集合
HashMap<String, String> javaee = new HashMap<String, String>();
//向班級集合中,存儲學生信息
javase.put("001", "張三");
javase.put("002", "李四");
javaee.put("001", "王五");
javaee.put("002", "趙六");
//定義傳智播客集合容器,鍵是班級名字,值是兩個班級容器
HashMap<String, HashMap<String, String>> czbk =
new HashMap<String, HashMap<String, String>>();
czbk.put("基礎班", javase);
czbk.put("就業班", javaee);
entrySet(czbk);
}
public static void entrySet(HashMap<String, HashMap<String, String>> czbk) {
//調用czbk集合方法entrySet方法,將czbk集合的鍵值對關系對象,存儲到Set集合
Set<Map.Entry<String, HashMap<String, String>>>
classNameSet = czbk.entrySet();
//叠代器叠代Set集合
Iterator<Map.Entry<String, HashMap<String, String>>> classNameIt = classNameSet.iterator();
while (classNameIt.hasNext()) {
//classNameIt.next方法,取出的是czbk集合的鍵值對關系對象
Map.Entry<String, HashMap<String, String>> classNameEntry = classNameIt.next();
//classNameEntry方法 getKey,getValue
String classNameKey = classNameEntry.getKey();
//獲取值,值是一個Map集合
HashMap<String, String> classMap = classNameEntry.getValue();
//調用班級集合classMap方法entrySet,鍵值對關系對象存儲Set集合
Set<Map.Entry<String, String>> studentSet = classMap.entrySet();
//叠代Set集合
Iterator<Map.Entry<String, String>> studentIt = studentSet.iterator();
while (studentIt.hasNext()) {
//studentIt方法next獲取出的是班級集合的鍵值對關系對象
Map.Entry<String, String> studentEntry = studentIt.next();
//studentEntry方法 getKey getValue
String numKey = studentEntry.getKey();
String nameValue = studentEntry.getValue();
System.out.println(classNameKey + ".." + numKey + ".." + nameValue);
}
}
System.out.println("==================================");
for (Map.Entry<String, HashMap<String, String>> me : czbk.entrySet()) {
String classNameKey = me.getKey();
HashMap<String, String> numNameMapValue = me.getValue();
for (Map.Entry<String, String> nameMapEntry : numNameMapValue.entrySet()) {
String numKey = nameMapEntry.getKey();
String nameValue = nameMapEntry.getValue();
System.out.println(classNameKey + ".." + numKey + ".." + nameValue);
}
}
}
}
?
總結
Map集合
:
? map集合中的元素都是成對出現,成對存儲的
? map集合中的元素都是以一對鍵和值的形式組成存在的,稱為鍵值對,理解為夫妻對
? map集合中的鍵不能重復存儲,值可以重復
? map集合中的每一個鍵 對應著一個值
? 方法:
? put(K key, V value) 把指定的鍵與指定的值添加到Map集合中
? remove(Object key) 把指定的鍵 所對應的鍵值對元素 在Map集合中刪除,返回被刪除元素的值
? Set<Map.Entry<K,V>> entrySet() 獲取到Map集合中所有的鍵值對對象的集合(Set集合)
? get(Object key) 根據指定的鍵,在Map集合中獲取對應的值
? Set
Map集合遍歷的兩種方式
:
//方式1:根據鍵找值的方式
//a, 獲取到Map集合中所有的鍵,返回對應的Set集合
//b, 遍歷鍵的集合,獲取到每一個鍵
//c, 通過鍵,找到對應的值
//獲取到Map集合中所有的鍵,返回對應的Set集合
Set<String> keys=map.keySet();
//遍歷鍵的集合,獲取到每一個鍵
for(String key:keys){
//通過鍵,找到對應的值
Student s=map.get(key);
System.out.println(key+"..."+s.getName()+"..."+s.getAge());
}
//方式2:根據鍵值對對象找鍵和值的方式
//a, 獲取Map集合中所有的鍵值對元素,返回對應的Set集合
//b, 遍歷鍵值對元素集合,獲取到每一個鍵值對元素對象
//c, 通過鍵值對元素對象,獲取對應的鍵,和對應的值
//獲取Map集合中所有的鍵值對元素,返回對應的Set集合
Set<Map.Entry<String, Student>>entrySet=map.entrySet();
//遍歷鍵值對元素集合,獲取到每一個鍵值對元素對象
for(Map.Entry<String, Student> entry:entrySet){
//通過鍵值對元素對象,獲取對應的鍵,和對應的值
//找鍵
String key=entry.getKey();
//找值
Student s=entry.getValue();
//打印
System.out.println(key+"..."+s.getName()+"..."+s.getAge());
}
HashMap
:
? 特點:
? 是Map集合的子集合
? 底層采用哈希表結構
? HashMap集合中的key不能重復,通過重寫hashCode() 與 equals()方法來保證鍵的唯一。
? 不能保證元素存與取的順序完全一致
LinkedHashMap
:
? 特點:
? 是HashMap集合的子集合
? 底層采用哈希表+鏈表結構
? LinkedHashMap集合中的key不能重復,通過重寫hashCode() 與 equals()方法來保證鍵的唯一。
Collections中的方法
:
? public static
? public static void shuffle(List<?> list) 集合中的元素存儲位置隨機打亂
11、Map、可變參數、Collections