Java的映射表HashMap、LinkedHashMap、TreeMap

映射表是一种依照键/值对存储元素的容器。它提供了通过键快速获取、删除和更新键/值对的功能。映射表将键和值一起保存,键很像下标,键可以是任何类型的对象。映射表中不能有重复的键,每个键对应一个值,一个键和它对应的值构成一个条目并保存在映射表中。

有三种类型的映射表:散列映射表HashMap、链式散列映射表LinkedHashMap、树型映射表TreeMap。

如果更新映射表时不需要保持元素的顺序,则用HashMap,如果需要保持元素的插入顺序或访问顺序,则用LinkedHashMap;如果需要映射表按照键排序,则用treeMap。

Map←AbatractMap←HashMap←LinkedHashMap

抽象类AbatractMap继承自Map接口,HashMap继承并实现了AbatractMap,LinkedListMap继承了HashMap。

Map接口的方法如下:

+clear():void  从映射表中删除所有的条目

+containsKey(key:Object):boolean  如果包含了指定键的条目,则返回true

+containsValue(value:Object):boolean  如果该映射表将一个或者多个键映射到指定值,返回true

+entrySet():Set<Map.Entry<K,V>>  返回一个包含了该映射表中条目的集合

+get(key:Object):V  返回指定键对应的值

+isEmpty():boolean 判断映射表是否为空

+keySet():Set<K>返回一个包含该映射表中所有键的集合

+put(key:K,value:V):V将一个条目放入该映射表中

+putAll(m:Map<? extends K,?extends V>): void 将m中所有条目添加到该映射表

+remove(key:Object):V删除指定键对应的值

+size():int返回映射表中的条目数

+values():Collection<V>返回该映射表中所有值组成的集合

方法entrySet()返回一个所有条目的集合,这些条目是Map.Entry<K,V>接口的实例,这里的Entry是Map内部的一个接口。其方法如下:

+getKey():K  返回该条目的键

+getValue():V  返回该条目的值

+setValue(value:V):void   将该条目的值赋以新的值

对于定位一个值,插入一个条目以及删除一个条目而言,HashMap类是高效的。

LinkedHashMap类用链表实现来扩展HaspMap,它支持映射表中条目的排序。HashMap类中的条目是没有顺序的,但在LinkedHaspMap中,元素既可以按照它们插入映射表的顺序排序(插入顺序),也可以按照它们被最后一次访问的顺序,从早到晚(访问顺序)排序。无参构造函数是以插入顺序来创建LinkedHaspMap对象的。

TreeMap类在遍历排好序的键时是很高效的。键可以用Comparable接口或Compaeator接口来排序。如果类实现了Comaprable接口,那么就可以使用CompareTo方法来对映射表内的键进行比较。要使用比较器,必须使用构造方法TreeMap(Comparator comparator)来创建一个有序的映射表。

package test;

import java.util.*;

public class project1 {
	public static void main(String []args) {
		//散列映射表
        Map<String,Integer> haspMap=new HashMap<>();
        haspMap.put("Smith", 30);
        haspMap.put("Tom", 18);
        haspMap.put("Lewie", 25);
        haspMap.put("Cook", 21);
        haspMap.put("Dedf", 28);
        
        System.out.println("display entries in HashMap");
        System.out.println(haspMap+"\n");
        
        //链式散列映射表
        Map<String,Integer> linkedHaspMap=new LinkedHashMap<>(16,0.75f,true);
        linkedHaspMap.put("Smith", 30);
        linkedHaspMap.put("Tom", 18);
        linkedHaspMap.put("Lewie", 25);
        linkedHaspMap.put("Cook", 21);
        linkedHaspMap.put("Dedf", 28);
        
        System.out.println("The age for"+"Tom is "+linkedHaspMap.get("Tom"));
        System.out.println("The age for"+"Smith is "+linkedHaspMap.get("Smith"));
        System.out.println("The age for"+"Cook is "+linkedHaspMap.get("Cook"));
        System.out.println("The age for"+"Dedf is "+linkedHaspMap.get("Dedf"));
        System.out.println("display entries in LinkedHashMap");
        System.out.println(linkedHaspMap);
        
        //树型映射表
        Map<String,Integer> treeMap=new TreeMap<>(haspMap);
        System.out.println("\ndisplay entries in ascending order of key");
        System.out.println(treeMap);
	}
}

运行结果:

display entries in HashMap
{Tom=18, Dedf=28, Lewie=25, Smith=30, Cook=21}

The age forTom is 18
The age forSmith is 30
The age forCook is 21
The age forDedf is 28
display entries in LinkedHashMap
{Lewie=25, Tom=18, Smith=30, Cook=21, Dedf=28}

display entries in ascending order of key
{Cook=21, Dedf=28, Lewie=25, Smith=30, Tom=18}

程序是以学生的姓名为键,年龄为值。HashMap中条目的顺序是随机的,而TreeMap中的条目是按键的升序排序的,LinkedHashMap中的条目则是按元素最后一次被访问的时间从早到晚排序的。

实现Map接口是所有具体类至少有两种构造方法:一种是无参构造函数,它可以用来创建一个空映射表。另一种是从Map的一个实例来创建映射表,例如  Map<String,Integer> treeMap=new TreeMap<>(haspMap);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值