集合框架(三)Map

一、集合框架Map的概述

严格看来,Map并不是集合,而是两个集合之间的映射关系(Map接口并没有继承与Collection接口),然而因为Map可以存储数据(每次存储都应该存储A集合中的一个元素(key),B集合中的一个元素(value),习惯的还是把Map称之为集合

其中key集合是一个Set集合,因为key值不能重复,而value集合是一个List集合,元素可以重复

并且把key-value这一键值对称之为Entry

因为Map接口并没有直接继承与Collection接口也没有继承与Iterable接口,所以不能直接对Map使用for-each操作,但是可以分别对key和value集合使用for-each操作

map集合中一些常用的方法
1.增加

put(K key, V value) putAll(Map m) 

2.删除

clear() remove(Object key) 

3.判断

containsKey(Object key) containsValue(Object value) isEmpty()

4.获取

get(Object key)size()values()  entrySet() keySet()

二、Map集合中的特别方法的理解(put,entrySet,keySet)

如以下代码:

package com.huangzhiyao.map;import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;/*** 三个map集合中特别的方法 * 1、put * 新增的用途 * 修改的用途(当容器中已经存在了的key,再次存放,那么会覆盖原有的key所对应的值value)* 调用此方法,可以获取原来的key对应的值 * 开发案例: 平台主播刷排名* * 2、entrySet * 3、keySet * 这两个方法是map集合中所特有的遍历方法* * HashMap是无序的,集合的底层是set集合做的* * HashMap 数据结构 哈希表 * TreeMap 数据结构 二叉树 * 能够进行自然排序以及比较器排序* * map集合是不继承collection接口的 * 这也就意味着它不具备迭代器的方法* * @author Administrator**/
public class MapDemo {public static void main(String[] args) {Map map = new HashMap<>();map.put("quemi", 12);map.put("chage", 23);map.put("yingwa", 33);map.put("lm", 22);map.put("xiaoxi", 42);map.put("dabai", 62);Object old = map.put("lm", 23);System.out.println(old);System.out.println(map);//entrySetSet> entrySet = map.entrySet();for (Entry entry : entrySet) {System.out.println("key:"+entry.getKey() + ",value:"+entry.getValue());}//keySetSet keySet = map.keySet();for (Object key : keySet) {System.out.println("key:" + key + ",value:" + map.get(key));//map.get()根据键得到值}}
} 

运行结果如下:
在这里插入图片描述

三、集合框架Map应用

在JavaSE中,对Map的实现主要包括: HashMap, TreeMap, HashTable 和 LinkedHashMap
下面讲一个关于HashMap、TreeMap的案例

(1)HashMap

package com.huangzhiyao.map;import java.util.Comparator;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeMap;
/**HashMap* 应用一: * 1、将学生作为键,地址作为值进行存储,名字年龄相同则被认定为一个人,最后输出 * 	思路:* 		a、封装学生类* 		b、判重(hashCode/equals)* 		c、打印* 2、最后按年龄进行排序 * 		a、需要让学生类自身具备比较性,实现Comparable接口* 3、需求改变、按姓名进行排序* 		改变的代码是不可取的,我们需要新增个比较器来完成需求* 		实现java.util.comparator* * @author Administrator**/public class HashMapDemo {public static void main(String[] args) {
//		HashMap map = new HashMap<>();TreeMap map = new TreeMap<>(new StuNameComp());map.put(new Student("laomo", 25), "beijing");map.put(new Student("lingsan", 35), "shanghai");map.put(new Student("daxi", 28), "guangzhou");map.put(new Student("zhuangliang", 25), "shenzheng");map.put(new Student("lingsan", 25), "changsha");map.put(new Student("lingsan", 25), "hangzhou");Set keySet = map.keySet();for (Object key : keySet) {System.out.println(key);}}
}class StuNameComp implements Comparator{@Overridepublic int compare(Student o1, Student o2) {int num = o1.getName().compareTo(o2.getName());if (num == 0) {return o1.getAge() - o2.getAge();}return num;}}class Student implements Comparable{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}public Student(String name, int age) {super();this.name = name;this.age = age;}public Student() {super();}@Overridepublic int hashCode() {return this.name.hashCode() + this.age;}@Overridepublic boolean equals(Object obj) {Student stu = (Student) obj;return this.name.equals(stu.name) && this.age == stu.age;}@Overridepublic int compareTo(Student o) {int num = this.age - o.age;if(num == 0) {this.name.compareTo(o.name);}return num;}}

运行结果如下:
在这里插入图片描述
(2)TreeMap

package com.huangzhiyao.map;import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;/*** 统计字符串中字符出现次数* pasjpiahfifjpasjdpoksapdjpadjzpbbaojpajspo* a(?)b(?)...z(?)* 1、分析结果得出结论:我们需要将字符a-z当作键key,将次数作为值value,* 		也就是说我们需要创建一个map集合来做这些事情* * 2、需要将待处理的字符串转成字符数组,以便于获取map集合的key* * 3、如果该字符(a)第一出现的时候,就给a对应key映射值value赋值为1* 		如果说该字符再次出现,那么就是value+1;* * 4、打印出a(7)b(2)...z(1)格式串* 		意味着需要对key进行排序* @author Administrator* /**/ ** 		面试题:*      String,StringBuffer,StringBuilder这三者的区别?* 		String a = new String("abc");* * 		String b = "abc";* 		a+="de";* * 		StringBuffer sb1 = new StringBuffer("abc");* 		StringBuilder sb2 = new StringBuilder("abc");* 		sb1.append("de");* 		sb2.append("de");* * 		StringBuffer与StringBuilder的区别?* 		StringBuffer	同步	安全* 		StringBuilder	异步	不安全* */public class TreeMapDemo {public static void main(String[] args) {String str = "pasjpiahfifjpasjdpoksapdjpadjzpbbaojpajspo";
//		Map map = new HashMap<>();Map map = new TreeMap<>();char[] charArray = str.toCharArray();for (char c : charArray) {Integer obj = map.get(c);if(obj == null) {//之前没有出现过,这是第一次出现			map.put(c, 1);}else {//之前这个字符已经出现过				map.put(c, ++obj);}}StringBuilder sb = new StringBuilder();Set> entrySet = map.entrySet();for (Entry entry : entrySet) {sb.append(entry.getKey()+"("+entry.getValue()+")");}System.out.println(sb);}}

运行结果如下:
在这里插入图片描述
小结:

Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合石线程同步的,jdk1.0,效率低。

HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。将Hashtable替代;jdk1.2,效率高。

TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序。

【注意】

添加元素时,如果键已经在集合中存在,那么后添加的值会覆盖原来的值,并且put方法会将原有的值返回。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章