1.介紹
java.util 接口 Map<K,V>
類型參數(shù): K - 此映射所維護(hù)的鍵的類型 ;V - 映射值的類型停巷。
也叫哈希表耍攘、散列表。常用于存 鍵值對 結(jié)構(gòu)的數(shù)據(jù)畔勤。其中的鍵不能重復(fù)蕾各,值可以重復(fù)。
2.特點
1庆揪、 可以根據(jù)鍵式曲,提取對應(yīng)的值
2、 鍵不允許重復(fù)缸榛,如果重復(fù)值會被覆蓋
3吝羞、 存放的都是無序數(shù)據(jù)
4、 初始容量是16内颗,默認(rèn)的加載因子是0.75
3.常用方法測試
package cn.tedu.collection;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
//這個類用來測試Map接口
public class Test8_Map {
public static void main(String[] args) {
//1钧排,創(chuàng)建Map對象
//map中的數(shù)據(jù)要符合映射規(guī)則,需要同時指定K和V的數(shù)據(jù)類型起暮。到底指定成什么類型卖氨,要看你想添加什么數(shù)據(jù)会烙。
Map<Integer,String> map = new HashMap();
//2,常用方法
//添加數(shù)據(jù)筒捺,需要同時指定key和value
map.put(9527, "唐伯虎");
map.put(9529, "秋香姐");
map.put(9528, "如花");
map.put(9528, "石榴姐");
//特點1:map是一個無序集合 格式:{9527=唐伯虎}
//特點2:map中柏腻,key不可以重復(fù),如果重復(fù)系吭,value會被覆蓋
//{9527=唐伯虎, 9528=石榴姐, 9529=秋香姐}
System.out.println(map);
// map.clear();//清空集合
System.out.println( map.containsKey(9527));//判斷是否包含指定的key
System.out.println( map.containsValue("秋香姐"));//判斷是否包含指定的value
System.out.println( map.equals("如花"));//判斷是否和指定的元素相等
System.out.println( map.get(9528));//根據(jù)key獲取value
System.out.println( map.hashCode());//獲取map集合的哈希碼值
System.out.println( map.isEmpty());//判斷集合是否為空
System.out.println( map.remove(9529));//根據(jù)可以刪除對應(yīng)的value
System.out.println( map.size());//獲取集合的長度
Collection<String> vs = map.values();//把map中的所有value收集起來放到Collection里
System.out.println(vs);
//遍歷map中的數(shù)據(jù)五嫂,需要把map集合轉(zhuǎn)成set集合
// Set<K> keySet() :把map中的所有key存入set集合
Set<Integer> keys = map.keySet();
//遍歷set集合,得到每個key
Iterator<Integer> it = keys.iterator();
while(it.hasNext()) {
Integer key = it.next();//獲取得到的key
String value = map.get(key);//拿著key去map中value
System.out.println(key + ":" + value);
}
// Set<Map.Entry<K,V>> entrySet() :把map集合中的一組key+value數(shù)據(jù)整體放入set中
Set<Entry<Integer,String>> set = map.entrySet();
//遍歷set肯尺,得到每個Entry對象
Iterator<Entry<Integer, String>> it2 = set.iterator();
while(it2.hasNext()) {
Entry<Integer, String> entry = it2.next();//得到每個Entry對象
Integer key = entry.getKey();//獲取Entry對象封裝著的key
String value = entry.getValue();//獲取Entry對象封裝著的value
System.out.println(key +"-"+value);
}
}
}
4.HashMap實現(xiàn)類
4.1介紹
HashMap的鍵要同時重寫hashCode()和equals()
hashCode()用來判斷確定hash值是否相同
equals()用來判斷屬性的值是否相同
-- equals()判斷數(shù)據(jù)如果相等沃缘,hashCode()必須相同
-- equals()判斷數(shù)據(jù)如果不等,hashCode()盡量不同
HashMap底層是一個Entry數(shù)組则吟,當(dāng)存放數(shù)據(jù)時會根據(jù)hash算法計算數(shù)據(jù)的存放位置槐臀。算法:hash(key)%n,n就是數(shù)組的長度氓仲。當(dāng)計算的位置沒有數(shù)據(jù)時水慨,就直接存放。當(dāng)計算的位置敬扛,有數(shù)據(jù)時晰洒,也就是發(fā)生hash沖突/hash碰撞時,采用鏈表的方式來解決的啥箭,在對應(yīng)的數(shù)組位置存放鏈表的頭結(jié)點谍珊。對鏈表而言,新加入的節(jié)點會從頭結(jié)點加入急侥。
4.2字符串中的字符統(tǒng)計
接收用戶輸入的一串字符串砌滞,統(tǒng)計出現(xiàn)的每個字符的個數(shù)
package cn.tedu.collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
//這個類用來測試Map集合:字符串中的字符統(tǒng)計
public class Test10_MapTest {
public static void main(String[] args) {
// 1、接收用戶輸入的一串字符串
String input = new Scanner(System.in).nextLine();
// 2坏怪、想辦法獲取到每個字符
//遍歷字符串布持,并根據(jù)下標(biāo)獲取對應(yīng)的字符
Map<Character,Integer> map = new HashMap();//創(chuàng)建map存數(shù)據(jù),格式:{a=1,b=2,c=1}
for(int i = 0 ; i < input.length() ; i++) {
// --map的key是啥陕悬?就是2、獲取到的字符
char key = input.charAt(i);//根據(jù)下標(biāo)獲取對應(yīng)的字符
// 3按傅、統(tǒng)計出現(xiàn)的每個字符的個數(shù)捉超,,存起來唯绍,存map里
Integer value = map.get(key);//拿著key去map里找value
if(value==null) {
map.put(key, 1);//如果是默認(rèn)值null就是沒存過拼岳,存1就行
}else {
map.put(key, value+1);//如果存過值,+1就行
}
}
System.out.println(map);
}
}