Map集概论
通过我们查询API文档得到官方说名来了解一下:
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。 Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,HashMap 类。 注:将可变对象用作映射键时必须格外小心。当对象是映射中某个键时,如果以影响 equals 比较的方式更改了对象的值,则映射的行为将是不确定的。此项禁止的一种特殊情况是不允许某个映射将自身作为一个键包含。虽然允许某个映射将自身作为值包含,但请格外小心:在这样的映射上 equals 和 hashCode 方法的定义将不再是明确的。
通过以上,我们来解析一下获取关于Map的关键信息:
Map(映射):
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。
Map没有继承于Collection接口
从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map实现的方法
Map 的常用方法:
1 添加,删除操作:
Object put(Object key, Object value): 向集合中加入元素
Object remove(Object key): 删除与KEY相关的元素
void putAll(Map t): 将来自特定映像的所有元素添加给该映像
void clear(): 从映像中删除所有映射
2 查询操作:
Object get(Object key): 获得与关键字key相关的值
Map集合中的键对象不允许重复,也就说,任意两个键对象通过equals()方法比较的结果都是false.
但是可以将任意多个键独享映射到同一个值对象上。
Map的功能方法
方法put(Object key, Object value)添加一个“值”(想要得东西)和与“值”相关联的“键”(key)(使用它来查找)。方法get(Object key)返回与给定“键”相关联的“值”。可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。
Map实现的几种重要的类
标准的Java类库中包含了几种不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它们都有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
而这个执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因为hashCode()是定义在基类Object中的方法。
HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显着提高性能。
Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”
HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
WeakHashMap : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计
Map的两种遍历方式
从以上的论述我们都知道了,这个Map集合就是一种映射的关系,我们可以在里面存储键值对,这些键值对一一对应,一个键只能对应一个值,键不允许重复,通过Map的常用方法 中我们可以通过
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
这两个方法来进行Map集合的 遍历
方式一:
import java.util.Map;
import java.util.Set;
public class hashmaptest {
public static void main(String[] args) {
HashMap<String, String> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("小明","男");
objectObjectHashMap.put("小花","女");
Set<Map.Entry<String, String>> entries = objectObjectHashMap.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
输出结果:
方式二:
import java.util.Set;
public class hashmaptest {
public static void main(String[] args) {
HashMap<String, String> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("小明","男");
objectObjectHashMap.put("小花","女");
Set<String> strings = objectObjectHashMap.keySet();
for (String string : strings) {
String s = objectObjectHashMap.get(string);
System.out.println(string+" "+s);
}
}
}
输出结果:
这样,我们就完成了两个集合的遍历。
这里我们再来看看两个集合嵌套遍历
我们可以通过嵌套集合的遍历再控制台输出以下内容:
传智播客
jc 基础班
张三 20
李四 22
jy 就业班
王五 21
赵六 23
代码:
import java.util.HashMap;
import java.util.Set;
public class qiantao {
public static void main(String[] args) {
HashMap<String, Integer> jc = new HashMap<>();
HashMap<String, Integer> jy = new HashMap<>();
jc.put("张三",20);
jc.put("李四",22);
jy.put("王五",21);
jy.put("赵六",23);
HashMap<HashMap<String,Integer>,String>max=new HashMap<>();
max.put(jc,"基础班");
max.put(jy,"就业班");
Set<HashMap<String, Integer>> hashMaps = max.keySet();
System.out.println("智客传播");
int i=1;
for (HashMap<String, Integer> hashMap : hashMaps) {
if (i==1){System.out.println("jc"+"----"+max.get(hashMap));}
else{System.out.println("jy"+"----"+max.get(hashMap));}
i++;
Set<String> strings = hashMap.keySet();
for (String string : strings) {
System.out.println(" "+string+" "+hashMap.get(string));
}
}
}
}
输出结果:
Collections工具类的使用
Collections类概述: 针对集合操作 的工具类
Collections成员方法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<?> list,T key): 二分查找
public static T max(Collection<?> coll): 获取最大值
public static void reverse(List<?> list): 反转
public static void shuffle(List<?> list): 随机置换
** Collection和Collections的区别:**
1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。声明了适用于JAVA集合(只包括Set和List)的通用方法。Set 和List 都继承了Conllection,Map没有.
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务JavaCollection框架。