zoukankan      html  css  js  c++  java
  • linkin大话数据结构--Map

    • Map
    映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是value。Map里的key不允许重复。通过key总能找到唯一的value与之对应。Map里的key集存储方式和对应的Set集合中的元素存储方式一致,Map.Entry是Map接口的内部接口,专门用来保存key-value内容:

    Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value。Map 中的 key 和  value 都可以是任何引用类型的数据,Map 中的 Key 不允许重复,即同一个 Map 对象的任何两个 Key 通过 equals 方法比较中返回 false。Key 和 Value 之间存在单向一对一关系,即通过指定的 Key 总能找到唯一的,确定的 Value。
    void clear():删除该Map对象中所有的key-value对。也就是清理该集合;
    boolean containsKey(Object key):查询Map中是否包含指定的key;
    boolean containsValue(Object  value):查询Map中是否包含至少一个value;
    Set entrySet():返回Map所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map内部类);
    Object get(Object key):返回指定key所对应的value,若此Map中不包含该key,返回null;
    boolean isEmpty():判断Map集合是否为空;
    Set keySet():返回该Map中所有key所组成的Set集合;
    Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;
    void putAll(Map m):将m中的key-value赋值到调用该方法的Map对象中;
    Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,若key不存在,返回null;
    int size():返回该Map里面key-value对的个数;
    Collection values():返回Map里所有value组成的Collection。
    • Map.Entry
    Entry是Map接口里面的一个内部接口。该接口用于封装key- value,有3个方法:
    Object getKey();返回Entry里包含的key值
    Object getValue();返回Entry里包含的value值

    Object setValue(Object value):设置Entry里包含的value值,并返回新设置的value值。


    • Map集合的输出
    按照最正统的做法,所有的Map集合的内容都要依靠Iterator输出,以上虽然是完成了输出,但是完成的不标准,Map集合本身并不能直接为Iterator实例化,如果此时非要使用Iterator输出Map集合中内容的话,则要采用如下的步骤:
    方法一:
    1.通过entrySet方法变成Set对象
    2.调用Set的Iterator方法,此时每个Iterator对象是Map.Entry对象
    3.对Map.Entry分离出 key - value
    方法二:
    1.通过keySet得到Map集合多有key的Set集合
    2.调用Set的Iterator方法,此时每个Iterator对象是key值
    3.通过Map的getValue(key)得到value值


    • Map集合常用类

    Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代,无序存放。很老的Map实现类,比Map接口更老,很少使用。

    HashMap:线程不安全,速度快,允许存放null键,null值。类中的key都属于无序存放的。如果在HashMap中有key值重复,那么后面一条记录的value覆盖前面一条记录。HashMap里的key存储和保存HashSet里面的元素一致,若自定义类作为HashMap或Hashtable的key:当两个key对象的equals方法返回true时,两个key对象的hashCode值也应一样。在实际开发中一般不会用自定义的类型作为Map的Key,做Key的无非是八中封装类,一般都是字符串,如果使用自定义类,一定要覆盖HashCode()和equals()。这个实现类是使用的最多的,我一般也就只使用过这个类而已。如何具体的理解HashMap,记住下面几句话就好:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(查API)。       HashSet 实际上为(key.null)类型的HashMap。有key 值而没有value 值。

    Hashtable 、HashMap 判断两个 Key 相等的标准是:两个 Key 通过 equals 方法返回 true,hashCode 值也相等。
    Hashtable 、HashMap 判断两个 Value相等的标准是:两个 Value 通过 equals 方法返回 true。

    注意:与 HashSet 集合不能保证元素的顺序的顺序一样,Hashtable 、HashMap 也不能保证其中 key-value 对的顺序

    TreeMap:对key进行排序,排序原理与TreeSet相同。HashMap子类中的key都属于无序存放的,如果现在希望有序(按key排序)则可以使用TreeMap类完成,但是需要注意的是,由于此类需要按照key进行排序,而且key本身也是对象,那么对象所在的类就必须实现Comparable接口。
    使用  HashMap的时候 key和 value都可以保存为  nulll;当 使用 TreeMap 的时候  key不能为null,value可以是 null;

    • TreeMap对key的排序方式:

    TreeMap 存储 Key-Value 对时,需要根据 Key 对 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态。

    自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
    定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口

    TreeMap判断两个key元素是否相等标准(和HashSet一样):compareTo方法或compare方法返回0。

    • LinkedHashMap
    LinkedHashMap 是 HashMap 的子类,底层采用链表来维护内部关系的。

    LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。


    import java.util.LinkedHashMap;
    import java.util.Map;
    
    
    public class Linkin 
    {
       public static void main(String[] args) 
       {
        Map<String, Integer> scores = new LinkedHashMap<String, Integer>();
        scores.put("语文", 100);
        scores.put("数学", 99);
        scores.put("科学", 98);
        for (String string : scores.keySet()) {
            System.out.println(string+":"+scores.get(string));
        }
       }
    }



    • Properties:Hashtable子类
    Properties类的主要功能是用于操作属性,在各个语言(包括操作系统)都会存在着许多的配置文件。所有的属性文件中的属性都是按照“key=value”的形式保存的,而且保存的内容都是String(字符串)。


    Properties 类是 Hashtable 的子类,该对象用于处理属性文件。由于属性文件里的 key、value 都是字符串类型,所以 properties 里的 Key 和 Value 都是字符串类型的。
    public Object setProperty(String key,String value):设置属性;
    public String getProperty(String key):根据属性的名字取得属性的内容,如果没有返回null结果;
    public String getProperty(String key,String defaultValue):根据属性的名字取得属性内容,如果没有则返回默认值(defaultValue);
    void load(InputStream/Reader inStream) 
    void loadFromXML(InputStream in) 
    public void list(PrintStream out):从一个输出流中显示所有的属性内容;
    public void store(OutputStream/Writer out, String comments)
    public void storeToXML(OutputStream os, String comment)  



    最后下面的代码演示了如何使用Map实现缓存机制:

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     *
     * @version 1L
     * @author  LinkinPark 
     * @since   2014-11-12
     * @motto   梦似烟花心似水,同学少年不言情
     * @desc    ^使用Map实现缓存机制   
     */
    class Axe {
        private String name;
    
    
        public Axe(String name) {
            this.name = name;
        }
        public void work() {
            System.out.println(name + "砍柴");
        }
    }
    
    
    public class CacheByMap {
        static Map<String, Axe> cacheMap = new HashMap<String, Axe>();
    
    
        public static void main(String[] args) 
        {
            Axe myAxe = null;
            if (!cacheMap.containsKey("myAxe")) 
            {
                myAxe = new Axe("linkinPark。。。");
                cacheMap.put("myAxe", myAxe);
            }
            myAxe.work();
            //上面已经将Axe这个对象放到了一个静态Map里面做了缓存
            myAxe.work(); 
        }
    }











  • 相关阅读:
    fastadmin编辑内容,有下拉选择关联的内容,自定义的参数去获取相应的下拉内容
    fastadmin 全手动添加规则
    微擎转移服务器后,出现 require()错误,解决方案
    laravel 路由
    装饰器练习
    python笔记(五)装饰器函数
    练习函数
    练习一
    python笔记(四)文件操作和函数
    py3和py2的差别(补充)
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233141.html
Copyright © 2011-2022 走看看