日期:2014-05-20  浏览次数:20904 次

关于containsAll方法的问题???
发生了一个好奇怪的问题,我用List里面的一个containsAll方法来比较2个list是不是一样的,结果明明一样的2个list他居然给我返回一个false
Java code

public static boolean ListsCompare(List idFromDB, List idFromSolrSearch) {
        System.out.println("###########idFromDB   " + idFromDB.size()
                + "    ###########");
        for (int i = 0; i < idFromDB.size(); i++) {
            System.out.println(idFromDB.get(i));
        }
        System.out.println("###########idFromSolrSearch     "
                + idFromSolrSearch.size() + "    ###########");
        for (int i = 0; i < idFromSolrSearch.size(); i++) {
            System.out.println(idFromSolrSearch.get(i));
        }
        System.out.println("idFromDB:" + idFromDB);
        System.out.println("idFromSolrSearch:" + idFromSolrSearch);
        if (idFromDB.containsAll(idFromSolrSearch)) {
            renderJSON(new Result("一样的!"));
            return true;
        } else {
            renderJSON(new Result("不一样的"));
            return false;
        }
    }


控制台打印的信息是:
###########idFromDB 1 ###########
2566
###########idFromSolrSearch 1 ###########
2566
idFromDB:[2566]
idFromSolrSearch:[2566]

我看过api了:
Java code

containsAll
boolean containsAll(Collection<?> c)如果列表包含指定 collection 的所有元素,则返回 true。 

指定者:
接口 Collection<E> 中的 containsAll
参数:
c - 要在列表中检查其包含性的 collection 
返回:
如果列表包含指定 collection 的所有元素,则返回 true 
抛出: 
ClassCastException - 如果指定 collection 中的一个或多个元素的类型和此列表不兼容(可选) 
NullPointerException - 如果指定的 collection 包含一个或多个 null 元素,并且此列表不允许 null 元素(可选),或者指定的 collection 为 null
另请参见:
contains(Object)


我写了一个测试:
Java code

public class testDateTime {
    public static void main(String args[]) {
        List<Long> idFromDB = new ArrayList();
        List<Long> idFromSolrSearch = new ArrayList();
        idFromDB.add(1L);
        idFromDB.add(2L);
        idFromDB.add(3L);
        idFromSolrSearch.add(1L);
        idFromSolrSearch.add(2L);
        if (idFromDB.containsAll(idFromSolrSearch)) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    }
}


为什么这个又是打印true的呢?我是新手小白,请老师指点我一下,谢谢

------解决方案--------------------
看一下Java享元模式。
考虑整数-128到127,而这个范围是在一个字节之中。这个范围的整数在开发我们可能要经常用到。所以呢,为了执行效率和节省内存空间。大家调用的时候,创建的对象值在这个范围中时,java所指向的是同一个对象
------解决方案--------------------
junit测试代码

Java code
@Test
    public void containsAllTest(){
        List idFromDB = new ArrayList();
        List idFromSolrSearch = new ArrayList();
        idFromDB.add(1);
        idFromSolrSearch.add("1");
        System.out.println("idFromDB: "+idFromDB);
        System.out.println("idFromSolrSearch: "+idFromSolrSearch);
        System.out.println(idFromDB.containsAll(idFromSolrSearch));
    }