【问题标题】:What is the Best Way to Store some data in Java? (Array vs ArrayList)在 Java 中存储一些数据的最佳方式是什么? (数组与数组列表)
【发布时间】:2011-09-26 17:56:24
【问题描述】:

所以目前,我正在从 java 中的 XML 文件中提取两个不同的属性(对于我的项目),它们彼此相关,然后将它们打印到控制台。但是,我希望能够以引用一个值将检索它对应的对应项的方式存储这些。例如:

Id: rId11 & Target: image3
Id: rId10 & Target: image2
Id: rId9 & Target: image1

使用这 3 个值,我想要一种存储每一行​​的方法,但是当我引用“rId”时,我可以获得它对应的“目标”值。我正在考虑使用数组或数组列表,但我不确定哪个更适合我的目的,或者我将如何只引用一个值并获取另一个值。谁能给我一些建议?提前谢谢你。

【问题讨论】:

    标签: java arrays arraylist store


    【解决方案1】:

    如果您的密钥是唯一的,请使用Map

    Map<String, String> mak = new HashMap<String, String>();
    map.put("rId11","image3");
    map.put("rId10","image2");
    map.put("rId9","image1");
    

    参考:

    否则,创建一个包含键和值的自定义对象,并创建一个List(或Set???)。

    public class Entry {
        private final String id;
        private final String value;
        public Entry(String id, String value) {
            this.id = id; this.value = value;
        }
        public String getId() { return id; }
        public String getValue() { return value; }
        // also implement equals() and hashCode(), please
    }
    
    List<Entry> entries = new ArrayList<Entry>();
    entries.add(new Entry("rId11","image3"));
    

    参考:

    【讨论】:

    • 非常感谢!我决定使用您的 HashMap 答案,但对我正在做的事情进行了一些细微的修改。对 Java 来说相当新,所以在你提到它之前我什至没有考虑映射。还要感谢为您的意见做出贡献的其他所有人。 :)
    • @This 0ne Pr0grammer:不客气。如果您是 Java 新手,您应该自己阅读 Java 教程 download.oracle.com/javase/tutorial 并阅读 Josh Bloch 的 Effective Java (2nd Ed)。
    【解决方案2】:

    使用Map,ID 为键,目标为值。请注意, Map 是一个接口,因此仅定义行为。您将需要选择一个特定的实现,例如 HashMap。

    【讨论】:

      【解决方案3】:

      我认为 java.util.HashMap 更适合此要求,尤其是在不需要排序的情况下。

      // not sure what types these are but this would work better
      Map<String, String> m = new HashMap<String, String>();
      m.put("rId11", "image3");
      String other = m.get("rId11");
      

      【讨论】:

        【解决方案4】:

        如果我理解正确,您希望能够寻找“rId10”之类的东西并获得值“image2”(仅此而已)。

        如果是这种情况,我认为最好的(就速度而言)和最简单的解决方案将是哈希表(java.util.Hashtable)——也要小心使用 Java 泛型(Java 1.5 之后)。也可以查看http://en.wikipedia.org/wiki/Hash_table

        【讨论】:

        【解决方案5】:

        你对你想要什么有点模棱两可。如果要根据给定键查找值,则将这些对存储在HashMap(更快)或Hashtable(更慢但线程安全)中。

        原始数组(以及更高级的基于List 的集合,例如ArrayListVector)不适用于开箱即用的名称-值对。它们只是,嗯......列表。原始数组可以提供更高的性能,因为您可以避免创建对象,但更高级的 List 类型的集合可以更安全、更灵活。

        不过,听起来 (?) 就像您想要一个 Map 类型集合而不是 List 类型一。

        更新:顺便说一下,如果您使用地图,那么您仍然可以使用所有“rId”值的列表。实际上它将是 Set 数据类型,但这只是 List 的特殊表亲,不允许重复:

        Map<String, String> myMap = new HashMap<String, String>();
        myMap.put("rId11","image3");
        // ... additional put's for the other values
        
        Set<String> myRids = myMap.keySet();
        for(String rId : myRids) {
           // do whatever you want with each rId one-by-one, etc
           // You could also use "myRids.iterator()" to work with an Iterator instead
        }
        

        【讨论】:

        • 请不要推荐 Vector 和 Hashtable。它们应该在几年前就被弃用了。阅读thismany other related questions 之一了解更多信息。
        • 哦,让我休息一下。是的,我有 99.999% 的把握这家伙不是在编写多线程应用程序。是的,即使在我自己的多线程开发中,自 2002 年左右以来我就没有使用过 Vector 或 Hashtable。但是,对于新手来说,这是一个常见的混淆来源,他们永远不会真正将其从标准库中删除。 . 所以我认为至少向新手解释一下那些看起来多余的类型是有用的。
        • 为了澄清最初的问题提问者......最好使用 HashMap 而不是 Hashtable,使用 ArrayList 而不是 Vector。后一种类型提供了一些神秘级别的保护,但它对大多数开发人员没有用处,并且会带来严重的性能损失。
        【解决方案6】:

        如果您的目标值的“键”是唯一的,并且只有一个目标映射到它们,那么我建议您改用 java.util.HashMap。您可以通过传入键来检索任何目标值。另外,您可以像遍历 ArrayList 一样遍历 HashMap。

        【讨论】:

          【解决方案7】:
          public class Item {
              private String id;
              private String target;
          
              public Item(String id, String target) {
                  this.id = id;
                  this.target = target;
              }
          
              public String getId() {
                  return this.id;
              }
          
              public String getTarget() {
                  return this.target;
              }
          }
          
           List<Item> items = new ArrayList<Item>();
           // or
           Map<String, Item> itemsIndexedById = new HashMap<String, Item>();
           // depending on your use-case
          

          阅读the Java tutorial about collections

          【讨论】:

            【解决方案8】:

            如果您需要动态添加元素,ArrayList 很有用

            【讨论】:

              猜你喜欢
              • 2014-07-21
              • 2020-04-08
              • 1970-01-01
              • 2021-10-22
              • 2016-08-09
              • 1970-01-01
              • 1970-01-01
              • 2013-07-22
              • 2011-08-09
              相关资源
              最近更新 更多