Подтвердить что ты не робот

Когда вы вызываете remove (object o) на arraylist, как он сравнивает объекты?

Когда вы вызываете remove (object o) на arraylist в java, как он сравнивает объекты, чтобы найти правильный, который нужно удалить? использует ли указатель? или он сравнивает объекты с помощью интерфейса Comparable?

4b9b3361

Ответ 1

ArrayList remove() опирается на реализацию объектов метода Equal. Если реализация не была выполнена, объект удаляется Object реализацией Equals, которая действительно является сопоставлением указателей.

Из документации по ArrayList -

Более формально удаляет элемент с самым низким индексом я таким образом, что (o==null ? get(i)==null : o.equals(get(i))) (если такой элемент существует)

Документация по объекту Equal -

Метод equals для класса Object реализует наиболее различающееся возможное отношение эквивалентности для объектов; то есть для любых ненулевых опорных значений x и y этот метод возвращает true тогда и только тогда, когда x и y относятся к одному и тому же объекту (x == y имеет значение true).

Ответ 2

Вы всегда должны обращаться к API для такого рода информации.

ArrayList.remove(Object o): удаляет первое вхождение указанного элемента из этого списка, если он присутствует. Если список не содержит элемент, он не изменяется. Более формально удаляет элемент с самым низким индексом i таким образом, что (o==null ? get(i)==null : o.equals(get(i))) (если такой элемент существует).

Возможно, вы запутали это, например, TreeSet:

java.util.TreeSet: обратите внимание, что упорядочение, поддерживаемое набором (независимо от того, предоставлен явный компаратор), должно быть равнозначно, если это правильно реализовать интерфейс Set. (См. Comparable или Comparator для точного определения соответствия с равными.) Это происходит потому, что интерфейс Set определяется в терминах операции equals, но экземпляр TreeSet выполняет все сравнения элементов, используя его compareTo (или compare), поэтому два элемента, которые считаются равными этому методу, равны с точки зрения множества.

(К сожалению, например, TreeSet.remove сам метод не имеет никакого явного напоминания об упомянутом выше предостережении, но, по крайней мере, он заметно размещен на начало документации класса)


Иллюстративный пример

Следующий фрагмент иллюстрирует разницу в поведении между коллекциями, которые используют equals (например, ArrayList) и коллекции, которые используют compare/compareTo (например, TreeSet).

import java.util.*;

public class CollectionEqualsCompareTo {
    static void test(Collection<Object> col, Object o) {
        col.clear();
        col.add(o);
        System.out.printf("%b %b %b %b%n",
            col.contains(o),
            col.remove(o),
            col.contains(o),
            col.isEmpty()
        );
    }
    public static void main(String[] args) {
        Object broken1 = new Comparable<Object>() {
            // Contract violations!!! Only used for illustration!
            @Override public boolean equals(Object o)    { return true; }
            @Override public int compareTo(Object other) { return -1;   }
        };
        Object broken2 = new Comparable<Object>() {
            // Contract violations!!! Only used for illustration!
            @Override public boolean equals(Object o)    { return false; }
            @Override public int compareTo(Object other) { return 0;     }
        };
        test(new ArrayList<Object>(), broken1); // true true false true
        test(new TreeSet<Object>(),   broken1); // false false false false
        test(new ArrayList<Object>(), broken2); // false false false false
        test(new TreeSet<Object>(),   broken2); // true true false true
    }
}

Ответ 3

docs ответит на ваш вопрос:

Удаляет один экземпляр указанный элемент из этого сбор, если он присутствует (необязательно операция). Более формально удаляет элемент e такой, что (o==null ? e==null : o.equals(e)), если сбор содержит один или несколько таких элементов.

Ответ 4

Он использует equals()

из docs:

Удаляет первое вхождение указанного элемента из этого списка, если оно присутствует. Если список не содержит элемент, он не изменяется. Более формально удаляет элемент с самым низким индексом я таким образом, что (o == null? Get (i) == null: o.equals(get (i))) (если такой элемент существует). Возвращает true, если этот список содержит указанный элемент (или, что то же самое, если этот список изменился в результате вызова).