Map接口的再学习

来源:互联网 发布:陈坤孩子的母亲知乎 编辑:程序博客网 时间:2024/06/04 00:39

(存储一对一对的对象)中每一个元素不是一个对象,而是一个键对象和值对象组成的键值对(Key-Value)。

Key-Value是一个不重复值可重复的集合。(典型的例子是字典:通过页码的key值找字的value,k那一页对应多个汉字v)。

键不重复,因为(HashMap的键要比较是否相等来存值,TreeMap的键要比较大小来存值),

HashMap无序(HashMap存数据的位置是根据数据哈希值算出来的位置);

TreeMap有序(通过键比出来的从小到大)

SortedMap接口:如果一个Map可以根据key值排序,则称其为SortedMap。(如字典)

Map的子接口,TreeMap的直接父类

 

java.util.HashMap

========================================

  哈希表,散列表       存放“键-值”/"-"对数据

  作用:快速查找数据   用“键”获得对应的“值”

 

  键:

      *) 键不允许重复,键相同值被覆盖

      *) 无序  往里放的数据是散列乱序存放的根据内部的哈希/散列算法计算出数据存放的位置)

     

      *) 这个键必须同时重写 hashCode()  equals() 2个方法

            *) 如果 equals() 相等(即属性相同),那么hashCode() 必须相等(属性相同)

            *) 如果 hashCode() 相等(根据属性计算出来的值相等),

               equals() 不一定相等(那么属性不一定相等)

 

  创建对象

  -----------------------------------

    HashMap map = new HashMap();

 

  方法

  -----------------------------------

       put(k, v)   放入键值对数据

       get(k)      用键获得对应的值

       remove(k)   移除指定的键和它的值

       containsKey(key)是否包含指定的键

       containsValue(value)是否包含指定的值

       size()        有多少对数据

       clear()      清空

       keySet()   获得一个 Set 类型集合,包含所有的键

       values()    获得集合,包含所有的值

       entrySet() 获得一个 Set 类型集合,包含所有Entry

  哈希算法

  -------------------------------------

    存放数据

    ---------------------------------

      1. 调用keyhasCode()方法获得键的哈希值

      2. 用哈希值计算下标值 index

      3. 新建Entry对象来封装键和值

        3.1如果数据的数量达到一定的负载率(75%)容量会翻倍;

      4.  Entry 对象放入该index位置

         4.1. 如果该index是空位置,直接放入

         4.2. 如果该index位置已经有Entry对象了

           4.2.1.那么依次得用equals()与该位置Entry对象的键比较是否相等

           4.2.1.1. 如果找到键相等的覆盖掉原来的值

           4.2.1.2. 如果没有找到键相等的,那么把Entry对象挂在一起形成链表

                    这样唯一的index位置可能存有很多个Entry对象

                   这样在该index位置找某个Entry对象的时候效率就低了

    查找数据

    ------------------------------------------

      1. 调用keyhasCode()方法获得键的哈希值

      2. 用哈希值计算下标值 index

      3. 如果该index是空位置,直接返回null

      4. 如果该index位置已经有Entry对象了

           4.2.1.那么依次得用equals()与该位置每个Entry对象的键比较是否相等

           4.2.1.1. 如果找到键相等的返回该值

           4.2.1.2. 如果没有找到键相等的,返回null

      

     HashMap HaShTable的区别.

 

     HashMap是非线程安全的容器,允许键和值为null

     Hashtable是线程安全的容器,不允许键和值为null

      

TreeMap

======================================

  二叉树、红黑树     存放“键-值”对数据

  作用:快速查找数据 * 用“键”获得对应的“值”

 

  键:

      *) 不能重复

      *) 有序,从小到大

      *) 不允许 null 值,因为要比较大小

     

      *) 比较大小:

            *) 键(被存储对象可以选择)实现 Comparable 接口

            *)  TreeMap 上外接 Comparator 比较器对象指定排序规则二者都有时优先执行比较器

 

  创建对象

  ------------------------------------

    1. TreeMap map = new TreeMap();

   

    2. TreeMap map = new TreeMap(比较器对象);

       外接一个比较器对象,是comparator

 

  方法

  ------------------------------------

     HashMap 相同的方法

    HashMapTreeMap和二分法 3种快速查找数据的算法

    HashMap VS TreeMap:一般使用HashMap,排序的时候使用TreeMap

 

 LinkedHashMap

保证集合中key的添加顺序。

 HashTable :

线程安全的HashMap (方法和HashMap中基本相同,只是多线程锁修饰符)

 Properties :

继承了HashTable,HashTable的一个子类。

HashMap VS Hashtable:(注意在这里table的第一个字母小写)之间的区别有些类似于ArrayListVectorHashtable(出现的早,线程安全)是重量级的组件,在考虑并发的情况,对安全性要求比较高的时候使用。Map的运用非常的多。使用HashMap(),如果使用自定义类,一定要覆盖HashCode()equals()


0 0
原创粉丝点击