例如,如果我在List<Integer>
上运行此操作,它会按预期工作(删除前5个元素),但是当我在对象列表上运行它时,没有任何反应(列表保持不变)。< / p>
list.subList(0, 5).clear();
我的课程是一个没有实施equals
或hashCode
的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:实际上一切都按预期工作,不知道我怎么看不到(被结果数量搞糊涂了)。抱歉误报:)这个问题可以删除。
答案 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
之间的部分视图。 (如果fromIndex
和toIndex
相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的非结构更改在此列表中,反之亦然。
清算清单不是非结构性变更;只更改列表中的元素是非结构性更改。
这与您的POJO是否具有equals
或hashCode
方法无关。
编辑 - 我刚用ArrayList
尝试了它,它确实有用(不仅用Integer
,还用我自己的对象作为列表元素)。
答案 2 :(得分:0)
我能想到的两件事是:
list.sublist(0, 5)
会返回一个空列表,因此.clear()
不执行任何操作。
不确定您正在使用的List实现的内部工作方式(ArrayList,LinkedList等),但实现equals
和hashCode
可能很重要。
我有一个类似于Maps的问题,其中HashMap肯定需要hashCode实现。
答案 3 :(得分:0)
您是否尝试手动创建List
个对象并执行相同的操作(没有Hibernate)?我觉得这可能与Hibernate的延迟数据加载有关...如果你还没有读回返回的List
中的数据,它可能还没有被加载(因为子列表本身只是视图)。在这种情况下,clear
可能无能为力。
答案 4 :(得分:0)
从Hibernate返回的List是否可能无法修改?即由Collections.unmodifiableList()
包装