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()
遍历:
根据键找值
根据键值对对象分别找键和值