Java有两大类集合,之前已经介绍过了Collection集合,参见:https://www.jianshu.com/p/46980e60de61
这一篇介绍Map接口的集合特性。
常见Map集合有HashMap和LinkedHashMap
1. 概述
Map集合和Collection集合存储数据的形式不同
Collection派系中的集合元素是孤立存在,存储元素时是一个个单独存入集合;而Map派系中的集合,元素是成对存在的。每个元素由Key-Value两部分组成,通过Key可以找到Value
Collection中的集合为单列集合;Map中的集合为双列集合
Map中的集合不能包含重复的Key,但Value可以重复
主要关注2个Map接口的实现类:
HashMap<K, V>:采用哈希表结构,元素的存取顺序不能保证一致。由于要保证Key的唯一性,需要重写hashCode和equals方法。
LinkedHashMap<K, V>:存储采用哈希表结构和链表。通过链表可以保证存取顺序一致;通过哈希表可以保证key的唯一、不重复,也需要重写hashCode和equals方法。
2. Map接口中的常用方法
2.1 V put(K key,V value)方法
可见存储无序且不重复put的返回值V:如果是更新了某个key的值,则返回更新前的值;如果只是添加键值对,则返回null
2.2 V get(Object key)方法
如果存在查询的key,则返回对应value
如果不存在查询的key,则返回null
2.3 V remove(Object key)
3. 2种Map接口的遍历的方法
两种方法都要掌握,但是根据喜好选择一种
3.1 Set<K> keySet()方法
将Map集合中的所有key都转存到Set集合,这样遍历Set集合中的key变相去遍历Map集合
步骤:(本来不想写这种死东西,但若是初学者,还是了解一下比较好)
1. 调用keySet方法,将Map集合中的key存到Set集合中
2. 遍历Set集合取出Key值
3. 调用Map中的get方法,参数是第2步中的key
程序说明:
a. 这里用了增强型for循环,也可以用iterator
b. 另一种写法(使用匿名对象):
Iterator it = hm.keySet().iterator();
while(it.hasNext()) {
System.out.println(hm.get(it.next()));
}
c. 程序中定义的set是接口Set的一个实现类,使用getClass可以查看set具体是哪一个实现类。结果是:class java.util.HashMap$KeySet。HashMap的一个内部类,$符号后面是内部类的名字
3.2 Entry键值对 接口
Map类设计时,提供了一个嵌套接口:Entry。它将KeyValue对应关系封装成了对象。这样我们就可以不用keySet,而用Entry获取KeyValue对象来遍历Map
Set<Map.Entry<K,V>> entrySet()
操作步骤见代码:
4. HashMap
前面的方法HashMap都适用,这里主要演示自定义类作为Key或Value的情况,涉及hashCode和equals方法重写
4.1 自定义类作为value加入到HashMap中并用keySet方法遍历
因为非自定义的基本类型的hashCode、equals方法被重写过,所以不需要再重写,直接使用即可,比较简单
4.2 自定义类作为key加入到HashMap中并用Iterator使用Entry对象遍历
Person类中没有重写hashCode和equals方法可见,相同内容的Person类作为key,没有覆盖原来的value
重写hashCode和equals方法5. LinkedHashMap
LinkedHashMap继承自HashMap
区别是:保证了迭代顺序
用法和HashMap一样,就不再重复介绍
6. HashTable集合类(了解)
Map接口的实现类:HashTable
底层数据结构是哈希表,特点和HashMap是一样的
但HashTable是同步的:线程安全的,速度慢
HashMap是不同步的:线程不安全,速度快
HashMap允许存储null Key,null value
HashTable不允许存储null key,null value
HashTable和Vector差不多是早期的,从JDK1.2开始被更强大的HashMap取代
但是HashTable的子类Properties类依然再使用,Properties类可保存在I/O流中或从I/O流中加载
7. 静态导入
Java从JDK1.5开始支持导入静态成员,以减少开发的代码量
在导包的时候import后面加上static,后面跟的必须是静态成员,这样就不需要在代码中加入类名了
8. 方法的可变参数(type ...a)
可变参数,本质上就是一个数组
注意事项:
一个方法中,只能有一个可变参数
可变参数必须在方法参数列表的最后
9. Collections工具类(注意不是Collection)
Collections工具类主要操作Collection集合,Collections中的方法都是静态方法
9.1 sort静态方法(只针对List)
由于Set是无序的,所以只针对List派系
9.2 binarySearch二分查找
只针对List派系
9.3 shuffle方法 随机排序
只能对List派系进行随机排序
10. 集合的嵌套存储
Map中存Map是最复杂的情况,其它就不介绍了
HashMap为例:
hashmap在添加的时候是从里到外添加,因此遍历的时候要从外到里去遍历
网友评论