Map集合
- 概述
- 将键映射到值的对象
- 一个映射不能包含重复的键
- 每个键最多只能映射到一个值
前面我们一直在学Collection集合,那么它和Map集合有什么区别呢?
- Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
- Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍
- 注意:
- Map集合的数据结构值针对键有效,跟值无关
- Collection集合的数据结构是针对元素有效
下面我们来了解Map集合的功能概述
-
添加功能
- V put(K key,V value):添加元素。
public class MapDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>(); System.out.println("put:" + map.put("马蓉", "王宝强")); System.out.println("put:" + map.put("马蓉", "宋喆")); // 输出集合名称 System.out.println("map:" + map);
}
}
运行结果:
put:null
put:王宝强
map:{马蓉=宋喆}
第一次为什么是null呢?而第二次返回的是王宝强呢?最后奇怪的是马蓉和宋喆真像现实中一样。我来给大家说说这是为什么?
- 因为如果键是第一次存储,就直接存储元素,返回null
- 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
现在明白了吧。
但是我们平时添加元素不是这样添加的,是下面这样
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 添加元素
map.put("邓超", "孙俪");
map.put("黄晓明", "杨颖");
map.put("周杰伦", "昆凌");
map.put("刘恺威", "杨幂");
// 输出集合名称
System.out.println("map:" + map);
输出结果:map:{邓超=孙俪, 周杰伦=昆凌, 黄晓明=杨颖, 刘恺威=杨幂}我们继续
-
删除功能 void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
map.clear();//会移除所有的键值对元素
System.out.println("map:" + map);//map:{} //所以不建议使用
//V remove(Object key):根据键删除键值对元素,并把值返回 System.out.println("remove:" + map.remove("黄晓明")); System.out.println("remove:" + map.remove("黄晓波"));
// 输出集合名称
System.out.println("map:" + map);
-
判断功能
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Object value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
//boolean containsKey(Object key):判断集合是否包含指定的键 System.out.println("containsKey:" + map.containsKey("黄晓明")); System.out.println("containsKey:" + map.containsKey("黄晓波"));
// 输出集合名称
System.out.println("map:" + map);
//boolean isEmpty():判断集合是否为空 System.out.println("isEmpty:"+map.isEmpty());
- 长度功能 int size():返回集合中的键值对的对数
//这个也比较简单了
System.out.println("size:"+map.size());//size:4
- 获取功能 V get(Object key):根据键获取值
- Set keySet():获取集合中所有键的集合
- Collection values():获取集合中所有值的集合
- Set< Map.Entry< K,V>> entrySet():返回的是键值对对象的集合
Map子类
- HashMap
- HashMap类概述键是哈希表结构,可以保证键的唯一性
- 常用案例HashMap< String,String>
- HashMap< Integer,String>
- HashMap< String,Student>
- HashMap< Student,String>
- 上面的也不是非要是学生对象,可以是你需求的对象
LinkedHashMap
- 概述
- Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
- 由哈希表保证键的唯一性,不可重复
- 由链表保证键盘的有序(存储和取出的顺序一致)
TreeMap
- 概述
- 键是红黑树结构,可以保证键的排序和唯一性
Map集合的知识点和它的子类我上面都将到了,下面我们来做道练习题吧
- HashMap和Hashtable的区别?
public class HashtableDemo {
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<String, String>(); hm.put("android", "hello");
hm.put(null, "world");
hm.put("java", null);
System.out.println(hm);
Hashtable<String, String> ht = new Hashtable<String, String>(); ht.put("android", "hello");
ht.put(null, "world"); //NullPointerException
ht.put("java", null); // NullPointerException
System.out.println(ht);
}
}
在输出结果中:HashMap会打印出{null=world, java=null, Android=hello}而在Hashtable中会报错所以我们就能得出他们的区别
- HashMap:线程不安全,效率高。允许null键和null值
- Hashtable:线程安全,效率低。不允许null键和null值
Collections类
我们之前学习了Collection,那么它和Collections有什么区别呢。
我们先来了解Collections类,然后在来说他们之间的区别
- Collections类概述
针对集合进行操作的工具类,都是静态方法。 - Collection和Collections的区别
Collection:是单列集合的顶层接口,有子接口List和Set。
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法 - Collections成员方法
- public static < T> void sort(List 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):随机置换
public class CollectionsDemo {
public static void main(String[] args) {
// 创建集合对象
List<Integer> list = new ArrayList<Integer>();
// 添加元素
list.add(30); list.add(20); list.add(50); list.add(10); list.add(40);
System.out.println("list:" + list);
// public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
Collections.sort(list);
System.out.println("自然顺序list:" + list);
// public static <T> int binarySearch(List<?> list,T key):二分查找
System.out.println("二分查找:" + Collections.binarySearch(list, 30));
System.out.println("二分查找:"+ Collections.binarySearch(list, 300));
// public static <T> T max(Collection<?> coll):最大值
System.out.println("max:"+Collections.max(list));
// public static void reverse(List<?> list):反转
Collections.reverse(list);
System.out.println("list:" + list);
//public static void shuffle(List<?> list):随机置换
Collections.shuffle(list);
System.out.println("list:" + list);
// public static void reverse(List<?> list):反转
Collections.reverse(list);
System.out.println("list:" + list);
}
}
运行结果:
- list:[30, 20, 50, 10, 40]
- 自然顺序list:[10, 20, 30, 40, 50]
- 二分查找:2
- 二分查找:-6
- max:50
- list:[50, 40, 30, 20, 10]
- list:[30, 20, 10, 40, 50]
- list:[50, 40, 10, 20, 30]
- 看到结果是不是二分查找不存在的时候返回-6为什么呢。
- 因为当二分查找不存在的时候,它就会返回最大索引+1再+1.
上面的排序功能,它在默认情况下是自然顺序,如果我们要存储一个自定义对象,那么他就不说自然排序了,就要用到我们上一篇讲到的比较器Comparator排序了,大家要注意一下