Java:Map
接口Map<K,V>,K – 映射所维护的键的类型;V – 映射值的类型。
public interface Map<K,V>,将键映射到值的对象。一个映射不能包括重复的键;每个键只能映射到一个值。(一对一)
方法:
1. 添加
V put(K key, V value);Put方法返回键对应原来的值,并且对同一个键使用了两次或者多次put方法,则新的值替换旧的值。
void putAll(Map<? Extends K, ? Extends V> m)
2. 删除
void clear();
V remove(Object key)
3. 判断
a) boolean containsKey(Object key)
b) boolean containsValue(Object value)
c) boolean equals(Object o)
d) boolean isEmpty()
4. 获取
V get(Object key);通过键获取值
Int size()
V values()
Set<Map.Entry<K,V>> entrySet()
Set<K> keyset()
Map的三个子接口:Hashtable HashMap TreeMap:
Hashtable:底层是哈希表数据结构,不可以存入null键null值。线程同步的。
HashMap: 基于哈希表的Map子接口。允许使用null键和null值,该集合是线程非同的。
TreeMap: 底层是二叉树数据接口,线程不同步。可以用于给Map集合中的键进行排序。
Set集合底层其实就是用了Map集合。
Map集合的两种取出方式:
1. keyset:将Map中所有的键存入到Set集合,因为Set集合具备迭代器,所以可以通过迭代方式取出所有的键,获取每一个键对应的值。
package Day16;
import java.util.*;
public class MapDemo1 {
public static void main(String[] args){
Map<String,String> map = new HashMap<String,String>();
//添加
map.put("01","zhangsan");
map.put("02","lisi");
map.put("03","wangwu");
// System.out.println("ContainsKe y:"+map.containsKey("02"));
//System.out.println("Remove:"+map.remove("022"));//删除
//System.out.println("Remove:"+map.remove("02"));//删除
//System.out.println("Get:"+map.get("02"));//获取
// Collection<String> coll = map.values();
// System.out.println(coll);
//先获取map集合的所有键的Set集合,keySet();
Set<String> keySet = map.keySet();
//有了set集合,即可以获取迭代器取出所有键
for (Iterator<String> it = keySet.iterator();it.hasNext();){
//System.out.print("key:"+it.next()+",");
//有了键就可以通过map集合的get方法获取其对应的值
System.out.println("vaule:"+map.get(it.next()));
}
}
}
2. Set<Map.Entry<K,V>> entrySet:将Map集合中的映射关系存到Set集合中,而这个关系的数据类型就是:Map.Entry
package Day16;
import java.util.*;
public class EntryMap {
public static void main(String[] args){
Map<String,String> map = new HashMap<String,String>();
map.put("01","zhangsan");
map.put("03","wangwu");
map.put("04","zhaoliu");
map.put("02","lisi");
//将Map集合中的映射关系取出,存入到Set集合中。
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
while (it.hasNext()){
Map.Entry<String,String> me = it.next();
String key = me.getKey();//Entry中的方法
String value = me.getValue();//Entry中的方法
System.out.println("Key:"+key+",Value:"+value);
}
}
}
Map.Entry其实Entry也是一个接口,他是Map接口的一个内部接口。
练习一:
/*
* 练习:
1,描述学生
2,定义Map容易,将学生作为键,地址作为值存入
3,获取map集合中的元素
*/
package Day16;
import java.util.*;
public class MapTest {
public static void main(String[] args){
HashMap<Student,String> hm = new HashMap<Student,String>();
hm.put(new Student("张三",19),"北京" );
hm.put(new Student("李四",18),"天津" );
hm.put(new Student("王武",25),"上海" );
hm.put(new Student("王武",25),"武汉" );//因为键唯一,所以武汉会覆盖之前的上海 //第一种取出方式 可以Set
System.out.println("=======使用Set取出======");
Iterator<Student> it = hm.keySet().iterator();
while (it.hasNext())
{
Student s = it.next();
String addr = hm.get(s);
System.out.println(s+"..."+addr);
}
//第二种取出方式entrySet
System.out.println("=======使用entrySet取出======");
Iterator<Map.Entry<Student,String>> iter = hm.entrySet().iterator();
while(iter.hasNext())
{
Map.Entry<Student,String> me = iter.next();
Student s = me.getKey();
String addr = me.getValue();
System.out.println(s+"---"+addr);
}
}
}
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
@Override
public String toString()
{
return name+":"+age;
}
@Override
public int hashCode()
{
return name.hashCode()+age*12;
}
@Override
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;
}
@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;
}
}
运行结果:
=======使用Set取出======
张三:19...北京
李四:18...天津
王武:25...武汉
=======使用entrySet取出======
张三:19---北京
李四:18---天津
王武:25---武汉
当数据之间存在映射关系时,就要先想到Map集合。
/*
* 练习二:
“sdfgzxcvasdfxcvdf”获取该字符串中的字母出现的次数
希望打印结果:a(1)c(2)...
通过结果发现每个字母都有对应的次数,说明字母和次数之间都有映射关系。
思路:
1,将字符串转换成字符数组,因为要对每一个字母进行操作
2,定义MAP集合,因为打印结果的字母是有顺序的,所以使用TreeMap集合
3,遍历字符数组将每一个字母作为键去查Map集合,如果返回null将该字母和1存入到Map集合中;如果返回不是空则说明该字母在Map集合内已经存在并有对应的次数,那么该次数自增后覆盖存入;
4,将Map集合中的数据变成指定的字符串形式返回 */
package Day16;
import java.util.*;
public class MapTest2 {
public static void main(String[] args){
String s = charCount("sdfgzxcvasdfxcvdf");
System.out.println(s);
}
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;
}
//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();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}
运行结果:
a(1)c(2)d(3)f(3)g(1)s(2)v(2)x(2)z(1)
Java:Map的更多相关文章
- Java:Map总结
概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...
- Java 集合深入理解(14):Map 概述
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...
- Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值
package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...
- Android(java)学习笔记104:Map集合的遍历之键找值
package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...
- Android(java)学习笔记103:Map集合的获取功能
package cn.itcast_01; import java.util.Collection; import java.util.HashMap; import java.util.Map; i ...
- Android(java)学习笔记102:Map集合功能概述
下面通过代码引入Map集合:如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生来说,是 ...
- Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述
1. LinkedHashMap类的概述 LinkedHashMap:Map接口的哈希表(保证唯一性) 和 链接(保证有序性)列表实现,具有可预知的迭代顺序. 2. 代码示例: package cn. ...
- Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMap<String,Student>)的案例
1. HashMap集合(HashMap<String,Student>)的案例 HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap的 ...
- Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值
1. Map集合的遍历(键值对对象找键和值) Map -- 夫妻对 思路: A: 获取所有结婚证的集合 B: 遍历结婚证的集合,得到每一个结婚证 C: 根据结婚证获取丈夫和妻子 转换: A: ...
随机推荐
- Ubuntu 16.04 nvidia安装
Ubuntu更新完NVIDIA驱动后,重启电脑进入不了系统,一直处于登录界面.后来重启电脑时发现我进入不了系统了,输入我的登录密码会发现屏幕一闪,然后又重新跳回到登录界面,就是进入了login loo ...
- 《zw版·Halcon-delphi系列原创教程》 只有2行代码的超市收款单ocr脚本
<zw版·Halcon-delphi系列原创教程> 只有2行代码的超市收款单ocr脚本只有2行代码的超市收款单ocr脚本 发了这么多教程,有网友问,为什么没有ocr的. 的确,在 ...
- js 的闭包
今天看了关于js闭包方面的文章,还是有些云里雾里,对于一个菜鸟来说,学习闭包确实有一定的难度,不说别的,能够在网上找到一篇优秀的是那样的不易. 当然之所以闭包难理解,个人觉得是基础知识掌握的不牢,因为 ...
- :first-child 类似的 :first 匹配第一个元素,但是:first-child选择器可以匹配多个:即为每个父级元素匹配第一个子元素。这相当于:nth-child(1)
描述: 在每个 ul 中查找第一个 li HTML 代码: <ul> <li>John</li> <li>Karl</li> <li& ...
- Sprint第二个冲刺(第八天)
一.Sprint介绍 任务进度: 二.Sprint周期 看板: 燃尽图:
- IOS new Date() 时间转换失败问题以及其他问题
一: ios下必须标准格式用'/'分割格式 转换没问题: new Date('2016/5/30 12:15:20') 二:ie9兼容模式以及以下ie版本 console用前需判断 if(windo ...
- oracle 卸载
由于工作需要,重装了一下Oracle,然后发现同SQLServer,MySQL等数据库相比,Oracle的卸载重装真是不一般的麻烦. 整理了一下我的Oracle的卸载重装过程,给自己备忘,同时 ...
- SDUTOJ 3312
题目描述 给出一个n*n的矩阵,矩阵中只有0和1,现在有两种操作: 1 x y 将第x行第y列的数字改变(0变1,1变0) 2 x1 y1 x2 y2求由左上角(x1,y1)到右下角(x2,y2)组成 ...
- noi 8787 数的划分
题目链接:http://noi.openjudge.cn/ch0206/8787/ 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 简直跟分苹果一模一样. #include < ...
- noi 4982 踩方格
题目链接:http://noi.openjudge.cn/ch0206/4982/ 深搜很好写. DP:O(n) d[i] 为走 I 不的方案数, l[i],r[i],u[i]为第一步走 左,右,上, ...