一:Map集合的概述
(1)ap集合出现的原因是:一个集合中的元素可能会会属性相同,如姓名,所以为了解决这一个问题所以我们出现了Map类,主要思想是键值相对。
(2) Map集合
/接口 Map<K, V >
类型参数:K:此映射所维护的键的类型 V:映射值的类型(注意)将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。数据结构为哈希表,可以使用null值和null键
(3)Map集合的功能
a:清空集合中所有的元素 map.clear();
b: 删除某一个键值对 map.remove(1);
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
二:HashMap
(1)概述:基于哈希表的 Map 接口的实现。
此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序, 特别是它不保证该顺序恒久不变。注意(如果两次的键相同,那么相对应的值就会被覆盖切返回值为被覆盖的值)
举例:
public class Demo {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
String put = hashMap.put("梁山伯", "祝英台");
System.out.println(put);
hashMap.put("罗密欧","朱丽叶");
hashMap.put("周瑜","小乔");
String put1 = hashMap.put("梁山伯", "朱丽叶");
System.out.println(put1);
System.out.println(hashMap);
}
}
结果:
遍历Map集合的两种方式
(1)键找值:
举例:
public class Demo1 {
public static void main(String[] args) {
HashMap<String, Student> map = new HashMap<>();
map.put("a11",new Student("张三",15));
map.put("b11",new Student("赵四",13));
map.put("c11",new Student("张二",19));
map.put("z11",new Student("刘能",20));
map.put("b10",new Student("张三",15));
//遍历 键找值
Set<String> set = map.keySet();
for(String stu:set){
System.out.println(stu+"=="+map.get(stu).getName()+"=="+map.get(stu).getAge());
}
}
}
学生类:
public class Student {
private String name;
private int 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);
}
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;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
}
结果:
(2) Entry 键值对 对象
举例:
public class Demo1 {
public static void main(String[] args) {
HashMap<String, Student> map = new HashMap<>();
map.put("a11",new Student("张三",15));
map.put("b11",new Student("赵四",13));
map.put("c11",new Student("张二",19));
map.put("z11",new Student("刘能",20));
map.put("b10",new Student("张三",15));
// Entry 键值对 对象
Set<Map.Entry<String, Student>> entries = map.entrySet();
for (Map.Entry<String, Student> stu:entries){
String key = stu.getKey();
Student value = stu.getValue();
System.out.println(key+"=="+value.getName()+"=="+value.getAge());
}
}
}
学生类:
public class Student {
private String name;
private int 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);
}
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;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
}
结果:
三:LinkedHashMap
概述:实现类的数据结构为哈希表和链表,可以预知迭代顺序,特点是元素唯一而且元素有序,唯一性靠哈希表保证,有序性靠链表来保证。
举例:
public class LinkedHash {
public static void main(String[] args) {
LinkedHashMap<Integer,String> map = new LinkedHashMap<>();
map.put(10,"高圆圆");
map.put(6,"范冰冰");
map.put(2,"李冰冰");
map.put(10,"范冰冰");
Set<Integer> set = map.keySet();
for(Integer s:set){
System.out.println(s+"=="+map.get(s));
}
}
}
结果:
三:TreeMap
(1)概述: 键的数据结构是红黑树,可保证键的排序和唯一性
排序分为自然排序和比较器排序
线程是不安全的效率比较高
(2)举例:
集合嵌套之HashMap嵌套HashMap
基础班
张三 20
李四 22
就业班
王五 21
赵六 23
public class Demo {
public static void main(String[] args) {
LinkedHashMap<String, Integer> jichu = new LinkedHashMap<>();
jichu.put("张三",20);
jichu.put("李四",22);
LinkedHashMap<String, Integer> jiuye = new LinkedHashMap<>();
jiuye.put("王五",21);
jiuye.put("赵六",23);
LinkedHashMap<String, LinkedHashMap<String,Integer>> map = new LinkedHashMap<>();
map.put("基础",jichu);
map.put("就业",jiuye);
Set<String> strings = map.keySet();
for(String string:strings){
System.out.println(string);
LinkedHashMap<String, Integer> s = map.get(string);
Set<String> strings1 = s.keySet();
for(String s1:strings1){
System.out.println("\t"+s1+" "+s.get(s1));
}
System.out.println();
}
}
}
结果: