【问题标题】:When to use a Map instead of a List in Java?何时在 Java 中使用 Map 而不是 List?
【发布时间】:2011-04-15 19:08:54
【问题描述】:

我没有理解 Java 中的地图。什么时候推荐使用 Map 而不是 List?

【问题讨论】:

    标签: java list dictionary


    【解决方案1】:

    假设您有一群学生,他们有姓名和学生证。如果将它们放在一个列表中,找到 student_id = 300 的学生的唯一方法是查看列表中的每个元素,一次一个,直到找到合适的学生。

    使用地图,您可以将每个学生的 ID 与学生实例相关联。现在你可以说,“让我学生 300”并立即让那个学生回来。

    当您需要从集合中挑选特定成员时,请使用地图。在没有意义的情况下使用列表。

    假设您有完全相同的学生实例,但您的任务是生成所有学生姓名的报告。您可以将它们放在列表中,因为不需要挑选个别学生,因此不需要地图。

    【讨论】:

    • +1 不引用 javadoc 并提供说明性示例 :)
    • 这在技术上是不正确的。如果学生 id 映射到索引,例如id 300 -> 299 [index] 它是一个常数时间查找
    • 我没有说它是,但是你所做的更广泛的陈述不太正确(从理论的角度来看)
    • @Woot4Moo 如果学生 ID 是字符串而不是数字怎么办?
    • @user2520215 什么?
    【解决方案2】:

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

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

    不同之处在于它们是不同的。 Map 是键/值的映射,是项目列表的列表。

    【讨论】:

    • 你忘了列表可以包含重复项
    • 列表是否有序?或者“有序”是否意味着与“排序”不同的东西。不想吹毛求疵...
    • java doc 说下令,我几乎把同样的东西托尼。
    • @Tony:已排序!=已排序。对于有序集合,元素具有 (y) 顺序(这对程序员来说是显而易见的,并且通常可以由程序员操作)。列表是有序的,例如LinkedList 中的每一项都指向下一项。对于已排序的集合,项目的顺序由项目的比较确定,并始终保持排序。
    【解决方案3】:

    映射用作键和值的关联。使用列表,您基本上只有值。
    List 中的索引始终是 int,而 Map 中可以有另一个 Object 作为键。


    资源:

    【讨论】:

      【解决方案4】:

      取决于您的性能问题。 Map 更明确地 HashMap 将保证 O(1) 的插入和删除。 List 最坏的情况是 O(n) 才能找到一个项目。因此,如果您能详细说明您的方案是什么,我们可能会提供更多帮助。

      【讨论】:

        【解决方案5】:

        修改Random AccessSequential Access Data Structures 可能是个好主意。它们都具有不同的运行时复杂性,并且适用于不同类型的上下文。

        【讨论】:

          【解决方案6】:

          我认为您希望如何访问数据的问题很多。使用地图,您可以使用已知键“直接”访问您的项目,在列表中您必须搜索它,如果它已排序。

          比较:

          List<MyObject> list = new ArrayList<MyObject>();
          //Fill up the list
          // Want to get object "peter"
          for( MyObject m : list ) {
           if( "peter".equals( m.getName() ) {
              // found it
           }
          }
          

          在地图中你可以输入

          Map<String, MyObject> map = new HashMap<String, MyObject>();
          // Fill map
          MyObject getIt = map.get("peter");
          

          如果您有数据要处理并且无论如何都需要处理所有对象,那么您需要一个列表。如果您想处理具有已知键的单个对象,则映射更好。 它不是完整的答案(只是我的 2 ......),但我希望它可以帮助你。

          【讨论】:

            【解决方案7】:

            当您想要映射而不是列表时。这些接口的名称是有意义的,你不应该忽略它。

            当您希望数据结构表示键到值的映射时,请使用映射。如果您希望数据以任意、有序的格式存储,请使用列表。

            【讨论】:

            • 这就像在它自己的定义中使用一个词。这不是一个很有帮助的答案...
            • 不,是指出那些接口的名字是有意义的,你不应该忽略它。
            • 添加了您的评论和更多信息,然后删除了我的反对意见。
            【解决方案8】:

            MapList 有不同的用途。

            List 保存项目集合。已订购(您可以按索引获取项目)。

            Map 持有映射键 -> 值。例如。将人员映射到位置:“JBeg”->“程序员”。它是无序的。您可以通过键获取值,但不能通过索引。

            【讨论】:

            • 地图的Treemap实现不是无序的。
            • 已排序!= 已排序
            【解决方案9】:

            地图存储具有唯一键的数据对象,因此可以快速访问存储的对象。您可以使用 ConcurrentHashMap 在多线程环境中实现并发。 而列表可能存储重复数据,您必须遍历数据元素才能访问特定元素,因此对存储对象的访问速度较慢。 您可以根据需要选择任何数据结构。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-07-11
              • 2017-03-18
              • 1970-01-01
              • 2015-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多