Map集合、 HashMap集合、LinkedHashMap集合、Hashtable集合
Map集合
Map集合的特點
Map集合是一個雙鏈表結(jié)構(gòu)的集合,一個元素包含兩個值(key,value)
Map集合中的元素,key和value的數(shù)據(jù)類型可以相同也可以不同
Map集合中的元素,key是不允許重復(fù)的,value是可以重復(fù)的
Map集合中的元素,key和value是一一對應(yīng)的
Map接口中的常用方法
V put(K key, V value)將指定的值與此映射中的指定鍵關(guān)聯(lián)(可選操作)。V remove(Object key)如果存在一個鍵的映射關(guān)系,則將其從此映射中移除(可選操作)。V get(Object key)返回指定鍵所映射的值;如果此映射不包含該鍵的映射關(guān)系,則返回 null。boolean containsKey(Object key)如果此映射包含指定鍵的映射關(guān)系,則返回 true。 /*** LinkedHashMap集合是一個有序的集合,存儲和取出的元素的順序不一致*/ private static void demo05() {//創(chuàng)建Map集合對象,多態(tài)HashMap<String, String> map = new HashMap<>();map.put("張銘恩", "胡冰卿");map.put("馬國明", "湯洛雯");map.put("李嘉銘", "劉泳希");map.put("金瀚", "張芷溪");System.out.println(map);LinkedHashMap<String, String> map1 = new LinkedHashMap<>();map1.put("張銘恩", "胡冰卿");map1.put("馬國明", "湯洛雯");map1.put("李嘉銘", "劉泳希");map1.put("金瀚", "張芷溪");System.out.println(map1); }/*** boolean containsKey(Object key)* 如果此映射包含指定鍵的映射關(guān)系,則返回 true。*/ private static void demo04() {//創(chuàng)建Map集合對象,多態(tài)HashMap<String, String> map = new HashMap<>();map.put("張銘恩", "胡冰卿");map.put("馬國明", "湯洛雯");map.put("李嘉銘", "劉泳希");map.put("金瀚", "張芷溪");boolean b = map.containsKey("wang");System.out.println(b); }/*** V get(Object key)* 返回指定鍵所映射的值;如果此映射不包含該鍵的映射關(guān)系,則返回 null。*/ private static void demo03() {//創(chuàng)建Map集合對象,多態(tài)HashMap<String, String> map = new HashMap<>();map.put("張銘恩", "胡冰卿");map.put("馬國明", "湯洛雯");map.put("李嘉銘", "劉泳希");map.put("金瀚", "張芷溪");String s = map.get("馬國明");System.out.println(s); }/*** V remove(Object key)* 如果存在一個鍵的映射關(guān)系,則將其從此映射中移除(可選操作)。*/ private static void demo02() {//創(chuàng)建Map集合對象,多態(tài)HashMap<String, String> map = new HashMap<>();map.put("張銘恩", "胡冰卿");map.put("馬國明", "湯洛雯");map.put("李嘉銘", "劉泳希");map.put("金瀚", "張芷溪");System.out.println(map);String s = map.remove("張銘恩");System.out.println(s);System.out.println(map); }/*** V put(K key, V value)* 將指定的值與此映射中的指定鍵關(guān)聯(lián)(可選操作)。*/ private static void demo01() {//創(chuàng)建Map集合對象,多態(tài)HashMap<String, String> map = new HashMap<>();String s = map.put("王", "紅");System.out.println(s); }map集合的遍歷
keySet()
keySet的方法
V get(Object key)返回指定鍵所映射的值;如果此映射不包含該鍵的映射關(guān)系,則返回 null。Set<K> keySet()返回此映射中包含的鍵的 Set 視圖。實現(xiàn)步驟:
使用map集合中的方法keySet(),把map集合中所有的key取出來,存儲到一個Set集合中
遍歷set集合,獲取Map集合中的每一個key
通過map集合中的方法get,通過key找到value
Entry對象中的方法遍歷
map集合遍歷的第二種方式:使用entry對象遍歷
map集合中的方法:Set<Map.Entry<K,V>> entrySet()返回此映射中包含的映射關(guān)系的 Set 視圖。實現(xiàn)步驟:
1.使用map集合中的方法entrySet(),把Map集合中多個Entry對象取出來,存到一個set集合中
2.遍歷set集合,獲取每一個Entry對象
3.使用Entry對象中的方法遍歷getKey()和getValue()獲取對象的鍵與值
HashMap集合的特點:
HashMap集合底層是哈希表:查詢的速度特別快
? JDK1.8之前:數(shù)組+單向鏈表
? Jdk1.8之后:數(shù)組+單向鏈表/紅黑數(shù)(鏈的長度超過8):提高查詢效率
是一個無序集合,存儲元素和取出元素的順序有可能不一致
HashMap存儲自定義類型的鍵值
public static void main(String[] args) {demo02(); } /*** HashMap存儲自定義類型的鍵值* key:Person類型* Person類型重寫hashCode方法和equals方法,可以保證key唯一(同名同年齡視為同一個)* value:String類型* value可以重復(fù)(同名同年齡視為同一個)*/ private static void demo02() {HashMap<Person,String> map = new HashMap<>();map.put(new Person(1970,"孫紅雷"),"哈爾濱");map.put(new Person(2014,"張藝興"),"中國");map.put(new Person(754,"劉奕君"),"中國");map.put(new Person(2014,"張藝興"),"上海");System.out.println(map);//沒有重寫hashCode equals方法前//{Person{age=754, name='劉奕君'}=中國, Person{age=2014, name='張藝興'}=中國, Person{age=1970, name='孫紅雷'}=哈爾濱, Person{age=190, name='吳越'}=上海}//之后//{Person{age=754, name='劉奕君'}=中國, Person{age=2014, name='張藝興'}=上海, Person{age=1970, name='孫紅雷'}=哈爾濱} }/*** HashMap存儲自定義類型的鍵值* key:String類型* String類重寫hashCode方法和equals方法,可以保證key唯一* value:Person類型* value可以重復(fù)(同名同年齡視為同一個)*/ private static void demo01() {HashMap<String, Person> map = new HashMap<>();map.put("哈爾濱",new Person(1970,"孫紅雷"));map.put("中國",new Person(2014,"張藝興"));map.put("中國",new Person(754,"劉奕君"));map.put("上海",new Person(190,"吳越"));System.out.println(map);//{上海=Person{age=190, name='吳越'}, 哈爾濱=Person{age=1970, name='孫紅雷'}, 中國=Person{age=754, name='劉奕君'}} }LinkedHashMap特點
LinkedHashMap集合底層是哈希表+鏈表(保證迭代順序)
?LinkedHashMap集合是一個有序的集合,存儲和取出的元素的順序一致
Hashtable集合
Hashtable:底層也是一個哈希表,是一個線程安全的集合,是單線程的集合,速度慢
HashMap:底層是一個哈希表,是一個線程不安全的集合,是多線程的集合,速度快
HasoMap集合可以存儲NULL值
Hashtable集合不可以
Hashtable和Vector集合一樣,在jdk1.2版本后被取代了
HashTable的子類Properties依然活躍在歷史的舞臺
Properties集合是一個唯一和IO流集合的集合
練習(xí)
計算一個字符串中每個元素出現(xiàn)的次數(shù)
分析:
使用Scanner獲取用戶輸入的字符串
創(chuàng)建Map集合,key是字符串中的字符,value是字符串的個數(shù)
遍歷字符串,獲取每一個字符
使用獲取到的字符,去Map集合判斷key是否存在
key存在:
通過字符(key),獲取value(字符個數(shù))
value++
key不存在
put(key,1)
遍歷Map集合,輸出結(jié)果
第一種
public static void main(String[] args) {//使用Scanner獲取用戶輸入的字符串System.out.println("請輸入字符串");Scanner scanner = new Scanner(System.in);String s = scanner.next();System.out.println("您輸入的字符串是:"+s);//創(chuàng)建Map集合,key是字符串中的字符,value是字符串的個數(shù)HashMap<Character, Integer> map = new HashMap<>();//遍歷字符串,獲取每一個字符/*使用獲取到的字符,去Map集合判斷key是否存在key存在:通過字符(key),獲取value(字符個數(shù))value++key不存在put(key,1)*/for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);Integer integer = map.get(c);if(integer != null){++integer;map.put(c,integer);}else {map.put(c,1);}}//遍歷Map集合,輸出結(jié)果Set<Map.Entry<Character, Integer>> entries = map.entrySet();Iterator<Map.Entry<Character, Integer>> iterator = entries.iterator();while (iterator.hasNext()){Character key = iterator.next().getKey();Integer integer = map.get(key);System.out.println(key +"數(shù)量"+integer);} }第二種
public static void main(String[] args) {//使用Scanner獲取用戶輸入的字符串System.out.println("請輸入字符串");Scanner scanner = new Scanner(System.in);String s = scanner.next();System.out.println("您輸入的字符串是:"+s);//創(chuàng)建Map集合,key是字符串中的字符,value是字符串的個數(shù)HashMap<Character, Integer> map = new HashMap<>();//遍歷字符串,獲取每一個字符/*使用獲取到的字符,去Map集合判斷key是否存在key存在:通過字符(key),獲取value(字符個數(shù))value++key不存在put(key,1)*/for (char c : s.toCharArray()) {if (map.containsKey(c)){Integer integer = map.get(c);++integer;map.put(c,integer);}else {map.put(c,1);}}//遍歷Map集合,輸出結(jié)果Set<Character> set = map.keySet();for (Character character : set) {Integer integer = map.get(character);System.out.println(character +"數(shù)量"+integer);} }斗地主進(jìn)階版
public static void main(String[] args) {//構(gòu)建撲克牌//大王 小王 完成//其他牌 定義兩個數(shù)組//一個存放四種牌 一個存放牌數(shù)String[] types = {"?","?","?","?"};String[] brand = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};//創(chuàng)建存放容器HashMap<Integer, String> poke = new HashMap<>();//存放poke的key值ArrayList<Integer> suoyin = new ArrayList<>();//存牌int key = 0;poke.put(key,"大王");suoyin.add(key);++key;poke.put(key,"小王");suoyin.add(key);++key;for (String s : brand) {for (String type : types) {poke.put(key,type+s);suoyin.add(key);++key;}}System.out.println(poke);System.out.println(suoyin);//洗牌Collections.shuffle(suoyin);System.out.println(suoyin);//創(chuàng)建用戶ArrayList<Integer> paly01 = new ArrayList<>();ArrayList<Integer> paly02 = new ArrayList<>();ArrayList<Integer> paly03 = new ArrayList<>();ArrayList<Integer> dipai = new ArrayList<>();//發(fā)牌for (int i = 0; i < suoyin.size(); i++) {if (i > 50){dipai.add(suoyin.get(i));}else if (i%3 == 0){paly01.add(suoyin.get(i));}else if (i%3 == 1){paly02.add(suoyin.get(i));}else if (i%3 == 2){paly03.add(suoyin.get(i));}}//查看牌demo("我",paly01,poke);demo("你",paly02,poke);demo("他",paly03,poke);demo("底牌",dipai,poke);}private static void demo(String name, ArrayList<Integer> paly, HashMap<Integer, String> poke) {Collections.sort(paly);System.out.print(name + "的牌是:");for (Integer integer : paly) {String s = poke.get(integer);System.out.print(" "+ s);}System.out.println(); }總結(jié)
以上是生活随笔為你收集整理的Map集合、 HashMap集合、LinkedHashMap集合、Hashtable集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习基础篇一
- 下一篇: 苹果 CEO 库克“喜当爹”,女子为其孕