代码之家  ›  专栏  ›  技术社区  ›  Venkat

Java和HashMap之间的区别?

  •  41
  • Venkat  · 技术社区  · 15 年前

    在Java中, ArrayList HashMap 用作集合。但我不明白在什么情况下我们应该使用 阵列列表 什么时候用 哈希图 . 他们之间的主要区别是什么?

    5 回复  |  直到 8 年前
        1
  •  76
  •   DaveJohnston    15 年前

    您具体询问的是关于arraylist和hashmap的问题,但我认为为了完全理解正在发生的事情,您必须了解collections框架。因此,arraylist实现列表接口,hashmap实现映射接口。所以真正的问题是你什么时候想使用列表,什么时候想使用地图。这是Java API文档帮助很大的地方。

    名单:

    有序集合(也称为 顺序)。此界面的用户 精确控制 列出插入的每个元素。这个 用户可以通过 整数索引(在列表中的位置) 并搜索列表中的元素。

    地图:

    将键映射到值的对象。一 映射不能包含重复键; 每个键最多可以映射到一个值。

    因此,正如其他答案所讨论的,列表接口(array list)是使用索引访问的对象的有序集合,很像数组(在arraylist的情况下,顾名思义,它只是背景中的一个数组,但是处理数组a的很多细节为你重新处理)。当您想要保持事物的排序顺序(它们被添加的顺序,或者实际上是添加对象时您在列表中指定的位置)时,可以使用数组列表。

    另一方面,映射接受一个对象并将其用作另一个对象(值)的键(索引)。所以假设您有具有唯一ID的对象,并且您知道您希望在某个点上通过ID访问这些对象,地图将使这对您非常容易(并且更快/更有效)。哈希映射实现使用键对象的哈希值来定位其存储位置,因此不再保证值的顺序。然而,Java API中的其他类可以提供这一点,例如Link Khash映射,也可以使用哈希表来存储键/值对,还可以按照它们添加的顺序维护键的列表(Link KEdLIST),这样您就可以按照它们的顺序再次访问这些项。DDED(如果需要)。

        2
  •  16
  •   rjdkolb Stefan Isele - prefabware.com    8 年前

    如果使用 ArrayList ,必须使用索引访问元素( int 类型)。用一个 HashMap ,您可以通过另一种类型的索引(例如, String )

    HashMap<String, Book> books = new HashMap<String, Book>();
    // String is the type of the index (the key)
    // and Book is the type of the elements (the values)
    // Like with an arraylist: ArrayList<Book> books = ...;
    
    // Now you have to store the elements with a string key:
    books.put("Harry Potter III", new Book("JK Rownling", 456, "Harry Potter"));
    
    // Now you can access the elements by using a String index
    Book book = books.get("Harry Potter III");
    

    这是不可能(或更困难)的 阵列列表 . 访问 阵列列表 通过获取元素的索引号。

    所以,这意味着 哈希图 你可以使用你想要的每一种钥匙。

    另一个有用的例子是在游戏中:你有一组图像,你想翻转它们。因此,编写图像翻转方法,然后存储翻转结果:

    HashMap<BufferedImage, BufferedImage> flipped = new HashMap<BufferedImage, BufferedImage>();
    BufferedImage player = ...; // On this image the player walks to the left.
    BufferedImage flippedPlayer = flip(player); // On this image the player walks to the right.
    flipped.put(player, flippedPlayer);
    // Now you can access the flipped instance by doing this:
    flipped.get(player);
    

    你翻转了玩家一次,然后将其储存起来。您可以访问 BufferedImage 用一个 缓冲图像 作为键类型 哈希图 .

    希望你能理解我的第二个例子。

        3
  •  14
  •   Blaze Tama    10 年前

    不是一个Java特定的问题。似乎您需要一个关于数据结构的“入门”。尝试谷歌搜索“你应该使用什么数据结构”

    尝试此链接 http://www.devx.com/tips/Tip/14639

    从链接:

    下面是一些将最常用的数据结构与特定需求相匹配的提示。

    1. 何时使用哈希表?

    如果要以键值对的形式访问存储的数据,哈希表或类似的数据结构是很好的候选者。例如,如果您正在提取雇员的名称,那么可以将结果以哈希表的形式作为(名称、值)对返回。但是,如果要返回多个雇员的姓名,则直接返回哈希表不是一个好主意。请记住,这些键必须是唯一的,否则您以前的值将被覆盖。

    1. 何时使用列表或矢量?

    当您希望顺序访问甚至随机访问时,这是一个很好的选择。此外,如果最初数据大小未知,并且/或者将动态增长,那么使用列表或向量是合适的。例如,要存储JDBC结果集的结果,可以使用java.util.LinkedList。但是,如果要查找可调整大小的数组,请使用java.util.arraylist类。

    1. 何时使用数组?

    不要低估数组。大多数时候,当我们必须使用对象列表时,我们倾向于考虑使用向量或列表。但是,如果集合的大小已经知道并且不会改变,则可以将数组视为潜在的数据结构。访问数组元素比访问向量或列表更快。这很明显,因为你只需要一个索引。额外的get方法调用没有开销。

    4.组合

    有时,最好结合使用上述方法。例如,您可以使用哈希表列表来满足特定的需要。

    1. 设置类

    从JDK1.2开始,您还拥有set类,如java.util.treeset,这对于没有重复项的排序集很有用。关于这些类,最好的一点是它们都遵守特定的接口,这样您就不必担心细节了。例如,请查看以下代码。

      // ...
      List list = new ArrayList();
      list.add(
    
        4
  •  4
  •   Jon Skeet    15 年前

    将列表用于仅包含值的有序集合。例如,您可能有一个要处理的文件列表。

    使用从键到值的映射(通常是无序的)。例如,您可能有一个从用户ID到该用户详细信息的映射,这样您就可以有效地找到仅给定ID的详细信息。(您 能够 实施 Map 接口,只存储键列表和值列表,但通常会有一个更有效的实现- HashMap 例如,在内部使用散列表来获取分期O(1)键查找。)

        5
  •  4
  •   maxmcbyte    13 年前

    地图与清单。

    在映射中,您有键/值对。要访问一个值,您需要知道该键。键和持续存在的值之间存在关系,并且不是任意的。他们之间有某种联系。例:一个人的DNA是唯一的(键),一个人的名字(值)或一个人的SSN(键)和一个人的名字(值)有着很强的关系。

    在列表中,您所拥有的只是值(人名),要访问它,您需要知道它在列表(索引)中的位置才能访问它。但列表中的值的位置与其索引之间没有永久性的关系,是任意的。