01_Map集合
定义:Map集合称之为双列集合。一个键只能映射一个值,键是唯一的,键相同,值覆盖。
Map集合的继承体系
Map有4个子类
HashMap
Hashtable
LinkedHashMap
Treemap
01.1_HashMap
-
定义:HashMap 他的键的数据结构,是哈希表,无序且唯一,线程不安全,效率高。
-
格式:new HashMap<String,String>=new HashMap<>()
-
添加功能
-
hm.put(“詹姆斯”,“韦德”);
-
当键相同值覆盖,返回的是上一次键所映射的那个旧值。
案例演示以上定义
package HashMapDemo01;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class HashMapTest01 {
public static void main(String[] args) {
//在我们生活中有一种数据是比较常见的。比如一个 学号------学生
// "s001-----张三"
// "s002"------"李四"
// "s003"------"王五"
ArrayList<String> arraylist = new ArrayList<>();
arraylist.add("s001-----詹姆斯");
arraylist.add("s002-----韦德");
arraylist.add("s003-----安东尼");
//如果要得到,soo1詹姆斯,要将字符串进行切割
String[] str1 = arraylist.get(0).split("-+");
System.out.println(str1[0]);
System.out.println(str1[1]);
//Java对于这种 键值映射关系的数据,为了我们方便的操作,给我们提供了另外一种容器,叫做Map集合。
//Map 集合称之为双列结合 他有键,有值。
//Map:双列集合,一个键只能映射一个值,键是唯一的,键相同,值覆盖。
HashMap<String, String> stringHashMap = new HashMap<>();
//添加功能
String s = stringHashMap.put("隆多", "戴维斯");
String s1 = stringHashMap.put("杜拉德利", "麦基");
//当键相同,值覆盖,返回的是上一次这个键所映射的那个旧值
String s2 = stringHashMap.put("隆多", "霍华德");
String s3 = stringHashMap.put("JR", "詹姆斯");
System.out.println(stringHashMap);//{杜拉德利=麦基, 隆多=霍华德, JR=詹姆斯}
System.out.println(s);//null
System.out.println(s2);//戴维斯
}
}
其他功能
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():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数
f:
getDrDefault:获取不到你可以定义一个默认值
案例演示
package HashMapDemo01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapTest01 {
public static void main(String[] args) {
HashMap<String, String> stringHashMap = new HashMap<>();
//添加功能
String s = stringHashMap.put("隆多", "戴维斯");
String s1 = stringHashMap.put("杜拉德利", "麦基");
String s2 = stringHashMap.put("库茨玛", "霍华德");
String s3 = stringHashMap.put("JR", "詹姆斯");
//删除功能
/* //remove:根据键删除键值对元素,并把值返回
stringHashMap.remove("隆多");
System.out.println(stringHashMap);//{杜拉德利=麦基, JR=詹姆斯}
//void clear():移除所有的键值对元素
stringHashMap.clear();
System.out.println(stringHashMap);//{}*/
//判断功能
// boolean containsKey(Object key):判断集合是否包含指定的键
System.out.println(stringHashMap.containsKey("隆多"));//true
// boolean containsValue(Object value):判断集合是否包含指定的值
System.out.println(stringHashMap.containsValue("詹姆斯"));//true
// boolean isEmpty():判断集合是否为空
System.out.println(stringHashMap.isEmpty());//false
System.out.println("-------------------------");
//获取功能
Set<Map.Entry<String, String>> entries = stringHashMap.entrySet();
System.out.println(entries);//[杜拉德利=麦基, 库茨玛=霍华德, 隆多=戴维斯, JR=詹姆斯]
//V get(Object key):根据键获取值
System.out.println(stringHashMap.get("JR"));
// Set<K> keySet():获取集合中所有键的集合
System.out.println(stringHashMap.keySet());//[杜拉德利, 库茨玛, 隆多, JR]
//Collection<V> values():获取集合中所有值的集合
System.out.println(stringHashMap.values());//[麦基, 霍华德, 戴维斯, 詹姆斯]
//size
System.out.println(stringHashMap.size());//4
// getDrDefault:获取不到你可以定义一个默认值
System.out.println(stringHashMap.getOrDefault("威少", "杜兰特"));
}
}
01.2_Map集合的遍历之键找值
HashMap<String, String> stringHashMap = new HashMap<>();
//添加功能
String s = stringHashMap.put("隆多", "戴维斯");
String s1 = stringHashMap.put("杜拉德利", "麦基");
String s2 = stringHashMap.put("库茨玛", "霍华德");
String s3 = stringHashMap.put("JR", "詹姆斯");
//第一种:键找值 keySet();获取所有键的集合
Set<String> keyset = stringHashMap.keySet();
for (String key : keyset) {
String value = stringHashMap.get(key);
System.out.println(key+","+value);
}
01.3_Map集合的遍历之键值对对象找键和值
//第二种:把键值对,看做一个整体,把键值对,对象获取出来,然后使用键值对,对象中的方法来获取键和值。
Set<Map.Entry<String, String>> entries = stringHashMap.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+","+value);
}
01.4_第三种方式;forEach
stringHashMap.forEach(new BiConsumer<String, String>() {
//主要是理解Consumer,消费者,就可以了~主要是对入参做一些列的操作,在stream里,主要是用于forEach;内部迭代的时候,对传入的参数,做一系列的业务操作,没有返回值;
@Override
public void accept(String key, String value) {
System.out.println(key+","+value);
}
});
01.5_存键是String类型,值是Student类型
package HashMapDemo01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class HashMapTest02 {
public static void main(String[] args) {
//存键是String类型,值是Student类型
HashMap<String, Student> hashMap = new HashMap<>();
hashMap.put("2000", new Student("科比", 19));
hashMap.put("2003", new Student("詹姆斯", 18));
hashMap.put("2004", new Student("杜兰特", 20));
hashMap.put("2019", new Student("锡安", 22));
//遍历
Set<Map.Entry<String, Student>> entries = hashMap.entrySet();
for (Map.Entry<String, Student> entry : entries) {
String key = entry.getKey();
Student value = entry.getValue();
System.out.println(key + "," + value.getName() + "," + value.getAge());
}
System.out.println("----------");
Set<String> keySet = hashMap.keySet();
for (String key : keySet) {
Student value = hashMap.get(key);
System.out.println(key + "," + value.getName() + "," + value.getAge());
}
System.out.println("----------");
hashMap.forEach(new BiConsumer<String, Student>() {
@Override
public void accept(String key, Student value) {
System.out.println(key + "," + value.getName() + "," + value.getAge());
}
});
}
}
01.6_存键是stu dent类型,值是string类型
package HashMapDemo01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapTest03 {
public static void main(String[] args) {
//存储键是Student类型,值是String类型
HashMap<Student,String > hashMap = new HashMap<>();
hashMap.put(new Student("科比", 19), "2000");
hashMap.put(new Student("詹姆斯", 18), "2003");
hashMap.put(new Student("杜兰特", 20), "2004");
hashMap.put(new Student("锡安", 22), "2019");
//遍历
Set<Map.Entry<Student, String>> entries = hashMap.entrySet();
for (Map.Entry<Student, String> entry : entries) {
Student key = entry.getKey();
String value = entry.getValue();
System.out.println( key.getName() + "," + key.getAge()+","+value);
}
}
}
01.7_HashMap 和 Hashtable 的区别
HashMap 并允许使用 null 值和 null 键 线程不安全,效率高
Hashtable 不允许 null值null键 线程安全,效率低
案例演示
package HashMapDemo01;
import java.util.HashMap;
import java.util.Hashtable;
public class HashMapTest04 {
public static void main(String[] args) {
//HashMap 和 Hashtable 的区别
HashMap<String, String> stringStringHashMap = new HashMap<>();
stringStringHashMap.put(null,null);
System.out.println(stringStringHashMap);
Hashtable<String, String> stringStringHashtable = new Hashtable<>();
//stringStringHashtable.put(null,"abc");
stringStringHashtable.put("abc", null);
}
}