リストのretainAllメソッドを正しく使用して交差を求める

7547 ワード

一、retainAll方法
public boolean retainAll(Collection> c) {
        //         
        return batchRemove(c, true);
    }

二、batchRemove方法の解析
このcollectionが呼び出しによって変更された場合はtrueを返します.
//  A     B   
     private boolean batchRemove(Collection> c, boolean complement) {
             //           
            final Object[] elementData = this.elementData;
            //w:             
            int r = 0, w = 0;
            //     
            boolean modified = false;
            try {
                //    A
                for (; r < size; r++)
                    //    B       A      
                    if (c.contains(elementData[r]) == complement)
                        //
                        elementData[w++] = elementData[r];
            } finally {
                //    c.contains()     
                if (r != size) {
                    //       
                    System.arraycopy(elementData, r,
                                     elementData, w,
                                     size - r);
                    //w     A length
                    w += size - r;
                }
                //    A       
                if (w != size) {
                    //     
                    for (int i = w; i < size; i++)
                        elementData[i] = null;
                    //          (add/remove)
                    modCount += size - w;
                    //         
                    size = w;
                    //   true
                    modified = true;
                }
            }
            return modified;
        }

1.modCount変数についての説明
AbstractListにはmodCount変数が含まれており、その初期値は0であり、セット内のコンテンツが変更されるたびに(add()、remove()などのメソッドを呼び出す)、modCountに1を加算する
2.戻り値の説明
集合A配列のサイズが変更されていない場合はfalseを返します.集合Aと集合Bが全く同じ集合であればfalseも返される.
    public static void main(String[] args) {
        ArrayList listA= new ArrayList();
        listA.add("Tom");
        ArrayList listB= new ArrayList();
        listB.add("Tom");
        System.out.println(listA.retainAll(listB)); //false
    }

2つの集合が交差していなくてもtrueが返されます.
public static void main(String[] args) {
        ArrayList listA= new ArrayList();
        listA.add("Tom");
        ArrayList listB= new ArrayList();
        listB.add("Jack");
        System.out.println(listA.retainAll(listB));//true
    }

したがって,集合Aの大きさが変わったときに返されるのはTrueであり,大きさが変わっていないときに返されるのはFalseであることを覚えておく.
三、retainAllの正しい使い方
public static void main(String[] args) {
        ArrayList listA= new ArrayList();
        listA.add("Tom");
        ArrayList listB= new ArrayList();
        listB.add("Tom");
        listA.retainAll(listB);
        if(listA.size()>0){
            System.out.println("           ");
        }else{
            System.out.println("            ");
        }
    }

1、まずretainAllを呼び出す方法
2.集合の大きさを判断することにより,交点があるか否かを決定する.メソッドが返すTrueとFalseでは判断できません.
転載先:https://www.cnblogs.com/lyajs/p/5737410.html