Нашел ли я ошибку в java.util.ArrayList.containsAll? - PullRequest
0 голосов
/ 19 апреля 2011

В Java у меня есть два списка:

List<Satellite> sats = new ArrayList<Satellite>();
List<Satellite> sats2 = new ArrayList<Satellite>();

Satellite sat1 = new Satellite();
Satellite sat2 = new Satellite();

sats.add(sat1);

sats2.add(sat1);
sats2.add(sat2);

Когда я делаю следующий метод содержит в первом списке метод containsAll:

sats.containsAll(sats2); //Returns TRUE!

Возвращает true.Но первый список (sats) содержит только 1 элемент, а второй список содержит 2. Поэтому даже невозможно, чтобы первый список (sats) содержал все элементы из второго списка (sats2).Любая идея, почему или это ошибка в Java JDK?

Я прочитал в другом вопросе StackOverflow, что это не самый эффективный способ сделать что-то подобное, так что если у кого-то есть предложения о том, каксделайте его более производительным, что было бы здорово!

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 19 апреля 2011

Как указал @Progman, вы, вероятно, переопределяете метод equals в Satellite.

Программа, приведенная ниже, печатает false.

import java.util.*;

class Satellite {
}

class Test {
    public static void main(String[] args) {
        List<Satellite> sats = new ArrayList<Satellite>();
        List<Satellite> sats2 = new ArrayList<Satellite>();

        Satellite sat1 = new Satellite();
        Satellite sat2 = new Satellite();

        sats.add(sat1);

        sats2.add(sat1);
        sats2.add(sat2);

        System.out.println(sats.containsAll(sats2));
    }
}

( ideone.com demo )

Я предлагаю распечатать содержимое двух списков и убедиться, что оно соответствует ожидаемому.

1 голос
/ 03 марта 2014

Слишком поздно для ответа, но вторая часть вашего вопроса - более эффективный способ состоит в том, что содержит следующее: CollectionUtils.isSubCollection (subSet, superSet) То есть O (n ^ 2) против O (n) сложности

1 голос
/ 19 апреля 2011

Для многих классов имеет смысл, что два объекта, созданные одинаковым образом (например, new Satellite()), будут считаться равными. Имейте в виду, что containsAll не заботится о количестве копий объекта, который содержит Collection, просто он содержит по крайней мере один из каждого отдельного элемента в Collection, который дано. Так, например, если бы у вас был List a, который содержал [A, A], и список b, который просто содержал [A], b.containsAll(a) и a.containsAll(b), оба возвращали бы true. Это, вероятно, аналогично тому, что здесь происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...