Java: почему subList (0, 5) .clear () не работает на моих объектах? - PullRequest
1 голос
/ 30 апреля 2010

Если я, например, запускаю эту операцию на List<Integer>, она работает как положено (удаляет первые 5 элементов), но когда я запускаю ее в списке моих объектов, ничего не происходит (список остается прежним).

list.subList(0, 5).clear();

Мой класс - это pojo, который не реализует equals или hashCode, если это имеет значение.

UPDATE: Я использую реализацию ArrayList, которая возвращается из запроса Hibernate. На самом деле нечего показать. Подсписок не возвращает пустой список.

Вот пример для тех, кто не верит, что он работает со списком целых чисел:

    List<Integer> testList = new ArrayList<Integer>();
    for(int i=0;i<10;i++) {
        testList.add(i);
    }
    testList.subList(0, 5).clear();
    for(int i=0;i<testList.size();i++) {
        System.out.print(testList.get(i)+" ");
    }

Результат 5 6 7 8 9

ОБНОВЛЕНИЕ2: На самом деле все работает, как и ожидалось, не знаю, как я не мог этого увидеть (смутило количество результатов). Извините за ложную тревогу :) Этот вопрос можно удалить.

Ответы [ 5 ]

5 голосов
/ 30 апреля 2010

работает на моей машине тм

import java.util.*;
import static java.lang.System.out;

class SubListExample {
    public static void main( String [] args ) {
        List<RandomObject> testList = new ArrayList<RandomObject>();
        for(int i=0;i<10;i++) {
            testList.add( new RandomObject() );
        }

        System.out.println( "Before: " + testList );
        testList.subList(0, 5).clear();
        System.out.println( "After: "+ testList );
    }
}
class RandomObject {
    static Random generator = new Random();
    int id = generator.nextInt(100);
    public String toString(){
        return "ro("+id+")";
    }
}

Производит:

$ java SubListExample
Before: [ro(68), ro(97), ro(48), ro(45), ro(43), ro(69), ro(45), ro(8), ro(88), ro(40)]
After: [ro(69), ro(45), ro(8), ro(88), ro(40)]

Итак, проблема не в ArrayList и не в ваших объектах.

Я не думаю, что Hibernate возвращает старую ArrayList (может быть, это так)

Попробуйте напечатать

 System.out.println( "That hibernate list.class.name = "
        + listReturnedByHibernate.getClass().getName() );

И дайте нам знать, если это действительно ArrayList

3 голосов
/ 30 апреля 2010

edit - Похоже, я ошибся, но все равно оставляю свой первоначальный ответ здесь:

Вы уверены, что он работает с List<Integer>? Это не должно.

Метод subList() возвращает отдельный List. Если вы удалите элементы из этого списка, это не должно повлиять на исходный список. Документы API для List.subList() говорят так:

Возвращает представление части этого списка между указанными fromIndex включительно и toIndex эксклюзивом. (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке, и наоборот.

Очистка списка не является неструктурным изменением; только изменения элементов в списке являются неструктурными изменениями.

Это не имеет никакого отношения к тому, имеет ли ваш POJO equals или hashCode методы или нет.

edit - Я только что попробовал его с ArrayList, и он работает (не только с Integer, но и с моим собственным объектом в качестве элемента списка).

0 голосов
/ 30 апреля 2010

Возможно ли, что список, возвращаемый из Hibernate, не подлежит изменению? т.е. обернутый Collections.unmodifiableList ()

0 голосов
/ 30 апреля 2010

Вы пытались создать List ваших объектов вручную и делать то же самое (без Hibernate)?Мне кажется возможным, что это связано с ленивой загрузкой данных Hibernate ... если вы еще не прочитали данные в возвращенном List, возможно, они еще не были загружены (поскольку сами списки являются просто представлениями)В этом случае, возможно, clear ничего не сделает.

0 голосов
/ 30 апреля 2010

Я могу придумать две вещи:

  1. list.sublist(0, 5) возвращает пустой список, поэтому .clear() ничего не делает.

  2. Не уверен во внутренней работе используемой реализации List (ArrayList, LinkedList и т. Д.), Но реализация equals и hashCode может быть важной. У меня была похожая проблема с Картами, когда HashMap определенно нужна реализация hashCode.

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