【问题标题】:Use of contains in Java ArrayList<String>Java ArrayList<String> 中包含的使用
【发布时间】:2011-04-26 00:11:16
【问题描述】:

如果我有一个 String 的 ArrayList 构成 Java 中的类的一部分,如下所示:

private ArrayList&lt;String&gt; rssFeedURLs;

如果我想在包含上述ArrayList的类中使用方法,使用ArrayList contains来检查这个ArrayList中是否包含String,我相信我应该可以这样做:

if (this.rssFeedURLs.contains(rssFeedURL)) {

其中 rssFeedURL 是一个字符串。

我是对还是错?

【问题讨论】:

  • 如果您已经有代码,为什么不试试呢?如果元素在列表中,包含返回 true,否则返回 false。
  • 我已经尝试过了,但由于某种原因它不起作用。当我尝试向 ArrayList 添加条目时,我首先检查包含以防止重复,但我得到一个空指针。我不明白为什么?
  • 你需要实例化 ArrayList
  • @Mr Morgan 您的评论将对原始问题有所帮助。提供尽可能多的相关细节有助于其他人回答您的问题。提出一般性问题会产生一般性答案,提出具体问题(包括代码甚至更好)会产生具体答案。干杯,欢迎来到 Stackoverflow。
  • @Mr Morgan:你的“private ArrayList rssFeedURLs”只声明了一个引用,添加“= new ArrayList()”来创建一个新的ArrayList实例

标签: java arraylist


【解决方案1】:

你是对的。 ArrayList.contains() 测试equals(),而不是对象标识:

当且仅当此列表返回 true 包含至少一种元素 e 这样 那 (o==null ? e==null : o.equals(e))

如果您遇到 NullPointerException,请验证您是否在构造函数或声明中初始化了列表。例如:

private List<String> rssFeedURLs = new ArrayList<String>();

【讨论】:

    【解决方案2】:

    是的,这应该适用于字符串,但如果您担心重复,请使用Set。此集合可防止重复,而您无需执行任何操作。 HashSet 可以使用,但它是无序的,因此如果要保留插入顺序,请使用 LinkedHashSet

    【讨论】:

    • 你的意思是LinkedHashSet,而不是LinkedListSet
    • 公平点,但如果列表的目的是避免双重处理而不是双重实际列表中的条目,则它没有多大用处。
    【解决方案3】:

    你说得对,它应该起作用;也许你忘了实例化一些东西。你的代码是这样的吗?

    String rssFeedURL = "http://stackoverflow.com";
    this.rssFeedURLS = new ArrayList<String>();
    this.rssFeedURLS.add(rssFeedURL);
    if(this.rssFeedURLs.contains(rssFeedURL)) {
    // this code will execute
    }
    

    作为参考,请注意,如果您将此代码附加到上面,以下条件也将执行:

    String copyURL = new String(rssFeedURL);
    if(this.rssFeedURLs.contains(copyURL)) {
    // code will still execute because contains() checks equals()
    }
    

    即使 (rssFeedURL == copyURL) 为假,rssFeedURL.equals(copyURL) 也为真。 contains 方法关心 equals 方法。

    【讨论】:

      【解决方案4】:

      也许您需要发布导致异常的代码。如果以上就是您所拥有的,那么您可能只是未能真正初始化数组。

      在这里使用包含应该可以工作。

      【讨论】:

        【解决方案5】:

        你的问题不是很清楚。

        • 您的代码到底在做什么?提供更多代码。
        • 您遇到了什么错误?

        你说你得到一个空指针。您不能将空指针作为contains() 返回的值。

        但是,如果您的列表尚未初始化,您可以获得NullPointerException。通过现在阅读您的问题,我会说您在此处显示的内容是正确的,但也许您只是没有实例化列表。

        为此(如果列表中没有提要 URL,则添加提要 URL):

        if (!this.rssFeedURLs.contains(rssFeedURL)) {
            this.rssFeedURLs.add(rssFeedUrl);
        }
        

        那么这个声明就可以了:

        private ArrayList<String> rssFeedURLs = new ArrayList<String>();
        

        或稍后初始化您的列表,但在尝试访问其方法之前:

        rssFeedUrls = new ArrayList<String>();
        

        最后...你真的需要List 吗?如果您不想重复,也许Set 会更好。如果保留顺序很重要,请使用LinkedHashSet

        【讨论】:

          【解决方案6】:

          对...使用字符串...当您偏离原语或字符串时,情况会发生变化,您需要实现 hashcode/equals 以获得所需的效果。

          编辑:初始化您的ArrayList&lt;String&gt;,然后尝试添加一个项目。

          【讨论】:

          • 什么意思?一方面,字符串无论如何都不是原语——其次,这个习惯用法确实适用于任何对象(只要它的equalshashcode 方法正确实现)。
          • 正确但没有实现equals/hashcode默认情况下它不会工作(因为OP会理论化)......并且基于这个问题我猜OP显然不知道......是的,字符串不是原语,但是当您偏离字符串和/或原语时,您需要实现哈希码/等于以获得预期的结果。
          • Integer/Double/Boolean 不是基元/字符串,它们已经提供了 equals 和 hashCode。
          • @Steve 还好我们澄清了这一点,请大家继续你的一天...生活现在可以继续前进...打哈欠
          【解决方案7】:

          你是对的。正如其他人所说,根据您的 cmets,您可能没有初始化 ArrayList。

          我的观点不同:您声称您正在检查重复项,这就是您调用 contains 方法的原因。尝试使用HashSet。它应该更有效 - 除非您出于任何原因需要保持 URL 的顺序。

          【讨论】:

            【解决方案8】:

            感谢大家这么快回答。我总是可以使用一组,但我现在可以使用 ArrayList。问题是在包含 ArrayList 的类的构造函数中,我不是说:

            public RSS_Feed_Miner() {
                ...
                this.rssFeedURLs = new ArrayList<String>();
                ... 
            }
            

            天啊!周五下午。

            【讨论】:

              【解决方案9】:
              ArrayList<String> newlyAddedTypes=new ArrayList<String>();
              
              .....
              
              newlyAddedTypes.add("test1");
              
              newlyAddedTypes.add("test1");
              
              newlyAddedTypes.add("test2");
              
              if(newlyAddedTypes.contain("test"){
              //called here
              }
              else{
              
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-07-12
                • 1970-01-01
                • 2017-03-08
                • 2017-05-25
                • 2017-08-30
                • 2012-07-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多