JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类
版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917
今天一觉醒来,朋友圈都是庆祝女排12后再次获得奥运冠军,有种精神叫做女排精神,学习女排,振兴中华。我们先让自己强大起来,整个祖国都会变的很强大
我们来继续学习集合的最后一个知识点,Map集合
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);
}
}
我们来看输出结果:
第一次为什么是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);
根据键删除对于值的元素输出结果
我们发现当这个键存在的时候,删除会返回对应的值,
不存在的时候,删除会返回null
-
判断功能
- 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
下面我们重点看一下Map的获取功能
-
获取功能
- V get(Object key):根据键获取值
- Set keySet():获取集合中所有键的集合
- Collection values():获取集合中所有值的集合
- Set< Map.Entry< K,V>> entrySet():返回的是键值对对象的集合
public class MapDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加元素
map.put("邓超", "孙俪");
map.put("黄晓明", "杨颖");
map.put("周杰伦", "蔡依林");
map.put("刘恺威", "杨幂");
// V get(Object key):根据键获取值
System.out.println("get:" + map.get("周杰伦"));
System.out.println("get:" + map.get("周杰")); // 返回null
// Set<K> keySet():获取集合中所有键的集合
Set<String> set = map.keySet();
for (String key : set) {
System.out.println("key:"+key);
}
// Collection<V> values():获取集合中所有值的集合
Collection<String> con = map.values();
for (String value : con) {
System.out.println("value:"+value);
}
// 获取所有键值对对象的集合
Set<Map.Entry<String, String>> set1 = map.entrySet();
// 遍历键值对对象的集合,得到每一个键值对对象
for (Map.Entry<String, String> me : set1) {
// 根据键值对对象获取键和值
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "---" + value);
}
}
}
这个还是很好理解的,最重要的就是遍历得到每一个键值对对象,看下输出结果
下面我们来看
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);
}
}
我们来看下输出结果:
看到结果是不是二分查找不存在的时候返回-6为什么呢。
因为当二分查找不存在的时候,它就会返回最大索引+1再+1.
上面的排序功能,它在默认情况下是自然顺序,如果我们要存储一个自定义对象,那么他就不说自然排序了,就要用到我们上一篇讲到的比较器Comparator排序了,大家要注意一下
好了,到这里,我们就把集合基本上学完了。下一篇,我们就要开始IO流的学习了,你准备好了吗?
欢迎有兴趣的同学加我朋友的QQ群:点击直接加群555974449 请备注:java基础再回首我们一起来玩吧。