Java集合框架之Map

1      Map集合N016

1.1    Map接口

•    实现Map接口的集合类用来存储"键-值"映射对。

•    JDK API中Map接口的实现类常用的有

–  HashMap

–  TreeMap

–  Hashtable (不常用)

•Map实现类中存储的"键-值"映射对是通过键来唯一标识,Map底层的"键"是用Set来存放的。

•所以存入HashMap中的映射对的"键"如果是自定义的类,应该重写hashCode()和equals()方法。

–常用String作为Map的"键"。

Map接口中定义的一些常用方法:

V   put(K key, Vvalue)//将指定的"键-值"对存入Map中

V  get(Object key);//返回指定键所映射的值

V   remove(Objectkey);//根据指定的键把此"键-值"对从Map中移除。

boolean containsKey(Object key);//判断此Map是否包含指定键的"键-值"对。

boolean containsValue(Object value);//判断此Map是否包含指定值的"键-值"对。

boolean  isEmpty();//判断此Map中是否有元素。

int  size();//获得些Map中"键-值"对的数量。

void  clear();//清空Map中的所有"键-值"对。

Set keySet();//返回此Map中包含的键的Set集。

Collection values();//返回此Map中包含的值的Collection集。值是可重复的.

HashMap:

HashMap内部对"键"用Set进行散列存放。所以根据"键"去取"值"的效率很高。

它是使用频率最高的一个集合。

补充:封装类对象的hashCode()

Hashtable与HashMap的不同(笔试常考)

Hashtable是JDK1.0就有了, HashMap是JDK1.2引入的,操作大多跟Hashtable相同,建议使用HashMap.

Hashtable (注意大小写)

是同步的(线程安全的);

不能有null键,也不能有null值,否则运行时出空指针异常;

基于陈旧的Dictionary类 ,有contains() 方法,用于测试此映射表中是否存在指定值,等同于HashMap类中的containsValue()(本类中也有)

HashMap

是不同步的(线程非安全的);

能存储最多一个null键,任意多个null值;

有containsKey(),containsValue()方法,没有contains() 方法

继承AbstractMap

TreeMap:

TreeMap内部使用红黑树结构对"key"进行排序存放,所以放入TreeMap中的"key-value"对的"key"必须是"可排序"的。

TreeMap()使用键的自然顺序构造一个新的、空的树映射。

TreeMap(Comparator  comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。

Map.Entry接口:

Map.Entry是Map中内部定义的一个static接口,专门用来保存keyvalue的内容。

Map接口输出:

对于Map接口来说,其本身是不能直接使用迭代进行输出的,因为Map中的每一个位置存放的是一对值(keyvalue),而Iterator中每次只能找到一个值。所以如果非要使用迭代进行输出的话,要按照以下操作步骤完成:

1.将Map的实例通过entrySet()方法变为Set接口对象

2.通过Set接口的实例的iterator()将Iterator实例化

3.通过Iterator迭代输出,每个内容都是Map.Entry的对象

4.通过Map.Entry进行keyvalue的分离。getKey,getValue

Map大多时候用于存放和查找,遍历输出属于少数操作。

Set> set= map.entrySet();

Iterator>it = set.iterator();

while(it.hasNext()){

Entry entry = it.next();

Studentkey = entry.getKey();

Stringvalue = entry.getValue();

}

选择适合的集合:

选择标准:

存放要求

无序,无下标,不能随机访问-Set

有序,有下标,可以随机访问-List

不可重复--Set

可重复--List

"key-value"对,较多存放和查询,较少遍历-Map

读和改(插入删除)的效率

Hash*-两者都最高

ArrayList-读(指定下标随机访问)快,插入/删除元素慢

LinkedList-读(指定下标随机访问)慢,插入/删除元素快

1.2    总结:

•Collection接口

•Iterator接口

•Comparable接口(自然顺序比较,TreeSet,TreeMap)、Comparator接口(自定义比较器, TreeSet,TreeMap)

•Set、List、Map接口

•Collections类

•ArrayList、LinkedList、Vector类

•HashSet、LinkedHashSet、TreeSet类

•HashMap、Hashtable、TreeMap类

•集合的泛型操作(JDK5.0)

•用增强的for循环(JDK5.0)遍历Collection

集合框架:保存对象

问:集合框架和数组的区别?

1、集合框架的大小是可变的,而数组的大小是固定的

2、集合框架只能存储引用数据类型(对象),而数组能够存储引用数据类型,也能存储基本数据类型

问:集合框架能否保存基本数据类型

不能,但是可以保存基本数据类型的数值,在保存的时候会自动装箱成对应包装类(JDK1.5)

Collection :单列集合

|--List接口:有序(存取迭代的顺序),元素可重复

|--ArrayList

|--LinkedList

|--Vector(线程同步的)

|--Set接口:无序,元素不可重复

|--HashSet

|--TreeSet

Map接口:双列集合(Key-Value)

|--HashMap

|--TreeMap

|--Hashtable(线程同步的)

总结:

1、如果存储的数据不多,我们习惯List使用ArrayList,Set使用HashSet,Map使用HashMap

2、如果没有用到类中的特有方法,那么在定义引用类型的时候一般使用接口类型,以便于增强代码的扩展性和后期的维护性

1.3    Map映射对

Map 映射对,里面存放的是一对对的元素,以键值对形式存在

键key

值value

Map是一个接口,有一个重要的实现类:

HashMap

重要方法:

put(K key,V value)放入键值对,键的类型为K,值的类型为V

比如:定义创建HashMap,它的put方法就变为

put(Stringkey,Integer value)键的类型是String,值为Integer

V get(K key)根据键拿出值,键类型为K,返回的值的类型为V,如果根本不包含这个键,就返回null

比如:定义创建HashMap,它的get方法就变为

Integer get(Stringkey)

如果已经存在某个键,又put了进去相同键的键值对,那么后加入的值会覆盖之前的值,可以这么说,Map中键值对的键是不可重复的,如果存入相同的键,后面的值后覆盖前面的值。

size()返回大小,或者说键值对个数

1.4    遍历HashMap

遍历HashMap?

entrySet()返回一个Set,Entry封装了键和值,遍历这个Set就能遍历所有的键值对了

(HashTable和HashMap用法、特性差不多,但是键和值不可以是null,是线程安全;HashMap的键值可以是null,并且线程不安全)

(Set的元素可以是null、List的元素也可以是null)

HashSet内部的实现是一个HashMap

HashMap中封装了Entry的数组

1.5    TreeMap

以树作为具体实现的方式的Map

它的元素必须可比较,或者给这个TreeSet传入一个比较器对象作为比较逻辑,排序和比较都是针对键,值不管

1、键实现Comparable接口

2、通过构造方法传入一个Comparator的实现类对象

方法和HashMap差不多

put(K key,V value)放入键值对

V get(K key)根据键拿出值

entrySet()返回一个Entry元素的Set对象,用来遍历这个Map

TreeSet中封装了TreeMap

TreeMap封装了二叉树(红黑树,解决普通二叉树不平衡的缺点)

1.6    LinkedHashMap

LinkedHashMap 使用Hash表作为存储结构,放入的顺序可以保持下来

LinkedHashSet 是有序的(可以保持元素存入的顺序,所以我们在讲Set的时候并没有说Set是无序)

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

推荐阅读更多精彩内容