Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中HashMap和ArrayList的区别?_Java_Collections_Arraylist_Hashmap - Fatal编程技术网

Java中HashMap和ArrayList的区别?

Java中HashMap和ArrayList的区别?,java,collections,arraylist,hashmap,Java,Collections,Arraylist,Hashmap,在Java中,ArrayList和HashMap用作集合。但是我不明白在什么情况下应该使用ArrayList,在什么时候使用HashMap。它们之间的主要区别是什么?使用一个列表来创建一个有序的值集合。例如,您可能有一个要处理的文件列表 将映射用于从键到值的映射(通常是无序的)。例如,您可能有一个从用户ID到该用户详细信息的映射,因此您可以高效地查找仅给定ID的详细信息。(您可以通过只存储键列表和值列表来实现Map接口,但通常会有一个更高效的实现-HashMap在内部使用哈希表来获得分期付款的O

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

使用一个列表来创建一个有序的值集合。例如,您可能有一个要处理的文件列表


将映射用于从键到值的映射(通常是无序的)。例如,您可能有一个从用户ID到该用户详细信息的映射,因此您可以高效地查找仅给定ID的详细信息。(您可以通过只存储键列表和值列表来实现
Map
接口,但通常会有一个更高效的实现-
HashMap
在内部使用哈希表来获得分期付款的O(1)键查找,例如。)

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

试试这个链接

从链接:

以下是将最常用的数据结构与特定需求相匹配的一些技巧

  • 何时使用哈希表
  • 如果要以键值对的形式访问存储的数据,则哈希表或类似的数据结构是很好的候选者。例如,如果要获取员工的姓名,结果可以以哈希表的形式返回(姓名、值)但是,如果要返回多个员工的姓名,直接返回哈希表不是一个好主意。请记住,键必须是唯一的,否则您以前的值将被覆盖

  • 何时使用列表或向量
  • 当您需要顺序甚至随机访问时,这是一个很好的选择。此外,如果数据大小最初未知,和/或将动态增长,则使用列表或向量是合适的。例如,要存储JDBC结果集的结果,可以使用java.util.LinkedList。而如果您正在寻找可调整大小的数组,则可以使用e java.util.ArrayList类

  • 何时使用数组
  • 永远不要低估数组。大多数情况下,当我们必须使用对象列表时,我们倾向于考虑使用向量或列表。但是,如果集合的大小已知且不会改变,则可以将数组视为潜在的数据结构。访问数组元素的速度比访问向量或列表更快。这就是很明显,因为您只需要一个索引,不需要额外的get方法调用

    4.组合

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

  • 定级
  • 从JDK 1.2开始,您还可以设置类似java.util.TreeSet的类,这对于没有重复项的排序集非常有用。这些类的一个优点是它们都遵守特定的接口,因此您不必真正担心细节。例如,请看下面的代码

      // ...
      List list = new ArrayList();
      list.add(
    

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

    您翻转了播放器一次,然后将其存储。您可以使用
    BufferedImage
    作为
    HashMap
    的键类型访问
    BufferedImage


    我希望您能理解我的第二个示例。

    您是在专门询问ArrayList和HashMap,但我认为要完全理解正在发生的事情,您必须理解集合框架。因此ArrayList实现列表接口,HashMap实现映射接口。因此,真正的问题是何时要使用List和何时使用映射。这是JavaAPI文档非常有用的地方

    名单:

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

    地图:

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

    因此,正如其他答案所讨论的,列表接口(ArrayList)是使用索引访问的对象的有序集合,非常类似于数组(就ArrayList而言,顾名思义,它只是背景中的一个数组,但处理数组的许多细节都是为您处理的)。如果要保持事物的排序顺序(添加顺序,或者添加对象时指定的列表中的位置),可以使用ArrayList

    另一方面,映射将一个对象用作另一个对象(值)的键(索引)。因此,假设您有具有唯一ID的对象,并且您知道您将在某个时候通过ID访问这些对象,映射将使您非常轻松(并且更快/更高效)。HashMap实现使用密钥对象的哈希值来定位其存储位置,因此不再保证值的顺序。但是,Java API中还有其他类可以提供此功能,例如LinkedHashMap,它使用哈希表存储密钥/值对,还维护一个列表(LinkedList)按键的添加顺序显示,因此您始终可以按键的添加顺序(如果需要)再次访问这些项。

    映射与列表

    在映射中,您有键/值对。要访问值,您需要知道键。键和值之间存在一种关系,这种关系持续存在且不是任意的。它们以某种方式相互关联。例如:人的DNA是唯一的(键),并且
    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);