从屌丝到架构师的飞越(集合篇)-Map

一.介绍

Map 是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个 Map容器中的键对象不允许重复,这是为了保持查找结果的一致性; 

如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。

当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求,你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。

二.知识点介绍

1、HashMap

2、TreeMap

三.上课对应视频的说明文档

1、HashMap

HashMap也用到了哈希码的算法,以便快速查找一个键,它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。

案例:

public class MapTest {

public static void main(String[] args) {

// Map不同于List,它的key不一定是数字

Map map = new HashMap();

map.put("疯狂Java讲义",109);

map.put("疯狂iOS讲义",10);

map.put("疯狂Ajax讲义",79);

// 如果新的value覆盖了原有的value,该方法返回被覆盖的value

System.out.println(map.put("疯狂iOS讲义",99)); // 输出10

System.out.println(map);

// 判断是否包含指定key

System.out.println("是否包含值为疯狂iOS讲义key:"+map.containsKey("疯狂iOS讲义"));

System.out.println("是否包含值为99 value:"+map.containsValue(99));

// 遍历map

for (Object key : map.keySet()) {

System.out.println(key+"-->"+map.get(key));

}

}

}

(1) 根据键查询值

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

/*

* Map集合的遍历,根据键查询值

*

* 思路:

* A:获取所有的键

* B:遍历键的集合,获取得到每一个键

* C:根据键查询值

* */

public class IntegerDemo {

public static void main(String[] args) {

// TODO Auto-generated method stub

Map<String, String> map = new HashMap<String, String>();

map.put("hello", "world");

map.put("java", "c++");

map.put("sql", "os");

System.out.println(map);

// A:获取所有的键

Set<String> set = map.keySet();

// B:遍历键的集合,获取得到每一个键

for (String key : set) {

// C:根据键查询值

String value = map.get(key);

System.out.println(key + "---" + value);

}

}

}

(2) 根据键值对的对象查询键和值

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

/*

* Map集合的遍历,根据对象查询键和值

*

* 思路:

* A:获取所有的键值对对象的集合

* B:遍历键值对对象的集合,得到每一个键值对的对象

* C:获取键和值

* */

public class IntegerDemo {

public static void main(String[] args) {

// TODO Auto-generated method stub

Map<String, String> map = new HashMap<String, String>();

map.put("hello", "world");

map.put("java", "c++");

map.put("sql", "os");

System.out.println(map);

// A:获取所有的键值对对象的集合

Set<Map.Entry<String, String>> set = map.entrySet();

// B:遍历键值对对象的集合,得到每一个键值对的对象

for (Map.Entry<String, String> me : set) {

// C:获取键和值

String key = me.getKey();

String value = me.getValue();

System.out.println(key + "---" + value);

}

}

}

2、TreeMap

TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。

键和值的关联很简单,用put(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

案例:

public class TestTreeMap

{

public static void main(String[] args)

{

SortedMap<String,String> map=new TreeMap<String,String>();

//插入键值对

map.put("bkey","bvalue");

map.put("dkey","dvalue");

map.put("ckey","cvalue");

map.put("akey","avalue");

//获取键值Set

Set<String> keySet=map.keySet();

//将键值Set转成数组

Object[] keyArray=keySet.toArray();

//按照键值依序获取值对象

for(int i=0; i<keyArray.length; i++)

System.out.println( "key="+(String)keyArray[i]+"; value="+map.get((String)keyArray[i]) );

}

}

案例:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

import java.util.Scanner;

import java.util.Set;

import java.util.TreeMap;

/** 分析:

* A:定义一个字符串(可以改进为键盘录入)

* B:定义一个TreeMap集合

* 键:Character

* 值:Integer

* C:把字符串转换为字符数组

* D:遍历字符数组,得到每一个字符

* E:拿刚才得到的字符作为键到集合中去找值,看返回值

* 是null:说明该键不存在,就把该字符作为键,1作为值存储

* 不是null:说明该键存在,就把值加1,然后重写存储该键和值

* F:定义字符串缓冲区变量

* G:遍历集合,得到键和值,进行按照要求拼接

* H:把字符串缓冲区转换为字符串输出

*/

public class TreeMapDemo {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println("请输入一个字符串:");

String line = sc.nextLine();

// 定义一个TreeMap集合

//  Character 和Char的区别,基本类型和引用类型

TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); 

//把字符串转换为字符数组

char[] chs = line.toCharArray();

for(char ch : chs){

//拿刚才得到的字符作为键到集合中去找值,看返回值

Integer i =  tm.get(ch);

//是null:说明该键不存在,就把该字符作为键,1作为值存储

if(i == null){

tm.put(ch, 1); // 放入map集合中

}else {   

// 不是null:说明该键存在,就把值加1,然后重写存储该键和值

i++;

tm.put(ch,i);

}

}

// 字符串的遍历和拼接

StringBuilder sb=  new StringBuilder();

//遍历集合,得到键和值

Set<Character> set = tm.keySet();

for(Character key : set){

Integer value = tm.get(key);

sb.append(key).append("(").append(value).append(")");

}

String result = sb.toString();

System.out.println("result:"+result);

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • Map 今天的主要内容 Map接口概述 Map集合的两种遍历方式通过键找值keySet通过键值对对象获取键和值涉及...
    须臾之北阅读 255评论 0 0
  • 自定义泛型 1.1、泛型的定义介绍 在集合中,不管是接口还是类,它们在定义的时候类或接口名的后面都使用<标识符>,...
    Villain丶Cc阅读 8,744评论 0 7
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,939评论 0 13
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,259评论 0 16
  • 第十天 权限修饰符 public protected default private 同一类 true true ...
    炙冰阅读 537评论 0 1