zoukankan      html  css  js  c++  java
  • JAVA ,Map接口 ,迭代器Iterator

    1.    Map 接口概述

    java.util.Map 接口描述了映射结构, Map 接口允许以键集、值集合或键 - 值映射关系集的形式查看某个映射的内容。

    Java 自带了各种 Map 类。 这些 Map 类可归为三种类型:

       1. 通用 Map ,用于在应用程序中管理映射,通常在 java.util 程序包中实现

              * HashMap

              * Hashtable

              * Properties

               * LinkedHashMap

              * IdentityHashMap

              * TreeMap

              * WeakHashMap

              * ConcurrentHashMap

       2. 专用 Map ,您通常不必亲自创建此类 Map ,而是通过某些其他类对其进行访问

              * java.util.jar.Attributes

              * javax.print.attribute.standard.PrinterStateReasons

              * java.security.Provider

              * java.awt.RenderingHints

              * javax.swing.UIDefaults

       3. 一个用于帮助实现您自己的 Map 类的抽象类

              * AbstractMap

    接口中的重要方法如下:

    1,  覆盖的方法

    equals(Object o)               // 比较指定对象与此 Map 的等价性

    hashCode()                     // 返回此 Map 的哈希码

    2,  Map 更新方法,可以更改 Map 的内容。

    put(Object key, Object value)  // 添加键值对,若键已存在,则覆盖旧值。

    putAll(Map t)               // 将指定 Map 中的所有映射复制到此 map

    remove(Object key)             // 从 Map 中删除与 key 关联的 value

    clear()                       // 从 Map 中删除所有映射

    3,  返回视图的 Map 方法:使用这些方法返回的对象,你可以遍历和删除 Map 的元素。

    Set keySet()                // 返回 Map 中所包含键的 Set 视图。

    // 删除 Set 中的 key 元素还将删除 Map 中相应的映射(键和值)

    Collection values()         // 返回 map 中所包含值的 Collection 视图。

    // 删除 Collection 中的 value 元素还将删除 Map 中相应的映射(键和值)

    Set entrySet()             // 返回 Map 中所包含映射的 Set 视图(键值对)。

    Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问 Map.Entry 对象的键元素和值元素

    关于 Map.Entry 接口

    Map 的 entrySet() 方法返回一个实现 Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键 / 值对。通过这个集合的迭代器,您可以获得每一个条目 ( 唯一获取方式 ) 的键或值并对值进行更改。

    (1) Object getKey(): 返回条目的关键字

       (2) Object getValue(): 返回条目的值

       (3) Object setValue(Object value): 将相关映像中的值改为 value ,并且返回旧值

    当条目通过迭代器返回后,除非是迭代器自身的 remove() 方法或者迭代器返回的条目的 setValue() 方法,其余对源 Map 外部的修改都会导致此条目集变得无效,同时产生条目行为未定义。

    4,  Map 访问和测试方法:这些方法检索有关 Map 内容的信息但不更改 Map 内容。

    get(Object key)             // 返回与指定键关联的值 及此对象,若无,返回 null 。

    boolean containsKey(Object key)     // 如果 Map 包含指定键的映射,则返回 true

    boolean containsValue(Object value)  // 若此 Map 将一个或多个键映射到指定值,返回 true

    isEmpty()                // 如果 Map 不包含键 - 值映射,则返回 true

    int size()                  // 返回 Map 中的键 - 值映射的数目

    几乎所有通用 Map 都使用哈希映射。 这是一种将元素映射到数组的非常简单的机制,您应了解哈希映射的工作原理,以便充分利用 Map 。

    哈希映射结构由一个存储元素的内部数组组成。 由于内部采用数组存储,因此必然存在一个用于确定任意键访问数组的索引机制。 实际上,该机制需要提供一个小于数组大小的整数索引值(即余数)。 该机制称作哈希函数。 在 Java 基于哈希的 Map 中,哈希函数将对象转换为一个适合内部数组的整数。您不必为寻找一个易于使用的哈希函数而大伤脑筋: 每个对象都包含一个返回整数值的 hashCode() 方法。 要将该值映射到数组,只需将其转换为一个正值,然后在将该值除以数组大小后取余数即可。

    哈希函数将任意对象映射到一个数组位置,但如果两个不同的键映射到相同的位置,情况将会如何? 这是一种必然发生的情况。 在哈希映射的术语中,这称作冲突。 Map 处理这些冲突的方法是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表。

    图示:

      



    迭代器(Iterator)

      迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

      Java中的Iterator功能比较简单,并且只能单向移动:

      (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

      (2) 使用next()获得序列中的下一个元素。

      (3) 使用hasNext()检查序列中是否还有元素。

      (4) 使用remove()将迭代器新返回的元素删除。

      Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

      

      List接口有一个特有的方法,listIterator

       使用Iterator迭代器缺点

        1. ListIteratoradd()方法,可以向List中添加对象,而Iterator不能

      2. ListIteratorIterator都有hasNext()next()方法,可以实现顺序向后遍历,但是ListIteratorhasPrevious()previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

      3. ListIterator可以定位当前的索引位置,nextIndex()previousIndex()可以实现。Iterator没有此功能。

      4. 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

  • 相关阅读:
    Device Application Binding Manager---绑定管理
    Compile Options--编译选项
    [转] FPGA资料常用网站下载
    HAL层简介
    HAL层三类函数及其作用
    有关zstack的osal机制的理解
    bind与command---绑定之命令理解
    bind与command---绑定之命令理解-1
    zstack中事件加入到任务的方式
    Java常见错误列表
  • 原文地址:https://www.cnblogs.com/xiaotangtang/p/4912820.html
Copyright © 2011-2022 走看看