1.概述
2.Map接口和Collection接口的不同
3.Map集合体系
4.键对应关系
5.Map集合中的方法
6.Map集合的遍历
1.HashMap简介
2.HashMap与Hashtable的区别
针对于键值对应关系的数据,Java为了我们方便操作,给我们提供了另外一种集合叫做Map 专门存储键值对应关系的数据.Map集合也称为双列集合.Map接口----->Map
Map接口是一个不同于Conllection接口的接口,它们之间也没有什么联系.也有较大的区别!
一个键只能对应一个值,键相同,则值覆盖.并且所有的双列集合的数据结构只跟键有关,跟值没有关系.
import java.util.HashMap;
public class MapTest {
public static void main(String[] args) {
HashMap hm=new HashMap();
hm.put(1001,"张三");
hm.put(1002,"李四");
hm.put(1003,"王五");
hm.put(1001,"刘六");
System.out.println(hm.get(1001)); //刘六
}
}
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class MapTest {
public static void main(String[] args) {
//map集合的遍历
HashMap hm = new HashMap<>();
hm.put("我", "喜欢画画");
hm.put("你", "喜欢打乒乓");
hm.put("他", "喜欢听音乐");
hm.put("它", "喜欢吃小鱼干");
//方式1:键找值
Set keySet = hm.keySet();
for (String key : keySet) {
String value = hm.get(key);
System.out.println(key + "===" + value);
}
//方式2: 获取所有键值对,对象的集合
Set> entries = hm.entrySet();
for (Map.Entry node : entries) {
String key = node.getKey();
String value = node.getValue();
System.out.println(key + "====" + value);
}
System.out.println("====================================");
//方式3: forEach()
hm.forEach(new BiConsumer() {
@Override
public void accept(String key, String value) {
System.out.println(key + "====" + value);
}
});
}
}
HashMap的数据结构是哈希表(数组+链表+红黑树),元素唯一,无序.(HashMap键的唯一性,是靠键重写hashCode 和equals()方法来保证的,如果不重写,则无法保证键的唯一性.)HashMap集合允许插入null键 null值.
底层的数据结构是链表和哈希表, 元素有序并且唯一. 元素的有序性由链表数据结构保证, 唯一性由 哈希表数据结构保证. (谨记: Map集合的数据结构只和键有关)
import java.util.LinkedHashMap;
public class LinkedHashMapTest {
public static void main(String[] args) {
LinkedHashMap lh = new LinkedHashMap<>();
lh.put("我", "喜欢画画");
lh.put("你", "喜欢打乒乓");
lh.put("他", "喜欢听音乐");
lh.put("它", "喜欢吃小鱼干");
System.out.println(lh);
}
}
TreeMap键的数据结构是红黑树,可保证键的排序和唯一性. 排序分为自然排序和比较器排序,一般默认为自然排序. 线程是不安全的效率比较高.
关于排序与TreeSet集合相同.只是创建的集合不同罢了! (了解相关排序点击这里)
package com.xingyun.test;
import java.util.Comparator;
import java.util.TreeMap;
import java.util.function.BiConsumer;
public class TreeMapTest {
public static void main(String[] args) {
//1. 自然排序
//按照年龄进行排序
TreeMap treeMap = new TreeMap<>(); //空参构造
treeMap.put(new Student("张三", 23),"热爱生活");
treeMap.put(new Student("李四", 27),"热爱JAVA");
treeMap.put(new Student("刘德华", 21),"热爱足球");
treeMap.put(new Student("欧阳震华", 28),"热爱画画");
treeMap.put(new Student("张三", 23),"热爱音乐");
treeMap.forEach(new BiConsumer() {
@Override
public void accept(Student student, String s) {
System.out.println(student.getAge()+"==="+student.getName()+"==="+s);
}
});
/*
21===刘德华===热爱足球
23===张三===热爱音乐
27===李四===热爱JAVA
28===欧阳震华===热爱画画
*/
//比较器排序
TreeMap treeMap2 = new TreeMap<>(new Comparator() {
//匿名内部类
@Override
public int compare(Student s1, Student s2) {
//根据名字长度排序
int num = s1.getName().length() - s2.getName().length();
//名字长度相同则根据名字内容
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
//都相同的话,根据年龄排序
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
});
treeMap2.put(new Student("张三", 23),"热爱生活");
treeMap2.put(new Student("李四", 27),"热爱JAVA");
treeMap2.put(new Student("刘德华", 21),"热爱足球");
treeMap2.put(new Student("欧阳震华", 28),"热爱画画");
treeMap2.put(new Student("张三", 23),"热爱音乐");
treeMap2.forEach(new BiConsumer() {
@Override
public void accept(Student student, String s) {
System.out.println(student.getName()+"==="+student.getAge()+"==="+s);
}
});
/*
张三===23===热爱音乐
李四===27===热爱JAVA
刘德华===21===热爱足球
欧阳震华===28===热爱画画
*/
}
}
(小编也在努力学习更多哟!以后再慢慢分享的啦!)
希望对友友们有所帮助!!!!