目錄
1.Map集合
2.hashMap集合
3.LinkedHashMap集合
4.?TreeMap集合
1.Map集合
????????Map集合是鍵值對(duì)集合
????????格式:{key1=value1, key2=value2, key3=value3, ...}
????????Map系列集合的特點(diǎn)都是由鍵決定的,值只是一個(gè)附屬品,值不做要求
2.實(shí)現(xiàn)類(lèi)有哪些?,各自有什么特點(diǎn)?
????????HashMap:無(wú)序、不重復(fù)、無(wú)索引; (用的最多)
????????LinkedHashMap:有序、不重復(fù)、無(wú)索引
????????TreeMap:按照大小默認(rèn)升序排序、不重復(fù)、無(wú)索引
3.Map的常用方法
????????Map是雙列集合的祖宗,它的功能是全部雙列集合都可以繼承過(guò)來(lái)使用的。
????????????????????????
代碼展示:
package com.itheima.day08.teacher.map01;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo01 {
/*
Map集合是什么?有什么特點(diǎn)?
Map是雙列集合,也叫鍵值對(duì)兒集合。
里面的元素是一對(duì)兒一對(duì)兒的。這一對(duì)兒元素稱(chēng)為鍵值對(duì)對(duì)象,Entry對(duì)象。
當(dāng)存儲(chǔ)多個(gè) 一一對(duì)應(yīng)數(shù)據(jù)的時(shí)候,使用Map。
特點(diǎn):
鍵唯一,值可以重復(fù),每個(gè)鍵都只能找到自己對(duì)應(yīng)的值。
Map集合實(shí)現(xiàn)類(lèi)有哪些?
HashMap 鍵 唯一 無(wú)序 無(wú)索引 值無(wú)所謂
LinkedHashMap 鍵 唯一 有序 無(wú)索引 值無(wú)所謂
TreeMap
鍵 唯一 可排序 無(wú)索引 值無(wú)所謂
Map集合常用方法:
集合對(duì)象的創(chuàng)建
一般采用空參構(gòu)造
Map<K,V> 泛型K表示鍵的類(lèi)型 泛型V表示值的類(lèi)型
Map<鍵的類(lèi)型,值的類(lèi)型> map = new 子類(lèi)對(duì)象<>();
增 刪 改 查
V put(K key,V value) 存放一對(duì)元素
put有倆層 意思
如果 鍵沒(méi)有在集合中出現(xiàn),此時(shí)put是添加。 V返回是null.
鍵在集合中出現(xiàn)了,此時(shí)put是修改。 V 返回的是被替換的值。
HashMap中是可以存儲(chǔ) null值 null鍵
boolean isEmpty() 集合是否為空 為空true
int size() 查看鍵值對(duì)個(gè)數(shù)
clear() 清空 集合中所有鍵值對(duì)全刪了
查 map特點(diǎn) 以鍵為準(zhǔn)的
V get(K key)根據(jù)鍵找值
刪
V remove(K key)根據(jù)鍵刪除當(dāng)前的鍵值對(duì)關(guān)系
包含
boolean containsKey(K k)是否包含指定的鍵
boolean containsValue(V v)是否包含指定值
獲取 鍵集 值集
Set<K> keySet() 獲取鍵集
Collection<V> values() 獲取值集
集合的遍歷
*/
public static void main(String[] args) {
//1:創(chuàng)建集合對(duì)象
Map<String,Integer> map = new HashMap<>();//多態(tài)形勢(shì)下研究 通用方法
//2:集合里面當(dāng)前沒(méi)有內(nèi)容
System.out.println("當(dāng)前集合是不是空的呢?"+map.isEmpty());
//3:添加鍵值對(duì)元素到 集合中
map.put("隨便",3);
map.put("記憶枕",30);
map.put("大鵝",10000);
map.put("叮當(dāng)貓",0);
map.put("隨便",4);//修改
//4:查看集合中元素個(gè)(對(duì))數(shù)
System.out.println("當(dāng)前集合有:"+map.size()+"對(duì)元素");
System.out.println(map);
//5:清空集合--
// map.clear();
// System.out.println(map);
//6:根據(jù)鍵找值 如果找不到 返回null 找到返回對(duì)應(yīng)的值。
System.out.println("大鵝的價(jià)格:"+map.get("大鵝"));
System.out.println("大鴉的價(jià)格:"+map.get("大鴉"));
//7:刪除
System.out.println("刪除叮當(dāng)貓:"+map.remove("叮當(dāng)貓"));
System.out.println("刪除之后的集合:"+map);
//8:包含 不包含false 包含是true
System.out.println("是否包含叮當(dāng)貓的鍵:"+map.containsKey("叮當(dāng)貓"));
System.out.println("是否包含大鵝的鍵:"+map.containsKey("大鵝"));
System.out.println("是否包含價(jià)格為30的商品:"+map.containsValue(30));
//9:獲取鍵集和值集
Set<String> keys = map.keySet();
System.out.println(keys);
Collection<Integer> values = map.values();
System.out.println(values);
//10:從上面方法中選擇一下 能不能完成 鍵值對(duì)兒數(shù)據(jù)的遍歷...
}
}
4.Map的遍歷方式(三種)
????????1.鍵找值:keySet()獲取所有的鍵集合,在用get(),通過(guò)鍵獲取值遍歷
?? ?????2.鍵值對(duì):用entrySet() ,把鍵值合成一個(gè)整體在set集合里,遍歷用getKey()和getValue()
?? ?????3.Lambda:用forEarch,里面new BIconsumer
代碼展示:
package com.itheima.day08.teacher.map01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo02 {
/*
Map集合遍歷方式一:
鍵找值
步驟:
先根據(jù)keySet()方法獲取鍵集
遍歷鍵集得到每個(gè)鍵
根據(jù)鍵找值 get(K k)
*/
public static void main(String[] args) {
// 準(zhǔn)備一個(gè)Map集合。
Map<String, Double> map = new HashMap<>();
map.put("蜘蛛精", 162.5);
map.put("蜘蛛精", 169.8);
map.put("紫霞", 165.8);
map.put("至尊寶", 169.5);
map.put("牛魔王", 183.6);
System.out.println(map);//查看內(nèi)容不是遍歷
//遍歷指的是 一個(gè)個(gè)取出來(lái)。
//1:獲取map集合的鍵集
Set<String> keys = map.keySet();
//2:遍歷 增強(qiáng)for 得到每個(gè)鍵
for (String key : keys) {
//3:根據(jù)鍵 獲取對(duì)應(yīng)的值
Double value = map.get(key);
System.out.println(key+" : "+value);
}
}
}
-----------------
package com.itheima.day08.teacher.map01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo03 {
/*
Map集合遍歷方式二:(面向?qū)ο笏枷敕绞?
鍵值對(duì)兒 方式......
鍵值對(duì)兒對(duì)象 叫 Entry類(lèi)型
每一個(gè) entry對(duì)象表示 一個(gè)鍵值對(duì)兒
Set<Entry對(duì)象> entrySet() 獲取 "鍵值對(duì)兒"(整體) 集合
Entry理解為 封裝了 鍵和值的一個(gè)特殊對(duì)象
getKey() 獲取該對(duì)象的鍵
getValue()獲取該對(duì)象的值
Entry<K,V> K鍵的類(lèi)型 V 值的類(lèi)型
Set<Map.Entry<K,V>> entrySet()
步驟:
1:map集合調(diào)用 entrySet()方法 得到 一個(gè) 存放 entry對(duì)象的 set集合
2:遍歷 存放entry對(duì)象的set集合 得到每一個(gè) entry對(duì)象
3:調(diào)用entry對(duì)象的 獲取鍵的方法 獲取值的方法 取出對(duì)應(yīng)鍵值
*/
public static void main(String[] args) {
// 準(zhǔn)備一個(gè)Map集合。
Map<String, Double> map = new HashMap<>();
map.put("蜘蛛精", 162.5);
map.put("蜘蛛精", 169.8);
map.put("紫霞", 165.8);
map.put("至尊寶", 169.5);
map.put("牛魔王", 183.6);
System.out.println(map);
// 1:map集合調(diào)用 entrySet()方法 得到 一個(gè) 存放 entry對(duì)象的 set集合
Set<Map.Entry<String, Double>> entries = map.entrySet();
//2:遍歷 存放entry對(duì)象的set集合 得到每一個(gè) entry對(duì)象
for (Map.Entry<String, Double> entry : entries) {
//entry就是存放 沒(méi)對(duì) 鍵值的 對(duì)象
// 3:調(diào)用entry對(duì)象的 獲取鍵的方法 獲取值的方法 取出對(duì)應(yīng)鍵值
String key = entry.getKey();
Double value = entry.getValue();
System.out.println(key+" : "+value);
}
}
}
------------------
package com.itheima.day08.teacher.map01;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class MapDemo04 {
/*
Map集合遍歷方式三:
JDK8之后 Lambda方式
map集合在JDK8之后提供類(lèi)一個(gè)
forEach(處理鍵和值的接口)方法
*/
public static void main(String[] args) {
// 準(zhǔn)備一個(gè)Map集合。
Map<String, Double> map = new HashMap<>();
map.put("蜘蛛精", 162.5);
map.put("蜘蛛精", 169.8);
map.put("紫霞", 165.8);
map.put("至尊寶", 169.5);
map.put("牛魔王", 183.6);
System.out.println(map);
map.forEach(new BiConsumer<String, Double>() {
@Override
public void accept(String k, Double v) {//底層用一個(gè)方法去接收了 每次遍歷出來(lái)的鍵和值
System.out.println(k+" : "+v);
}
});
System.out.println("================");
map.forEach((k,v)-> System.out.println(k+" : "+v));
}
}
2.hashMap集合
????????HashMap集合的底層原理
? ? ? ? 1.HashMap跟HashSet的底層原理是一模一樣的,都是基于哈希表實(shí)現(xiàn)的。
????????????????JDK8之前,哈希表 = 數(shù)組+鏈表
????????????????JDK8開(kāi)始,哈希表 = 數(shù)組+鏈表+紅黑樹(shù)
????????????????哈希表是一種增刪改查數(shù)據(jù)性能都較好的數(shù)據(jù)結(jié)構(gòu)。
? ? ? ? 2.實(shí)際上:原來(lái)學(xué)的Set系列集合的底層就是基于Map實(shí)現(xiàn)的,只是Set集合中的元素只要鍵數(shù)據(jù),不要值數(shù)據(jù)而已。
? ? ? ? 3.HashMap如何實(shí)現(xiàn)鍵的唯一性的
????????????????依賴(lài)hashCode方法和equals方法保證鍵的唯一。
????????????????如果鍵要存儲(chǔ)的是自定義對(duì)象,需要重寫(xiě)hashCode和equals方法。
代碼演示:
????????
package com.itheima.day08.teacher.map02;
import java.util.Objects;
/**
學(xué)生類(lèi)
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 獲取
* @return name
*/
public String getName() {
return name;
}
/**
* 設(shè)置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 獲取
* @return age
*/
public int getAge() {
return age;
}
/**
* 設(shè)置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
-------------
package com.itheima.day08.teacher.map02;
import java.util.HashMap;
/**
* HashMap測(cè)試類(lèi)
*/
public class HashMapDemo {
public static void main(String[] args) {
//創(chuàng)建一個(gè) 存儲(chǔ) 學(xué)生對(duì)象--籍貫對(duì)應(yīng) 關(guān)系的 集合
HashMap<Student,String> map = new HashMap<>();
//每次存一個(gè)學(xué)生對(duì)象--籍貫
Student stu1 = new Student("小學(xué)", 15);
Student stu2 = new Student("中學(xué)", 19);
Student stu3 = new Student("高中", 22);
Student stu4 = new Student("小學(xué)", 15);
//stu1 來(lái)自 吉林 stu2 黑龍江 stu3 遼寧
map.put(stu1,"吉林");
map.put(stu2,"黑龍江");
map.put(stu3,"遼寧");
map.put(stu4,"熱河");// map集合特點(diǎn) 鍵唯一
// 沒(méi)有重寫(xiě) hashcode equals時(shí)候 兩次new 就是兩個(gè)不同的對(duì)象。
// 我們會(huì)認(rèn)為 stu1 stu4 的 內(nèi)容一樣就是相同的對(duì)象---需要我們?nèi)ブ貙?xiě)鍵的hashCode equals方法
map.forEach((k,v)->{
System.out.println(k+"="+v);
});
}
}
3.LinkedHashMap集合
????????LinkedHashMap集合的底層原理
? ? ? ? 1.底層數(shù)據(jù)結(jié)構(gòu)依然是基于哈希表實(shí)現(xiàn)的,只是每個(gè)鍵值對(duì)元素又額外的多了一個(gè)雙鏈表的機(jī)制記錄元素順序(保證有序)。
? ? ? ? 2.實(shí)際上:原來(lái)學(xué)習(xí)的LinkedHashSet集合的底層原理就是LinkedHashMap。
package com.itheima.day08.teacher.map02;
import java.util.Objects;
/**
* 學(xué)生類(lèi)
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 獲取
* @return name
*/
public String getName() {
return name;
}
/**
* 設(shè)置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 獲取
* @return age
*/
public int getAge() {
return age;
}
/**
* 設(shè)置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
---------------
package com.itheima.day08.teacher.map02;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
* LinkedHashMap測(cè)試類(lèi)
*/
public class LinkedHashMapDemo {
public static void main(String[] args) {
//創(chuàng)建一個(gè) 存儲(chǔ) 學(xué)生對(duì)象--籍貫對(duì)應(yīng) 關(guān)系的 集合
LinkedHashMap<Student,String> map = new LinkedHashMap<>();
//每次存一個(gè)學(xué)生對(duì)象--籍貫
Student stu1 = new Student("小學(xué)", 15);
Student stu2 = new Student("中學(xué)", 19);
Student stu3 = new Student("高中", 22);
Student stu4 = new Student("小學(xué)", 15);
//stu1 來(lái)自 吉林 stu2 黑龍江 stu3 遼寧
map.put(stu1,"吉林");
map.put(stu2,"黑龍江");
map.put(stu3,"遼寧");
map.put(stu4,"熱河");// map集合特點(diǎn) 鍵唯一
// 沒(méi)有重寫(xiě) hashcode equals時(shí)候 兩次new 就是兩個(gè)不同的對(duì)象。
// 我們會(huì)認(rèn)為 stu1 stu4 的 內(nèi)容一樣就是相同的對(duì)象---需要我們?nèi)ブ貙?xiě)鍵的hashCode equals方法
map.forEach((k,v)->{
System.out.println(k+"="+v);
});
}
}
4.?TreeMap集合
????????TreeMap集合的底層原理
? ? ? ? 1.TreeMap跟TreeSet集合的底層原理是一樣的,都是基于紅黑樹(shù)實(shí)現(xiàn)的排序。
? ? ? ? 2.TreeMap集合同樣也支持兩種方式來(lái)指定排序規(guī)則
????????????????讓類(lèi)實(shí)現(xiàn)Comparable接口,重寫(xiě)比較規(guī)則。
????????????????TreeMap集合有一個(gè)有參數(shù)構(gòu)造器,支持創(chuàng)建Comparator比較器對(duì)象,以便用來(lái)指定比較規(guī)則。? ? ?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-833039.html
package com.itheima.day08.teacher.map02;
import java.util.Objects;
/**
* 學(xué)生類(lèi)
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 獲取
* @return name
*/
public String getName() {
return name;
}
/**
* 設(shè)置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 獲取
* @return age
*/
public int getAge() {
return age;
}
/**
* 設(shè)置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
------------------
package com.itheima.day08.teacher.map02;
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
/**
* TreeMap測(cè)試類(lèi)
*/
public class TreeMapDemo {
public static void main(String[] args) {
//創(chuàng)建一個(gè) 存儲(chǔ) 學(xué)生對(duì)象--籍貫對(duì)應(yīng) 關(guān)系的 集合
TreeMap<Student,String> map = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()-o1.getAge();
}
});
//每次存一個(gè)學(xué)生對(duì)象--籍貫
Student stu1 = new Student("小學(xué)", 15);
Student stu2 = new Student("中學(xué)", 19);
Student stu3 = new Student("高中", 22);
Student stu4 = new Student("小學(xué)", 15);
//stu1 來(lái)自 吉林 stu2 黑龍江 stu3 遼寧
map.put(stu1,"吉林");
map.put(stu2,"黑龍江");
map.put(stu3,"遼寧");
map.put(stu4,"熱河");
map.forEach((k,v)->{
System.out.println(k+"="+v);
});
}
}
集合的嵌套:??指的是集合中的元素又是一個(gè)集合文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-833039.html
到了這里,關(guān)于Map集合體系(HashMap,LinkedHashMap,TreeMap)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!