Java - ArrayList удаление дубликатов - PullRequest
0 голосов
/ 04 декабря 2011

В следующем примере:

public static void main(String[] args){

        List<String> list = new ArrayList<String>();

        list.add("hi");
        list.add("hi");
        list.add("hi");

        list.remove("hi");

        System.out.println(list); //prints [hi, hi]

}

ArrayList уменьшается на единицу, но какой из них он удаляет?Удаляет ли последний вставленный или самый ранний вставленный?

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Из документов - Removes the first occurrence of the specified element from this list, if it is present.

4 голосов
/ 04 декабря 2011

Поскольку задокументировано List#add() для добавления к концу списка, а List#remove(Object) задокументировано для возврата сначала соответствующий элемент, с которым он сталкивается, ваш звонок выше удалит самый ранний вставленный экземпляр строки "привет".

Поскольку печатное представление трех объектов в списке одинаково, трудно увидеть разницу в поведении. Однако, если вы посмотрите на адреса экземпляров в отладчике, отметив, какой из них вошел в список первым, вы убедитесь, что это также первый & mdash; и единственный & mdash; удаляемый.

В вашем случае, учитывая, что вы используете строковые литералы, они интернированы компилятором (согласно §3.10.5 JLS ), так что вы увидите три из одного экземпляра присутствуют в вашем списке. Чтобы создать отдельные String экземпляры, попробуйте изменить три вызова вставки на следующие:

/* not final */ String h = "h";
list.add(h + "i"); // not interned, instance 1
list.add(h + "i"); // not interned, instance 2
list.add(h + "i"); // not interned, instance 3

Сравните то, что вы видите в отладчике, используя эти операторы, с вашей исходной программой. Вы видите разницу?

Обратите внимание, что если String экземпляр h выше объявлен как final , то все три объединения будут фактически интернированы, что приведет к тому же 1036 * String экземпляр добавляется в список три раза. Спасибо @xehpuk за исправление моей первоначальной ошибки в квалификаторе final .

2 голосов
/ 04 декабря 2011

Он удалит первый встреченный случай, поэтому первый добавленный вами.

...