一、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. WCF配置工具及服务调试工具

      配置工具 C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcConfigEditor.exe WCF调试客户端工具 C:\Program F ...

  2. 详解MemCached原理

    memcached是一个高性能的分布式内存缓存服务器,memcached在Linux上可以通过yum命令安装,这样方便很多,在生产环境下建议用Linux系统,memcached使用libevent这个 ...

  3. Unity3D 游戏开发之内存优化

    项目的性能优化主要围绕CPU.GPU和内存三大方面进行. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大量项目中,90%以上的项目都存在不同程度的内存使用问题.就目 ...

  4. Linux shell tee指令学习

    转载自:http://blog.163.com/xujian900308@126/blog/static/12690761520129911304568/   tee tee:读取标准输入的数据,并将 ...

  5. 《HelloGitHub月刊》第01期

    <HelloGitHub月刊> 因为现在这个项目只有我自己做,只敢叫"月刊",希望有志同道合者,快点加入到这个项目中来!同时,如果您有更好的建议或者意见,欢迎联系我.联 ...

  6. SQL Server技术问题之触发器优缺点

    优点: 1.强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束. 2.跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化. 3.级联运行:侦测数据库内的 ...

  7. 转载:第四弹!全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新!

    感谢大家支持!博卡君周末休息了两天,今天又回到战斗状态了.上周五晚上微信放出官方工具和教程了,推荐程序猿小伙伴们都去试一试,结合教程和代码,写写自己的 demo 也不错. 闲话不多说,开始更新! 第七 ...

  8. mysql根据身份证信息来获取用户属性信息

    需要:根据身份证信息来获取用户属性 方法:可以使用如下sql语句: ) ' then '北京市' ' then '天津市' ' then '河北省' ' then '山西省' ' then '内蒙古自 ...

  9. android 获取当前位置

    1. Android开发位置感知应用程序方式:1. GPS 定位     精确度高,仅适用于户外,严重消耗电量.如果手机内置GPS接受模块,即使手机处于信号盲区,依然可以获取位置信息. 2. NETW ...

  10. 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix

    Tom and matrix Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...