集合(三)
Map
將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。所有Map集合的數據結構,只跟鍵有關,跟值沒關係,鍵相同,值覆蓋
一、HashMap
1、概述及特點
基於哈希表的 Map 接口的實現。允許使用 null 值和 null 鍵。鍵值對無序(存取順序)。線程不安全,效率高。
2、HashMap常用方法
Map集合的功能概述
a:添加功能
V put(K key,V value):添加元素。
如果鍵是第一次存儲,就直接存儲元素,返回null
如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
b:刪除功能
void clear():移除所有的鍵值對元素
V remove(Object key):根據鍵刪除鍵值對元素,並把值返回
c:判斷功能
boolean containsKey(Object key):判斷集合是否包含指定的鍵
boolean containsValue(Object value):判斷集合是否包含指定的值
boolean isEmpty():判斷集合是否爲空
d:獲取功能
Set<Map.Entry<K,V>> entrySet(): 返回一個鍵值對的Set集合
V get(Object key):根據鍵獲取值
Set<K> keySet():獲取集合中所有鍵的集合
Collection<V> values():獲取集合中所有值的集合
int size():獲取集合中的鍵值對的對數
3、HashMap常用方法測試
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Blog {
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap<>();
Integer oldValue = hashMap.put("aaa", 111);
System.out.println(oldValue);
Integer oldValue1 = hashMap.put("aaa", 222);
System.out.println(oldValue1);
hashMap.put("bbb",222);
System.out.println(hashMap);
Integer aaa = hashMap.remove("aaa");
System.out.println(hashMap);
System.out.println(aaa);
hashMap.clear();
System.out.println(hashMap);
hashMap.put("ccc",333);
boolean c = hashMap.containsKey("ccc");
System.out.println(c);
boolean c1 = hashMap.containsValue(333);
System.out.println(c1);
boolean empty = hashMap.isEmpty();
System.out.println(empty);
Set<Map.Entry<String, Integer>> set = hashMap.entrySet();
hashMap.get("ccc");
Set<String> keySet = hashMap.keySet();
Collection<Integer> values = hashMap.values();
hashMap.size();
}
}
4、Map集合的遍歷
A:方式一:先獲取鍵,再通過鍵找值
public static void traversingWayOne(HashMap<String, Integer> hashMap) {
Set<String> keySet = hashMap.keySet();
for (String s : keySet) {
System.out.println(s);
Integer value = hashMap.get(s);
System.out.println(value);
}
}
B:方式二:先獲取鍵值對,再獲取鍵和值
public static void traversingWayTwo(HashMap<String, Integer> hashMap) {
Set<Map.Entry<String, Integer>> set = hashMap.entrySet();
for (Map.Entry<String, Integer> entry : set) {
String key = entry.getKey();
System.out.println(key);
Integer value = entry.getValue();
System.out.println(value);
}
}
5、HaShMap保證鍵唯一性
import java.util.HashMap;
import java.util.Objects;
public class Blog2 {
public static void main(String[] args) {
HashMap<Student,String> hashMap = new HashMap<>();
hashMap.put(new Student("張三",23),"1");
hashMap.put(new Student("李四",27),"1");
hashMap.put(new Student("王五",26),"1");
hashMap.put(new Student("張三",23),"1");
hashMap.put(new Student("李四",27),"1");
hashMap.put(new Student("王五",26),"1");
hashMap.put(new Student("趙六",25),"1");
hashMap.put(new Student("張三",24),"1");
hashMap.put(new Student("曾七",23),"1");
System.out.println(hashMap);
}
}
class Student{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
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);
}
}
運行結果:
{Student{name='張三', age=23}=1, Student{name='李四', age=27}=1, Student{name='王五', age=26}=1, Student{name='趙六', age=25}=1, Student{name='張三', age=24}=1, Student{name='曾七', age=23}=1}
6、HashMap和Hashtable關係
HashMap:可以存null值null鍵,線程不安全,效率高
Hashtable:不能存null值null鍵,線程安全,效率低
其餘大致相同。
二、LinkedHashMap
1、概述及特點
Map 接口的哈希表和鏈表實現,具有可預知的迭代順序(元素有序),並且唯一,可以存儲null鍵null值。元素的有序性由鏈表數據結構保證,唯一性由哈希表數據結構保證,Map集合的數據結構只和鍵有關。
2、演示
import java.util.LinkedHashMap;
public class Blog3 {
public static void main(String[] args) {
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("aaa",111);
linkedHashMap.put("bbb",222);
linkedHashMap.put(null,null);
System.out.println(linkedHashMap);
}
}
運行結果:
{aaa=111, bbb=222, null=null}
Process finished with exit code 0
三、TreeMap
1、概述及特點
鍵的數據結構是二叉樹,可保證鍵的排序和唯一性,序分爲自然排序和比較器排序,鍵不允許插入null,線程不安全,效率高
2、演示
import java.util.Comparator;
import java.util.TreeMap;
public class Blog4 {
public static void main(String[] args) {
TreeMap<Student,String> treeMap = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num=o1.getAge()-o2.getAge();
int num1=num==0?o1.getName().compareTo(o2.getName()):num;
return num1;
}
});
treeMap.put(new Student("張三",23),"a");
treeMap.put(new Student("李四",27),"a");
treeMap.put(new Student("王五",26),"a");
treeMap.put(new Student("張三",23),"a");
treeMap.put(new Student("李四",27),"a");
treeMap.put(new Student("王五",26),"a");
treeMap.put(new Student("趙六",25),"a");
treeMap.put(new Student("張三",24),"a");
treeMap.put(new Student("曾七",23),"a");
System.out.println(treeMap);
}
}
class Student{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
運行結果:
{Student{name='張三', age=23}=a, Student{name='曾七', age=23}=a, Student{name='張三', age=24}=a, Student{name='趙六', age=25}=a, Student{name='王五', age=26}=a, Student{name='李四', age=27}=a}
四、集合嵌套
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Blog {
public static void main(String[] args) {
ArrayList<Student> jcList = new ArrayList<>();
jcList.add(new Student("張三",20));
jcList.add(new Student("李四",22));
ArrayList<Student> jyList = new ArrayList<>();
jyList.add(new Student("王五",21));
jyList.add(new Student("趙六",23));
HashMap<String, ArrayList<Student>> listMap = new HashMap<>();
listMap.put("jc\t基礎班",jcList);
listMap.put("jy\t就業班",jyList);
HashMap<String, HashMap<String, ArrayList<Student>>> maxMap = new HashMap<>();
maxMap.put("傳智播客",listMap);
Set<Map.Entry<String, HashMap<String, ArrayList<Student>>>> entries = maxMap.entrySet();
for (Map.Entry<String, HashMap<String, ArrayList<Student>>> entry : entries) {
String key = entry.getKey();
System.out.println(key);
HashMap<String, ArrayList<Student>> value = entry.getValue();
Set<Map.Entry<String, ArrayList<Student>>> entries1 = value.entrySet();
for (Map.Entry<String, ArrayList<Student>> stringArrayListEntry : entries1) {
String key1 = stringArrayListEntry.getKey();
System.out.println("\t"+key1);
ArrayList<Student> value1 = stringArrayListEntry.getValue();
for (Student student : value1) {
String name = student.getName();
int age = student.getAge();
System.out.println("\t\t"+name+"\t "+age);
}
System.out.println(); }
}
}
}
class Student{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
運行結果:
傳智播客
jc 基礎班
張三 20
李四 22
jy 就業班
王五 21
趙六 23
集合小結