特点:该集合存储键(key)值(value)对,一对一对往里存,而且要保证键(key)的唯一性。

Map集合和Set集合很像,其实Set集合底层就是使用了Map集合。

什么时候使用Map集合:

当数据之间存在映射关系时,优先考虑Map集合。

Map集合常用共有方法

1.添加

V put(K key, V value):将指定的值与此映射中的指定键关联,添加键值对。

void putAll(Map<? extends K,? extends V> m):从指定映射中将所有映射关系复制到此映射中,批量添加键值对。

2.删除

void clear():从此映射中移除所有映射关系,清空所有键值对。

V remove(Object key):如果存在一个键的映射关系,则将其从此映射中移除,删除单个键值对。

3.判断

boolean containsKey(Object key):如果此映射包含指定键的映射关系(是否包含该键),则返回 true。

boolean containsValue(Object value):如果此映射将一个或多个键映射到指定值(是否包含该值),则返回 true。

boolean isEmpty():如果此映射未包含键-值映射关系,该map集合为空,则返回 true。

4.获取

V get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。

int size():返回此映射中的键-值映射关系(键值对)数。

Collection<V> values():返回此映射中包含的值的 Collection 视图(集合)。

重点取出方式:

Set<K> keySet():返回此映射中包含的键的 Set 视图(集合)。

Set<Map.Entry<K,V>> entrySet():返回此映射中包含的映射关系的 Set 视图(集合)。

练习

class MapDemo{public static void main(String[] args){Map<String,String> map=new HashMap<String,String>();// 添加元素,如果出现相同的键,那么后添加的值会覆盖原有键对应值。// put方法会返回被覆盖的值。System.out.println("put:"+map.put("01","zhangsan1"));System.out.println("put:"+map.put("01","wangwu"));map.put("02","zhangsan2");map.put("03","zhangsan3");System.out.println("containsKey:"+map.containsKey("022"));System.out.println("remove:"+map.remove("02"));System.out.println("get:"+map.get("023"));map.put("04",null);  // 一般值不要存储null,没有意义System.out.println("get:"+map.get("04"));// 可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断// 获取map集合中所有的值Collection<String> coll=map.values();System.out.println(coll);System.out.println(map);}
}

Hashtable

底层是哈希表数据结构

特点:不可以存入null键null值,该集合是线程同步的,JDK1.0出现,效率低。

HashMap

底层是哈希表数据结构

特点:允许使用null值和null键,该集合是线程不同步的,JDK1.2出现,效率高。

Map集合的两种取出方式

Map集合的取出原理:将Map集合转成Set集合,再通过迭代器取出。

  1. Set<K> keySet():

将Map集合中所有的键存入到Set集合。因为Set集合具备迭代器,所以可以通过迭代方法取出所有的键,再根据get()方法,获取每一个键对应的值。

2.Set<Map.Entry<K,V>> entrySet():

将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型就是:Map.Entry。

Map.Entry:其实Entry也是一个接口,它是Map接口中的一个内部接口。

interface Map{public static interface Entry{public abstract Object getKey();public abstract Object getValue();}
}class HashMap implements Map{class Hahs implements Map.Entry{public Object getKey(){};public Object getValue(){};}
}

案例

import java.util.*;
class MapDemo2{public static void main(String[] args){Map<String,String> map=new HashMap<String,String>();map.put("02","zhangsan2");map.put("03","zhangsan3");map.put("01","zhangsan1");map.put("04","zhangsan4");/*// 方法一:通过keySet()获取Map集合元素// 先获取Map集合的所有键的Set集合,通过keySet()方法获取到Set<String> keySet=map.keySet();// 有了键的Set集合,就可以获取其迭代器Iterator<String> it=keySet.iterator();while(it.hasNext()){String key=it.next();// 有了键可以通过Map集合的get()方法获取其对应的值String value=map.get(key);System.out.println("Key:"+key+",value:"+value);}*/// 方法二:通过entrySet()获取Map集合元素// 先获取Map集合中的映射关系的Set集合,通过entrySet()方法获取到Set<Map.Entry<String,String>> entrySet=map.entrySet();// 有了键的Set集合,就可以获取其迭代器Iterator<Map.Entry<String,String>> it=entrySet.iterator();while(it.hasNext()){Map.Entry<String,String> me=it.next();// 有了映射关系可以通过映射关系的getKey()和getValue()方法获取其对应的键值String key=me.getKey();String value=me.getValue();System.out.println("Key:"+key+",value:"+value);}}
}

练习

import java.util.*;
/*
目标:
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。思路:
1.描述学生;
2.定义Map容器。将学生(唯一性)作为键,地址作为值,存入;
3.获取Map集合中的元素。
*/
class MapTest{public static void main(String[] args){Map<Student,String> map=new HashMap<Student,String>();map.put(new Student("lisi1",21),"beijing");map.put(new Student("lisi1",21),"tainjin");map.put(new Student("lisi2",22),"shanghai");map.put(new Student("lisi3",23),"nanjing");map.put(new Student("lisi4",24),"jinan");// 第一种取出方式keySetSet<Student> keySet=map.keySet();Iterator<Student> it=keySet.iterator();while(it.hasNext()){Student stu=it.next();String addr=map.get(stu);   sop(stu+"..."+addr);}// 第二种取出方式entrySetSet<Map.Entry<Student,String>> entrySet=map.entrySet();Iterator<Map.Entry<Student,String>> it2=entrySet.iterator();while(it2.hasNext()){Map.Entry<Student,String> me=it2.next();Student stu=me.getKey();String addr=me.getValue();sop(stu+"......"+addr);}}// 打印语句public static void sop(Object obj){System.out.println(obj);}
}// 学生类,保证学生的唯一性
class Student implements Comparable<Student>{ private String name;private int age;public Student(String name,int age){this.name=name;this.age=age;}// 防止该对象往二叉树数据类型集合中存储报异常,应使该对象具备可比性public int compareTo(Student s){int num=new Integer(this.age).compareTo(new Integer(s.age));if(num==0)return this.name.compareTo(s.name);return num;}// 保证学生的唯一性public int hashCode(){return this.name.hashCode()+age*35;}public boolean equals(Object obj){if(!(obj instanceof Student))throw new ClassCastException("类型不匹配!");Student s=(Student)obj;return this.name.equals(s.name) && this.age==s.age;}public String getName(){return name;}public int getAge(){return age;}public String toString(){return name+":"+age;}
}

TreeMap

底层是二叉树(红黑树)数据结构

特点:线程不同步,可以同时给Map集合中的键进行排序。

案例

import java.util.*;
/*
目标:
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。
并且对学生对象大的年龄进行升序排序。思路:
因为数据是以键值对形式存在的,
所以要使用可以排序的Map集合:TreeMap。
1.描述学生;
2.定义Map容器。将学生(唯一性)作为键,地址作为值,存入;
3.获取Map集合中的元素。
*/
class MapTest2{public static void main(String[] args){TreeMap<Student,String> tm=new TreeMap<Student,String>(new StuNameComparator());  tm.put(new Student("lisi1",21),"beijing");tm.put(new Student("blisi3",23),"nanjing");// tm.put(new Student("lisi1",21),"tainjin");tm.put(new Student("alisi4",24),"jinan");tm.put(new Student("lisi2",22),"shanghai");Set<Map.Entry<Student,String>> entrySet=tm.entrySet();Iterator<Map.Entry<Student,String>> it=entrySet.iterator();while(it.hasNext()){Map.Entry<Student,String> me=it.next();Student stu=me.getKey();String addr=me.getValue();sop(stu+"......"+addr);}}// 打印语句public static void sop(Object obj){System.out.println(obj);}
}// 按照学生姓名排序,当对象本身具有比较性,但还需另一种比较,
// 可以定义比较器,在集合初始化时传入比较器,当有两种比较方式时默认按照比较器方法排序
class StuNameComparator implements Comparator<Student>{public int compare(Student s1,Student s2){int num =s1.getName().compareTo(s2.getName());if(num==0)return new Integer(s1.getAge()).compareTo(s2.getAge());return num;}
}// 学生类,保证学生的唯一性
class Student implements Comparable<Student>{ private String name;private int age;public Student(String name,int age){this.name=name;this.age=age;}// 防止该对象往二叉树数据类型集合中存储报异常,应使该对象具备可比性public int compareTo(Student s){int num=new Integer(this.age).compareTo(new Integer(s.age));if(num==0)return this.name.compareTo(s.name);return num;}// 保证学生的唯一性public int hashCode(){return this.name.hashCode()+age*35;}public boolean equals(Object obj){if(!(obj instanceof Student))throw new ClassCastException("类型不匹配!");Student s=(Student)obj;return this.name.equals(s.name) && this.age==s.age;}public String getName(){return name;}public int getAge(){return age;}public String toString(){return name+":"+age;}
}

练习

核心思想原理图

import java.util.*;
/*
目标:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。希望打印结果:
a(1)c(2)……通过结果发现,每一个字母都有对应的次数。
说明字母和次数之间存在映射关系。什么时候使用Map集合:当数据之间存在映射关系时,优先考虑Map集合。思路:
1.将字符串转换成字符数组。因为要对每一个字母进行操作。
2.定义一个Map集合。而且打印结果字母有顺序,所以使用TreeMap集合。
3.遍历字符数组。将每一个字母作为键去查Map集合元素。如果返回null,将该字母和1存入到Map集合中。如果返回不是null,说明该字母在Map集合已经存在并有对应次数(值)。那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到Map集合中。原理:覆盖已有键对应的值。
4.将Map集合中的数据变成指定的字符串形式返回。
*/
class MapTest3{public static void main(String[] args){String s="sdfgzxcv,asdfxcv+df";String result=charCount(s);System.out.println(result);}public static String charCount(String str){char[] chs=str.toCharArray();TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();int count=0;for(int x=0;x<chs.length;x++){// 检查该字符是否为字母,如果不是跳出本次循环if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))continue;Integer value=tm.get(chs[x]);if(value!=null)count = value;count++;tm.put(chs[x],count);count=0;/*// 繁复写法if(value==null){tm.put(chs[x],1);}else{value=value+1;tm.put(chs[x],value);}*/}// System.out.println(tm);StringBuilder sb=new StringBuilder();Set<Map.Entry<Character,Integer>> entrySet=tm.entrySet();Iterator<Map.Entry<Character,Integer>> it=entrySet.iterator();while(it.hasNext()){Map.Entry<Character,Integer> me=it.next();char key=me.getKey();int value=me.getValue();sb.append(key+"("+value+") ");}return sb.toString();}
}

JAVA--Map集合详解相关推荐

  1. Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)

    关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍   Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...

  2. java map集合详解_JAVA干货:Map 集合详解

    java.util.Map集合 Map集合的特点: 1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value) 2.Map集合中的元素,key和value的数据类型可以相同,也可以 ...

  3. Java~Map集合详解

    文章目录 Map介绍 核心Map 内部哈希:哈希映射技术 常用方法 遍历Map Map介绍 java.util中的集合类包含Java中某些最常用的类,其中最常用的集合类就是List和Map. 并且在集 ...

  4. Kotlin 基础——Map集合详解

    Kotlin基础--Map集合详解 一.声明和创建Map集合 二.使用Map的方法 三.遍历Map四种方式 四.可变的Map Kotlin的Map集合用于保存key-value对,其也被分为可变的和不 ...

  5. 集合 (二) ----- Map集合详解

    相关文章: <集合 (一) ----- 集合的基本概念与Collection集合详解> <集合 (二) ----- Map集合详解> 文章目录 Map集合详解 一.Map集合基 ...

  6. java 中map_Java Map集合详解

    Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象.其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素 ...

  7. java的Map集合 详解Map集合

    一.Map集合的特点: Map集合的特点: 1.Map是一个双列集合,一个元素包含两个值(一个key,一个value) 2.Map集合中的元素,key和value的数据类型可以相同,也可以不同 3.M ...

  8. Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    关注微信公众号:CodingTechWork,一起学习进步. Set集合介绍 Set集合的概念   Set集合类似于一个容器,程序把很多对象保存到Set集合中,Set集合对添加顺序不记录,当有重复的对 ...

  9. java常用集合详解

    文章目录 一.常用集合大纲 1.常用集合框架及介绍 2.集合和数组的区别 二.Collection 集合(接口) 三.List集合(接口) 1.存储遍历方式 2.ArrayList(实现类) 3.Li ...

  10. Java Map 接口详解

    软件包:java.util 接口:Map 描述:将键映射到值的对象 一,Map与Collection Collection接口:定义了单列集合规范,集合中的元素是独立存在的,每次存储一个(单个)元素 ...

最新文章

  1. 【C++】复制构造函数
  2. 卷积核的数量是不是越多越好?-分类0,5
  3. 数据可视化项目落地复盘
  4. uGUI知识点剖析之RectTransform
  5. python 人脸轮廓提取_实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你!...
  6. 部署基于tomcat 8 的solrCloud 5.5集群
  7. 信用卡套现只要正常还款,银行是不是睁只眼闭只眼?
  8. zen-coding for notepad++,前端最佳手写代码编辑器
  9. 从零开始学PowerShell(4)数据的选择、排序与格式化
  10. html 自定义标签的作用
  11. 计算机网络存在的漏洞,计算机网络安全漏洞及防范措施
  12. python中数据结构的基本定义
  13. 疯狂java讲义第七章课后习题答案
  14. html5演讲ppt,制作ppt太麻烦?用上这5款黑科技PPT模板,汇报、演讲瞬间高大上
  15. frangi黑森矩阵_消灭黑森臭虫
  16. str_rot13() 函数
  17. 在PC上打开微信页面
  18. SYN Flood攻击
  19. 针对异常java.lang.IllegalStateException onMeasure() did not set the measured dimension解决方法
  20. 算法001-C++从0到1实现链表v1

热门文章

  1. HTML/CSS/Javascript在线代码运行工具(网站汇总)
  2. Flask项目脚手架 -- Flask-Application正式发布
  3. 深入浅出JSBridge:从原理到使用
  4. 数据量过大时数据库操作的处理
  5. 2021年N1叉车司机报名考试及N1叉车司机免费试题
  6. React学习--- JSX的学习
  7. Oracle数据库的数据更新语句与视图操作示例(包含大部分常用语句)
  8. python读txt转array_python将txt文件读入为np.array的具体步骤
  9. html5 白云,html5绘制一朵逼真的白云动画特效
  10. 骁龙660是32位还是64位_骁龙660、670和710谁更强?三款处理器差距在哪里?