Map接口的概念特点
Map 接口
元素是由一个一个键值对组成,键不允许重复,值允许重复,<K,V> 键值对
--HashMap
底层数据结构是哈希表,保证了元素的唯一(指的是键的唯一性),元素是无序
当键是自定义类型的时候,要想保证唯一性,就必须重写hashCode()方法和equals()方法
--LinkedHashMap
底层数据结构是哈希表和链表
哈希表保证的是元素的唯一性
链表保证的是元素有序(指的是存储和取出的顺序一致)
--TreeMap
底层数据结构是红黑树
排序针对于键来说的
自然排序 元素的数据类型的类实现Comparable<T>接口,重写compareTo()方法
比较器排序
自定义一个类实现Comparator<T>接口,重写compare()方法
匿名内部类的形式进行构造方法传参,重写compare()方法
Map接口与Collection接口有什么区别?
1、Map接口与Collection接口是平级关机,不存在继承关系,都是属于util包下面的
2、Map集合中的元素都是成对出现的,Map集合中的键是唯一的,值是可以重复的 又称之为:夫妻对
3、Collection集合中的元素都是单独出现的,Collection接口下面有个子接口Set,它的元素也是唯一的
List中的元素也是单独出现,可以重复,像这样单独出现的元素,称之为:光棍
Map接口中的方法:
1、添加功能:
V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
举例:map.put(1001,"周杰伦");
2、删除功能:
void clear() 从该Map中删除所有的映射(可选操作)。
V remove(Object key) 如果存在(从可选的操作),从该Map中删除一个键的映射。
3、判断功能:
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。
boolean isEmpty() 如果此地图不包含键值映射,则返回 true 。
4、获取功能:
V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
Set<K> keySet() 返回此Map中包含的键的Set视图。
Collection<V> values() 返回此Map中包含的值的Collection视图
Set<Map.Entry<K,V>> entrySet() 获取Map中所有元素,元素的类组成是由一个键和一个值组成
5、长度功能:
int size() 返回此Map中键值映射的数量。
public class MapDemo {
public static void main(String[] args) {
//创建Map集合对象
//由于Map是一个接口,所以接口不能直接实例化,要使用一个具体的子类进行实例化
//这里借助HashMap
Map<String,String> map = new HashMap<>();
//添加元素
//V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
//这里的返回值是将来再次插入同一个键的时候,被覆盖的那个值
map.put("黄晓明","杨颖");
map.put("邓超","孙俪");
map.put("小虎","冯提莫");
map.put("小虎","IU");
//删除功能
//void clear() 从该Map中删除所有的映射(可选操作)。
// map.clear();
// V remove(Object key) 如果存在(从可选的操作),从该Map中删除一个键的映射。
//返回对应删除的值
// System.out.println(map.remove("小虎"));
System.out.println("==========================================");
//boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
System.out.println(map.containsKey("小虎"));
//boolean containsValue(Object value)
//如果此地图将一个或多个键映射到指定的值,则返回 true 。
System.out.println(map.containsValue("IU"));
System.out.println(map.isEmpty());
System.out.println(map);
}
}
因为增强for循环只能遍历Collection集合和数组,所以我们如果想要用增强for循环去遍历Map集合,我们就需要用方法去把Map集合转变成Collection集合或者其子类,代码实现如下
//Set<K> keySet() 返回此Map中包含的键的Set视图。
Set<String> set = map.keySet();
for (String s : set) {
// System.out.println(s);
String value = map.get(s);
System.out.println(s + ":" + value);
}
//Collection<V> values() 返回此Map中包含的值的Collection视图
Collection<String> values = map.values();
for (String s : values) {
System.out.println(s);
}
Map集合遍历两种方式
集合遍历的方式一:根据键找值
1、通过调用keySet()方法获取Map集合中所有的key
2、结合get(key)这个方法,可以获取到每一个key对应的value
3、输出
//通过调用keySet()方法获取Map集合中所有的key
Set<String> keySet = map.keySet();
//遍历keySet获取到每一个key
for (String s : keySet) {
String value = map.get(s);
System.out.println(s + ":" + value);
}
Map集合遍历的第二种方式:
一次先把所有的键值对获取到,然后在依次获取每一个键值对的key和value
//遍历:一次先把所有的键值对获取到
//Set<Map.Entry<K,V>> entrySet() 获取Map中所有元素,元素的类组成是由一个键和一个值组成
Set<Map.Entry<String, String>> set = map.entrySet();
//遍历集合获取每一个键值对
for (Map.Entry<String, String> keyValue : set) {
String key = keyValue.getKey();
String value = keyValue.getValue();
System.out.println(key + ":" + value);
}
将来开发的时候用谁呢?
1、元素的组成是单个还是成对,如果是单个使用Collection下面的集合,如果是成对出现的,使用Map下面的集合
2、元素允许重复吗?
允许:List
不允许:Set
3、元素需要排序吗?
需要:TreeSet或者TreeMap
不需要:ArrayList等
4、将来查找的功能多吗?
多,用底层是数组的集合
5、将来增删操作多吗?
多,用底层是链表的集合
如果你什么都不知道,用ArrayList。推荐具体情况具体选择。
注意:
增强for循环只能作用于数组和Collection集合,不适用于Map集合