Map接口概述(HashMap,TreeMap)

Map集合概述:

将键值映射到值得对象

一个映射不能包括重合的键

每个键最多只能映射到一个值

Map接口和Collection接口的不同

Map是双列,collection是单列的

Map的键唯一,collectionde子体系Set是惟一的

Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效的

通过API,我们知道Map集合的最大特点就是它可以存储键值对的元素

Map集合的特点

将键映射到值时候,一个映射不包括重复的键,每个键最多只能映射到一个值

注意:

Map集合的数据结构只针对键有效跟值无关

Collection集合的数据结构是针对元素有效

Map集合功能概述:

1.添加功能

V put(k key,v value);

a:添加功能

b:如果键是第一次存储,就直接存储元素,返回null

c:如果不是第一次存储,就用值把以前的值替换掉,返回以前的值

2.删除功能

void clear();移除所有的键值对元素

V remove(Object key)根据键删除键值对的元素,并把值返回

3.判断功能

bollean containskey(Object key):判断集合时候包含指定的键

bollean containsvalue(Object value):判断集合是否包含指定的值

bollean isEmpoty();判断集合是否为空

4.获取功能

Set<Map Entry<k,v>> entrySet();

V get(Object key);根据键获取值

Set<E> keyset();获取集合中所有键的集合

Collection<V> value();获取集合中所有值得集合

5.长度功能

int size();返回集合中的键值对的对数

Map集合遍历

方式一:

根据键找值

获取所有键的集合

遍历键的集合,获取到每一个键

根据键找值

代码体现如下:

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

for(String key:set){

String value=hm.get(key);

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

}

方式二:

根据键值对对象找键和值

获取所有键值对对象的集合

遍历键值对对象的集合获取到每一个键值对对象

遍历键值对对象 找键和值

代码体现如下:

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

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

String key=me.getKey();

String value=me.getValue();

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

}

HashMap类概述

键是哈希表结构,可以保证键的唯一性

hashMap案例

HashMap<String,String>

HashMap<Intrger,String>

HashMap<String,Student>

HashMap<Student,String>

LinkedHashMap类概述

Map接口的哈希表和链接列表的实现,具有可预知的迭代顺序

由哈希表保证键的唯一性

由键表保证键的有序(存储和取出的顺序一致)

TreeMap类概述

TreeMap类概述

键是红黑树结构,可以保证键的排序和唯一性

TreeMap案例

TreeMap<String ,String>

TreeMap<String ,String>

集合的嵌套遍历

HashMap嵌套

HashMap(HashMap<String,HashMap<String,Integer>>)

HashMap嵌套ArrayList

HashMap嵌套HashMap

HashMap嵌套HashMap嵌套HashMap(三层嵌套)

练习案例:

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

思路:

1.定义一个字符串

2.定义一个Map集合

3.把字符串转换为字符数组

4.遍历字符数组,得到每一个字符

5.拿这个字符到Map集合中去找看返回值

是null:就把该字符作为键,1作为值

不是null:就把值++,然后重新存储该键和值

6.定义一个字符串缓冲区

7.遍历TreeMap集合,获取每一个键值对元素拼接

8.把字符串缓冲区转换为字符串输出

面试题:

1.HashMap和Hashtable的区别

HashMap:线程不安全,效率高,允许null键和null值

Hashtable:线程安全,效率低,不允许null键和null值

2.List,Set,Map的接口是否都继承了Map接口

List,Set不是继承自Map接口,他们继承自Collection接口

Map是一个顶层接口

Collections类概述

针对集合操作的工具类(都是静态方法)

Collections成员方法

public static <T> void sort(List<T> list) 排序

public static <T> int binarySearch(List<?> List T key) 二分查找

public static <T> T max (Collection<?> coll) 最大值

public static void reverse(List<?> list) 反转

public static void shuffle(List<?> list) 随机置换

面试题:

Collection和Collections的区别?

Collection:是单列集合的顶层接口,有子接口List和Set

Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

Collections.sort()

如果同时有自然排序和比较器排序,以比较器排序为主

总结:

Map(双列集合)

1.Map集合的数据结构仅仅针对键有效,与值无关

2.存储的是键值对的形式的元素,键唯一,值可重复

HashMap

底层数据结构是哈希表,线程不安全,效率高

哈希表依赖于两个方法:hashcode和equals()

执行顺序:

首先判断hashcode()值是否相同

是:继续执行equals 看其返回值

是true:说明元素重复,不添加

是false:就直接添加到集合

否:就直接添加到集合

最终:自动生成hashcode()和equals()即可

LinkedHashMap

底层数据结构由链表和哈希表组成

由链表保证元素的有序

由哈希表保证元素的唯一

Hashtable

底层数据结构是哈希表,线程安全,效率低

哈希表依赖于两个方法hashcode和equals()

TreeMap

底层数据结构是红黑树(是一种自平衡的二叉树)

如何保证元素唯一性呢?

根据返回值是否是0来决定

如何保证元素的排序呢

两种方式

自然排序(元素具备比较性)

让元素所属的类实现Comparable接口

比较器排序(集合具备比较性)

让集合接收一个Comparator的实现类的对象

到低使用哪一个?

看需求

是否键值对形式

是:Map

键是否需要排序

是:TreeMap

否:HashMap

不知道就用HashMap

否:Collection

集合的常见方法及其遍历方式:

Collection:

add()

remove()

contains()

iterator()

size()

遍历:(两种)

增强for

迭代器

List:get() 3种遍历:普通for 增强for 迭代器

Set:两种遍历:增强for 迭代器

Map:

put()

remove()

contaibkey(),containvalue()

keySet()

get()

value()

entrySet()

size()

遍历:

根据键找值

根据键值对对象分别找键和值

 

上一篇:需要快速替代Java TreeMap,它可以容纳许多映射而不会减速


下一篇:java – 按日期的最大值过滤日期的TreeMap