Java:为什么subList(0,5).clear()不能对我的对象起作用?

时间:2010-04-30 18:24:54

标签: java collections

例如,如果我在List<Integer>上运行此操作,它会按预期工作(删除前5个元素),但是当我在对象列表上运行它时,没有任何反应(列表保持不变)。< / p>

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

我的课程是一个没有实施equalshashCode的pojo,如果这很重要的话。

更新 我使用的实现是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

UPDATE2:实际上一切都按预期工作,不知道我怎么看不到(被结果数量搞糊涂了)。抱歉误报:)这个问题可以删除。

5 个答案:

答案 0 :(得分:5)

它适用于我的机器 tm

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

,请告诉我们

答案 1 :(得分:3)

修改 - 看起来我错了,但无论如何都要留下原来的答案:

您确定它适用于List<Integer>吗?它不应该。

方法subList()会返回单独的List。如果从该列表中删除元素,则不应影响原始列表。 List.subList()的API文档说明了这一点:

  

返回此列表中指定的fromIndex,包含和toIndex之间的部分视图。 (如果fromIndextoIndex相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的非结构更改在此列表中,反之亦然。

清算清单不是非结构性变更;只更改列表中的元素是非结构性更改。

这与您的POJO是否具有equalshashCode方法无关。

编辑 - 我刚用ArrayList尝试了它,它确实有用(不仅用Integer,还用我自己的对象作为列表元素)。

答案 2 :(得分:0)

我能想到的两件事是:

  1. list.sublist(0, 5)会返回一个空列表,因此.clear()不执行任何操作。

  2. 不确定您正在使用的List实现的内部工作方式(ArrayList,LinkedList等),但实现equalshashCode可能很重要。 我有一个类似于Maps的问题,其中HashMap肯定需要hashCode实现。

答案 3 :(得分:0)

您是否尝试手动创建List个对象并执行相同的操作(没有Hibernate)?我觉得这可能与Hibernate的延迟数据加载有关...如果你还没有读回返回的List中的数据,它可能还没有被加载(因为子列表本身只是视图)。在这种情况下,clear可能无能为力。

答案 4 :(得分:0)

从Hibernate返回的List是否可能无法修改?即由Collections.unmodifiableList()

包装