ArrayList.contains()有时会在等于字符串时返回false

时间:2015-07-24 08:35:18

标签: java collections

我的“缓存”列表出了点问题:

private static List<String> urlsCacheList = new ArrayList<String>();
...
 private static void parseUrlsToQueue(Content content){
        String str = content.toString();
        Pattern p = Pattern.compile(CSS_JS_PATTERN);
        Matcher m = p.matcher(str);
        while (m.find()) {
            String link = m.group();
            if(link.equals("http://static.gazeta.ru/nm2012/css/new_common_css_pda54.css")){
                LOG.warn("******************cache CONTAINS STRING http://static.gazeta.ru/nm2012/css/new_common_css_pda54.css " + urlsCacheList.contains(link) + " ;" + link +";" );
            }

            if(!urlsCacheList.contains(link)){
                urlsCacheList.add(link);
                queue.add(link);
            }
        }
    }

因此,经过一些迭代urlsCacheList.contains(link)在等于​​链接上返回false,并且

LOG.warn("******************cache CONTAINS STRING http://static.gazeta.ru/nm2012/css/new_common_css_pda54.css " + urlsCacheList.contains(link) + " ;" + link +";" );

打印: cache CONTAINS STRING http://static.gazeta.ru/nm2012/css/new_common_css_pda54.css false ;http://static.gazeta.ru/nm2012/css/new_common_css_pda54.css;

但它主要在相同的字符串上返回true,每次30或40次迭代返回false;

UPDATE1: 对不起伙计在我看来这个问题在另一个地方,我从Fetcher.class中调用parseUrls()方法:

..
ContentParser.parseUrlsToQueue(content);
..

所以经过一些迭代之后,我的urlsCacheList只是重新初始化为null,因为自己的类重新创建;

1 个答案:

答案 0 :(得分:0)

是否可以打印未通过包含检查的字符串的字符串对象哈希id。我想这可能是因为为少数字符串创建了一个新的String对象,因此它的行为就像这样。

一种解决方案是调用String.intern()方法来解决这个问题。