目录
前言:
本篇文章重点讨论多列集合(Map),以及多列集合用到的集合工具类。
感谢大家的观看。
什么是Map?
作为多列集合,它和单列集合Set有什么相同点和区别?
Map---用于存储键值对(key--value)
如大家所见,它可以存储一对元素。
那么一对元素有什么用呢?
首先,让我们回顾单列集合的知识,同时思考一个问题。
如果我要买菜,我应该如何让菜和价格联系起来?
在单列集合中,我们只能创建一个自定义类,将菜和价格强行放在一个类中,最后通过我们的单列集合展现出来。
这样固然可以,可是,如果我想要搜索菜就带出它的价格呢?
在单列集合中,菜和价格被固化成了一个整体,我们无法通过搜索菜而寻找它对应的价格。
或者说,不存在只知道菜不知道价格的情况。
这样的局限却往往是我们生活中最常见的。
所以,映射 键值对(key---value)便应运而生。
大家都学过映射吧!
就像这样的一个东西。
Map集合左边的key(键)是唯一的,一个键值只能对应一个值;
Map集合右边的value(值)是可以相同的,不同的键可以关联相同的值。
ok,在对Map集合有了一个简单的了解后,让我们正式开始这篇Map之旅。
一、Map
---存储键值对(key--value)
1.1 特点
存储元素:必须以键值对(key--value)的方式进行;
--键key-----唯一--------一键一值;
--值value--可重复-----不同键可以关联相同值
查找;高效---通过唯一的key可以快速查找到对应的value
1.2 方法
size();
put(K key,V value);----给指定的key赋value值
putAll();
containsKey();
containsValue();
keySet();----返回集合中所有的key值
1.3 实现类
---核心区别:排序方式--线性安全
Map有三种实现类:
--HashMap
--TreeMap
--LinkedHashMap
二、实现类
我们已经了解到Map有三种实现类,它们和Set的实现类长的十分相似。
接下来我将会用HashMap着重讨论方法,TreeMap来进行实战练习。
2.1 HashMap
特点;
--底层Hash表-->存储顺序不保证一致
--key唯一------->自定义类要重写hashCode()和equals()方法
--线程不安全
--Null?--->查询没有键值对应的value值为null--->key可以为null,但也只能唯一
代码演示:
public class Test {
public static void main(String[] args) {
//创建一个HashMap集合
Map<Integer,String> map=new HashMap<>();
//添加元素---给指定的key赋value值
map.put(0, "hello");
map.put(1, "hello");
map.put(0, "hello1");//hello1会将hello覆盖----键Key值唯一的体现
System.out.println(map.size());
System.out.println(map);
//使用map.put时,需要先判断
int key=0;
if(!map.containsKey(key)){
map.put(key, "newValue");
}
//通过key查询value
System.out.println("0:"+map.get(0));
System.out.println("1:"+map.get(1));
System.out.println("2:"+map.get(2));//没有---null
//删除
map.remove(0);
System.out.println(map.remove(1));//返回被删除的值---hello
System.out.println(map.remove(2));//null
//-----------------------------
map.put(0, "123");
map.put(1, "456");
map.put(2, "789");
//------------------------------
//遍历 方法1
Set<Integer> set=map.keySet();
System.out.println(set);
for(Integer i:set){
System.out.println(map.get(i));
}
//遍历 方法2
Collection<String> coll=map.values();
for(String s:coll){
System.out.println(s);
}
//遍历 方法3---entrySet--返回Set对象:Set<Map.Entry<K,V>>,内部包含了集合中所有的键值对---包含:多个Entry类型的对象
//Set<Map.Entry<K,V>> entrySet;
Set<Map.Entry<Integer,String>> entries=map.entrySet();
System.out.println(entries);
for(Entry<Integer,String>entry:entries){
System.out.println(entry.getKey());
System.out.print("---"+entry.getValue());
System.out.println();
//遍历的时候可以修改值
entry.setValue("456");
}
}
}
2.2 TreeSet
特点:
底层---红黑树;
实现接口--->SortedMap接口--->元素顺序自动排序
线程不安全--->可以通过其他方式解决线程安全问题
接下来,让我们通过一道题来简单的看一看TreeSet。
就像我们刚开始将的一样,多列集合的出现就是为了解决这样的问题。
key--->value
public class Test {
public static void main(String[] args) {
Map<String,Double> tree=new TreeMap<>();
tree.put("香蕉", 5.6);
tree.put("樱桃", 25.0);
tree.put("桃子", 5.6);
tree.put("苹果", 2.3);
//(1)遍历该map集合,并且统计有多少种⽔果(key),⽤两种⽅式进⾏遍历
//key值唯一,所以统计水果数量只需要加一个计数器。
int num1=0;
//遍历一:
Set<String> set=tree.keySet();
for(String str:set){
System.out.print(str+"="+tree.get(str)+" ");
num1++;
}
System.out.println();
System.out.println("水果数量:"+num1);
//遍历二:
//key值唯一,所以统计水果数量等同于长度
Set<Map.Entry<String,Double>> entries=tree.entrySet();
for(java.util.Map.Entry<String, Double> entry:entries){
System.out.print(entry.getKey()+"="+entry.getValue()+" ");
num1++;
}
System.out.println();
System.out.println("水果数量:"+tree.size());
//(2)将“⾹蕉”的价格修改为10.9,并删除桃⼦这组数据,
//修改,用put更新
tree.put("香蕉", 10.9);
//删除
tree.remove("桃子");
//(3)将修改后的map中所有key和value都输出到控制台
//遍历
Set<String> set1=tree.keySet();
for(String str:set1){
System.out.print(str+"="+tree.get(str)+" ");
}
}
}
2.3 LinkedHashMap
---HashMap的子类----多了链表
特点:通过链表记录插入顺序,(存取顺序一致)
三、集合的工具类
---帮助我们操作集合对象,全是静态方法
与此相同的还有常用的数组工具类----Arrays
---同样:帮助我们操作数组,全是静态方法
1.1 Collections
---私有构造方法--不能实例化对象--没有继承,没有实现--父类提供静态方法供外部访问。
注意:
Collections------集合的工具类
Collection-------单列集合的根接口
功能:
---填充,排序,翻转等
fill---填充---使用指定元素替换指定列表中的所有元素
max----返回最大值---单参(自然)--双参(比较器)
min----返回最小值---单参(自然)--双参(比较器)
reverse()---返转集合中的元素
sort()------自然排序
shuffle()---列表置换
addAll(list,1,3,5,7)---添加
三、总结
在面对不同的难题时,我们要如何选择Map实现类?
集合类型 | 核心场景 | 排序方式 |
---|---|---|
HashMap | 一般键值对存储(无序、高效) | 无序 |
TreeMap | 需要按 key 排序的场景(如排行榜) | 自然排序 / 比较器排序 |
LinkedHashMap | 需要保留插入顺序的场景(如日志) | 插入顺序 |
关于集合的讨论:
集合学起来并不算困难,某种意义上说,它也只是一种存储方式罢了,同数组的学习难度差不多,我们需要的是多动手,多练习。
毕竟越简单的东西越高深。
我在这里留下一道题,明天将会在对集合进行讨论时着重讨论这道题,大家可以练习一下。
问题一:
好啦!今天就到这里。