Map
用来描述数学中的映射关系:
存在两个集合A,B,在f条件下,对于A中的每个元素,在B中都能找到唯一确定对的元素与其相对应。
f: A->B
Map简介
严格上来说,Map没有继承Collection接口,并不是集合。Map仅仅表示A,B之间的关系,由于其能存储数据,所以习惯性的称其为集合。
Map接口的关系图
Map的key-value
每次向Map中存储数据时,都应该同时存储两个数据key和value。
key一般使用不可改变的量String类型。
Map的实现类
HashMap,LinkedHashMap,TreeMap
三个常用的类,后面会重点介绍。
HashMap:哈希算法,链表结构,在java8里,当一个哈希值所对应的value达到一定值时,会从链表变为红黑树。
LinkedHashMap:链表和哈希算法
TreeMap:红黑树算法
Hashtable
HashMap的前身,是线程安全的。不允许对象为Null,在HashMap中允许对象为null。由于Hashtable性能极低,现在已经使用。
Properties
key和value只能是String.
是一个比较重要的类,在IO问题用的比较多,加载资源文件。
Map实例
给出一个字符串,计算出每个字母出现的次数
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class HashMapDemo {
/*
* 需求:
*计算出str字符串中每个字母出现的次数。
**/
public static void main(String[] args) {
String str="vjofnkjcvnxaoixlalaaaoiovg";
//先将字符串转化为字符数组的形式,方便对其进行迭代
//方法:使用String类中的方法toCharArray();
char[] c=str.toCharArray();
//由于需要存储两个数据,所以选用Map
//——如果想要有序可以用TreeMap
Map<Character,Integer> map=new HashMap<>();
for (char key : c) {
Integer value=map.get(key);
//map里面有Key,则令其Value++,否则置value为1;
if(map.containsKey(key)){
map.put(key, value+1);
}
else{
map.put(key, 1);
}
}
System.out.println(map);
}
}
//输出:{a=5, c=1, v=3, f=1, g=1, x=2, i=2, j=2, k=1, l=2, n=2, o=4}
Set,List,Map之间的转换
一般很少用到转换,在一开始选择的时候尽量选择正确的集合
List->Set:使用构造器
Set< String> set=new HashSet<>(list);
//此时会消除list中重复的元素
Set->List:使用构造器
List< String> list=new ArrayList<>(set);
//此时set中消除的重复的元素不会再恢复
Map不能直接与List和Set相互转换,但是可以利用Map中的方法进行间接转换
总结
Map 的应用很广泛
与JavaBean对象 的转换和做缓存(工具箱)。
javaBean对象:多对属性名=属性值(ps:不是字段名)。
Set,List,Map在有些情况下并不是单独使用的,偶尔会综合使用(集合也是对象),所以可以嵌套使用。
实例:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
/*
* Set 班级
Map 学院
List 学校
*/
//班级1 的学生
Set<String> name1=new HashSet<>();
name1.add("tom");
name1.add("mary");
name1.add("aliy");
//班级12的学生
Set<String> name2=new HashSet<>();
name2.add("jery");
name2.add("will");
name2.add("slina");
//学院A
Map<String,Set<String>> class1=new HashMap<>();
class1.put("小班", name1);
class1.put("大班", name2);
//学院B
Map<String,Set<String>> class2=new HashMap<>();
class2.put("小班", name1);
class2.put("大班", name2);
//学校
List<Map<String,Set<String>>> school=new ArrayList<>();
school.add(class1);
school.add(class2);
System.out.println(school);
/*[{小班=[tom, aliy, mary], 大班=[jery, slina, will]},
{小班=[tom, aliy, mary], 大班=[jery, slina, will]}]
*/
}
}