一、Map简述

1.1、简述

public interface Map<K,V>
类型参数:
K - 此映射所维护的键的类型 key
V - 映射值的类型 value
该集合提供键--值的映射。key不能重复,一对对的存储方式

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

1.2、方法

嵌套类摘要
static interface Map.Entry<K,V>
映射项(键-值对)。

方法摘要
void clear()

从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key)

如果此映射包含指定键的映射关系,则返回 true
boolean containsValue(Object value)

如果此映射将一个或多个键映射到指定值,则返回 true
Set<Map.Entry<K,V>> entrySet()

返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o)

比较指定的对象与此映射是否相等。
V get(Object key)

返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
int hashCode()

返回此映射的哈希码值。
boolean isEmpty()

如果此映射未包含键-值映射关系,则返回 true
Set<K> keySet()

返回此映射中包含的键的 Set 视图。
V put(K key, V value)

将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m)

从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key)

如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size()

返回此映射中的键-值映射关系数。
Collection<V> values()

返回此映射中包含的值的 Collection
视图。

 1.3、常用子类

HashTable:底层是哈希表,不可以存入Null键Null值,线程是同步的JDK1.0效率低

HashMap:基于哈希表数据结构。允许使用Null键Null值,但只有一个Null键,线程非同步的。JDK1.2效率高

TreeMap:二叉树,线程不同步。可以用于给Map集中的key键进行排序。

和Sety集合很像,Set底层就是Map集合。

1.4、Put

添加元素,添加相同的键,那么后添加的值会覆盖的Vaule,put方法会返回被覆盖的值。

二、HashMap

2.1、常用方法

package com.pb.map.demo1;

import java.util.HashMap;
import java.util.Map; public class MapDemo1 { public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
//添加
map.put("01", "zhangsan");
System.out.println(map.put("01", "lisi002"));//zhangsan
map.put("02", "wangwu03");
map.put("03", "wangwu04");
map.put(null, "ffff");
map.put("04", "qqquqq");
//判断有没有key
System.out.println(map.containsKey("02"));//true
//判断 有这有 这个value
System.out.println(map.containsValue("ffff"));//true
//获取
System.out.println(map.get("03"));//wangwu04
System.out.println(map.get(null));//ffff
System.out.println(map.get("fdsfdsf"));//null
System.out.println(map.remove("02"));//返回value的值
System.out.println(map.remove("0fdsfd"));//没有就返回null
System.out.println(map);//{null=ffff, 01=lisi002, 03=wangwu04, 04=qqquqq} 是无序的
} }

2.2、key和values

keySet:将map中所有的键 存入到Set集合。因为set具备迭代器。返回为set集合

可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值。

package com.pb.map.demo1;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; public class MapDemo2 { public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
//添加
map.put("09", "zhaoliu");
map.put("01", "zhangsan");
map.put("02", "wangwu03");
map.put("03", "wangwu04");
map.put("04", "qqquqq");
//获取map集合中的所有键的集合
Set<String> keySet=map.keySet();
//迭代所有键来获取值
Iterator<String> iterator=keySet.iterator();
while(iterator.hasNext()){
String key=iterator.next();
//通过map.get(键)的方式来获取值
System.out.println(key+".........."+map.get(key));
}
} }

entrySet:返回为Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系存入到Set 集合中,而这个关系的数据类型就是Map.Entry

Map.entrySet()

方法摘要
boolean equals(Object o)
比较指定对象与此项的相等性。
K getKey()

返回与此项对应的键。
V getValue()

返回与此项对应的值。
int hashCode()

返回此映射项的哈希码值。
V setValue(V value)

用指定的值替换与此项对应的值(可选操作)。
package com.pb.map.demo2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; /**
* 学生属性:姓名,年龄
* 注意姓名和年龄相同的视为同一个学生
* 1.描述学生
* 2.定义map容器,将学生做为键,地址作为值、值入
* 3.获取map集合的元素
*/ //学生类
class Student implements Comparable<Student>{
private String name;
private int age; //让对象本身具备比较性
@Override
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;
} /*
* 重写hash
*/
@Override
public int hashCode(){
return name.hashCode()+age*33;
}
/*
* 重写equals
*/
@Override
public boolean equals(Object obj){
if(!(obj instanceof Student)){
throw new ClassCastException("类型不匹配");
}
Student stu=(Student)obj;
return this.name.equals(stu.name)&&this.age==stu.age; } public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = 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;
}
public void show(){
System.out.println(this.name+"...."+this.age);
} }
public class MapTest { public static void main(String[] args) {
Map<Student,String> map=new HashMap<Student,String>();
map.put(new Student("lisi01",21), "北京");
map.put(new Student("lisi01",21), "上海");//覆盖第一个值
map.put(new Student("lisi02",23), "深圳");
map.put(new Student("lisi04",22), "武汉");
map.put(new Student("lisi03",24), "天津");
System.out.println("======keySet方法======");
//第一种遍历方式
Set<Student> keySet=map.keySet();
Iterator<Student> it=keySet.iterator();
while(it.hasNext()){
Student stu=it.next();
String add=map.get(stu);
System.out.println(stu.getName()+"..."+stu.getAge()+"...."+add);
}
System.out.println("======entrySet方法======");
//第二种遍历方式
Set<Map.Entry<Student, String>> entrySet=map.entrySet();
Iterator<Map.Entry<Student, String>> iter=entrySet.iterator();
while(iter.hasNext()){
Map.Entry<Student, String> student=iter.next();
Student stu=student.getKey();
String add=student.getValue();
System.out.println(stu.getName()+"..."+stu.getAge()+"...."+add);
}
} }
======keySet方法======
lisi01...21....上海
lisi02...23....深圳
lisi04...22....武汉
lisi03...24....天津
======entrySet方法======
lisi01...21....上海
lisi02...23....深圳
lisi04...22....武汉
lisi03...24....天津

三、TreeMap

3.1、TreeMap排序

package com.pb.map.demo2;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap; /**
* 学生属性:姓名,年龄
* 注意姓名和年龄相同的视为同一个学生
* 1.描述学生
* 2.定义map容器,将学生做为键,地址作为值、值入,
* 3.对学生排序按姓名排序
* 3.获取map集合的元素
*
*/ //学生类
class Student implements Comparable<Student>{
private String name;
private int age; //让对象本身具备比较性
@Override
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;
} /*
* 重写hash
*/
@Override
public int hashCode(){
return name.hashCode()+age*33;
}
/*
* 重写equals
*/
@Override
public boolean equals(Object obj){
if(!(obj instanceof Student)){
throw new ClassCastException("类型不匹配");
}
Student stu=(Student)obj;
return this.name.equals(stu.name)&&this.age==stu.age; } public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = 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;
}
public void show(){
System.out.println(this.name+"...."+this.age);
} }
public class MapTest { public static void main(String[] args) {
TreeMap<Student,String> map=new TreeMap<Student,String>(new StudentNameCom()); map.put(new Student("lisi01",21), "上海");//覆盖第一个值
map.put(new Student("lisi02",23), "深圳");
map.put(new Student("a",56), "北京");
map.put(new Student("lisi04",22), "武汉");
map.put(new Student("lisi03",24), "天津");
map.put(new Student("a",33), "北京");
map.put(new Student("lisi01",21), "北京");
System.out.println("======keySet方法======");
//第一种遍历方式
Set<Student> keySet=map.keySet();
Iterator<Student> it=keySet.iterator();
while(it.hasNext()){
Student stu=it.next();
String add=map.get(stu);
System.out.println(stu.getName()+"..."+stu.getAge()+"...."+add);
}
System.out.println("======entrySet方法======");
//第二种遍历方式
Set<Map.Entry<Student, String>> entrySet=map.entrySet();
Iterator<Map.Entry<Student, String>> iter=entrySet.iterator();
while(iter.hasNext()){
Map.Entry<Student, String> student=iter.next();
Student stu=student.getKey();
String add=student.getValue();
System.out.println(stu.getName()+"..."+stu.getAge()+"...."+add);
}
} }
class StudentNameCom implements Comparator<Student>{ @Override
public int compare(Student stu1, Student stu2) {
int num=stu1.getName().compareTo(stu2.getName());
if(num==0){
return new Integer(stu1.getAge()).compareTo(new Integer(stu2.getAge()));
}
return num;
} }

四、TreeMap使用

4.1、示例

package com.pb.map.demo2;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap; /*
* "sdfgzxcvasdfxcvdf"获取该字符串中的字母出次数
* 1.使用map集合映射
* 2.将字符中的字母做KEY,次数做value
*/
public class MapTest2 { public static void main(String[] args) {
String str = "sdfgzxcvasdfxcvdf";
TreeMap<String, Integer> map = getCount(str);
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String s = it.next();
Integer count = map.get(s);
System.out.println(s + "...." + count);
} String tmp = getCount2(str);
System.out.println(tmp);
} // 第一种
public static TreeMap<String, Integer> getCount(String str) {
TreeMap<String, Integer> map = new TreeMap<String, Integer>(); for (int x = 0; x < str.length(); x++) {
Set<String> keys = map.keySet();
String s = str.substring(x, x + 1);
if (keys.contains(s)) {
Integer count = map.get(s);
map.put(s, count + 1);
} else {
map.put(s, 1);
}
} return map;
} // 第二种
public static String getCount2(String str){
//转换为字符数组
char[] chs=str.toCharArray();
//定义TreeMap容器来存放
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;
}
//声明变长sb对象
StringBuilder sb=new StringBuilder();
//获取Map.Entry对象
Set<Map.Entry<Character, Integer>> entrySet=tm.entrySet();
Iterator<Map.Entry<Character, Integer>> it=entrySet.iterator();
//遍历添加
while(it.hasNext()){
Map.Entry<Character, Integer> m=it.next();
Character c=m.getKey();
Integer value=m.getValue();
sb.append(c+"("+value+")");
}
return sb.toString(); }
}

结果:

a....1
c....2
d....3
f....3
g....1
s....2
v....2
x....2
z....1
a(1)c(2)d(3)f(3)g(1)s(2)v(2)x(2)z(1)

五、Map扩展

5.1、Map中嵌套Map或者集合

package com.pb.map.demo3;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator; class Person{
private String name;
private int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = 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;
} }
public class MapTest1 { public static void main(String[] args) { HashMap<String,ArrayList<Person>> map=new HashMap<String,ArrayList<Person>>(); ArrayList<Person> persons1=new ArrayList<Person>();
persons1.add(new Person("张三",33));
persons1.add(new Person("李四",33));
persons1.add(new Person("王五",33));
ArrayList<Person> persons2=new ArrayList<Person>();
persons2.add(new Person("赵六",33));
persons2.add(new Person("钱七",33));
persons2.add(new Person("刘八",33)); map.put("SB001", persons1);
map.put("SB002", persons2); Iterator<String> it=map.keySet().iterator();
while(it.hasNext()){
String room=it.next();
System.out.println(room);
ArrayList<Person> p=map.get(room);
getInfos(p);
} } public static void getInfos(ArrayList<Person> list){
Iterator<Person> it=list.iterator();
while(it.hasNext()){
Person p=it.next();
System.out.println(p.getName()+"..."+p.getAge());
}
} }
//结果 SB001
张三...33
李四...33
王五...33
SB002
赵六...33
钱七...33
刘八...33

JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API的更多相关文章

  1. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  2. Map容器——TreeMap及常用API,Comparator和Comparable接口

    TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap), ...

  3. Java(28)集合三Map

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228436.html 博客主页:https://www.cnblogs.com/testero ...

  4. java基础学习总结五(递归算法、冒泡排序、查看生成API)

    一:递归算法 概念:自己调用自己的方法 示例代码如下: @Test /** * 递归求和 * 5+4+3+2+1=15 */ public void getSum() { long sum = sum ...

  5. JAVA基础学习day21--IO流三-File、Properties、PrintWriter与合并、分割流

    一.File 1.1.File概述 文件和目录路径名的抽象表示形式. 用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录.此类呈现分层路径名的一个抽象的.与系统无关的视图.抽象路径名 有 ...

  6. Java基础学习笔记(三)

    18.2.1无参无返回值的方法 18.2.1.1定义方法的语法格式 public static void 方法名称(){ 方法体 } 方法调用 类名.方法名称(); 注意:在Java中,同一个类中的方 ...

  7. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  8. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  9. Java基础学习总结(88)——线程创建与终止、互斥、通信、本地变量

    线程创建与终止 线程创建 Thread类与 Runnable 接口的关系 public interface Runnable {         public abstract void run(); ...

随机推荐

  1. imagepng或imagejpeg浏览器无显示问题

    可以先参考这篇文章,检查一下php的文件编码是否有bom 然而我并不是这个问题,后来想到或许是输出缓冲中有其它内容, 于是尝试 ob_clean();$imagepng($im);或//imagejp ...

  2. 使用Html5+C#+微信 开发移动端游戏详细教程:(六)游戏界面布局与性能优化

    本篇教程我们主要讲解在游戏界面上的布局一般遵循哪些原则和一些性能优化的通用方法. 接着教程(五),我们通过Loading类一次性加载了全部图像素材,现在要把我们所用到的素材变成图片对象显示在界面上,由 ...

  3. 客户端请求、服务器响应及其HTTP状态码

    一JSP客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信 息头的一部分来传送的.我们可以查阅HTTP协议来获得更多的信息. 下表列出了浏 ...

  4. Mysql学习笔记(六)增删改查

    PS:数据库最基本的操作就是增删改查了... 学习内容: 数据库的增删改查 1.增...其实就是向数据库中插入数据.. 插入语句 insert into table_name values(" ...

  5. java:[1,1] 需要class, interface或enum

    状态: cmd编译.java文件时报异常:java:[1,1] 需要class, interface或enum异常原因: 主要原因是java文件的编码问题. 在中文操作系统中,使用一贯的"j ...

  6. List<?>和List<T>的区别?

    出自:https://www.zhihu.com/question/31429113

  7. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  8. 解决Cannot change version of project facet Dynamic Web M

    dynamic web module 版本之间的区别: Servlet 3.0 December 2009 JavaEE 6, JavaSE 6 Pluggability, Ease of devel ...

  9. 泛函编程(7)-数据结构-List-折叠算法

    折叠算法是List的典型算法.通过折叠算法可以实现众多函数组合(function composition).所以折叠算法也是泛函编程里的基本组件(function combinator).了解折叠算法 ...

  10. Unsupervised Classification - Sprawl Classification Algorithm

    Idea Points (data) in same cluster are near each others, or are connected by each others. So: For a ...