Map是双列集合的顶层接口,所有子接口的基础方法都在这个接口里面进行了定义,顾名思义,Map相当于对一类地图式的数据进行存储,我们使用地图的时候,地图上的点和真实世界的点进行了一一对应,在Map中,我们利用键值对来对数据进行存储。
Map
Map的特点
Map是双列结合的顶层接口,并不属于Collection体系,它与Collection体系共同组合了集合体系
Map中的数据都是以键值对的形式存储,一个键值(key)对应一个值(value)
Map中存储的键值对中键是不可以重复的,保证了数据的唯一性,但是不同的键对应的值是可以相同的
Map的常用方法
在代码种中进行介绍,都在注释里了:
public static void main(String[] args) {
//因为Map是一个接口,所以利用多态来引用一个实现子类来进行操作,这里用泛型来规定这里面的数据类型
Map<String,Integer> m = new HashMap();
//put方法,来对Map中进行数据的存入
m.put("路飞", 13);
m.put("索隆", 14);
m.put("山治", 14);
m.put("乔巴", 12);
System.out.println(m);
Map<String,Integer> mm = new HashMap<>();
mm.put("娜美", 15);
mm.put("罗宾", 16);
System.out.println(mm);
//putAll方法,将另一个map添加到这个map中
m.putAll(mm);
System.out.println(m);
//isEmpty方法,查看这个集合是否为空
System.out.println(m.isEmpty());
//size方法,查看元素个数
System.out.println(m.size());
//clear方法,清空Map集合
mm.clear();
System.out.println(mm);
//containsKey判断map中是否有这个key值
System.out.println(m.containsKey("娜美"));
//containsValue判断map中是否有这个value值
System.out.println(m.containsValue(14));
//keySet方法,将key值装入一个set集合
Set<String> keySet = m.keySet();
System.out.println(keySet);
//entrySet将map中数据以键值对的形式返回到一个set集合中
//Set集合中有一个类变量Entry,里面也是一个双列集合
Set<Entry<String, Integer>> entrySet = m.entrySet();
System.out.println(entrySet);
}
输出结果
{山治=14, 乔巴=12, 索隆=14, 路飞=13}
{罗宾=16, 娜美=15}
{山治=14, 罗宾=16, 乔巴=12, 娜美=15, 索隆=14, 路飞=13}
false
6
{}
true
true
[山治, 罗宾, 乔巴, 娜美, 索隆, 路飞]
[山治=14, 罗宾=16, 乔巴=12, 娜美=15, 索隆=14, 路飞=13]
HashMap
hashiMap是map集合中最常用的子类,上述方法的演示也是利用hashMap集合进行演示的,底层是一个哈希表,利用hash表对键值对进行不唯一存储,非线程安全,且允许有键值对存在
常用方法已经在上述检验过,这里我们对hashMap的遍历进行演示
利用keySet()方法转化为set集合进行遍历
Set<String> keySet = m.keySet();
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()) {
String next = iterator.next();
Person person = m.get(next);
System.out.print(next+"...."+person);
}
利用entrySet()方法转化为Map.Entry<String, Person>对象调用getKey()方法和getValue()方法进行遍历
private static void method2(Map<String, Person> m) {
Set<Map.Entry<String, Person>> entrySet = m.entrySet();
for(Map.Entry<String, Person> mm:entrySet) {
System.out.print(mm.getKey()+"...."+mm.getValue());
}
}
利用上一种方法获得对象再用迭代器进行遍历
private static void method3(Map<String, Person> m) {
Set<Entry<String, Person>> entrySet = m.entrySet();
Iterator<Entry<String, Person>> iterator = entrySet.iterator();
while(iterator.hasNext()) {
Entry<String, Person> next = iterator.next();
System.out.print(next.getKey()+"...."+next.getValue());
}
}
TreeMap
TreeMap没有什么特别的方法,不过里面也是有Tree的特点,利用红黑树进行有序存储,这里同样也是利用重写compareTo方法来进行自定义排序
LinkedHashSet和LinkedHashMap
两个子类有着相同的特点是存取顺序都一样,他们的底层是利用哈希表和链表进行去重有序哈希存储
存储过程为:当进行元素存储的时候,先进行哈希值的判断,如果不一致这时候直接进行存储,每进行一次存储,都是由链表来进行记录地址位置,然后如果哈希值不一样,再利用equals方法进行比较,如果相同那么直接放弃存取,如果不相同,通过散列函数和冲突函数进行计算这个数据的位置,得到位置后,也是用链表进行记录地址。当进行取元素的时候,直接利用链表来进行取出元素。