解惑

解己之惑,解人之惑

List的问题

今天遇到一个奇怪的问题,从一个List取一个SubList,然后对从SubList删除某些元素,然后再从List里面删除SubList里面剩余的元素,但是所有的删除都没有找到匹配的东西,并没有删除成功,但是原来的List出问题了,它的内容出现不规则的变化,有时候变成0,但是有时候不重新取数据的话还能恢复成原来的状态。
呵呵,怀疑这个是JDK的bug,但是没有时间验证了,做个记号。
现在的解决方法是拿到subList后再创建一个新的List,把SubList的内容加进去,这样就没有问题了。
从JDK的API看,从List得到SubList只是得到了原来的List的一个view,所以进行这些操作的时候原来的List和View之间在进行处理的时候可能有问题。

(Visited 221 times, 1 visits today)

9 Comments

  1. ^_^ 老刘终于又写笔记了

  2. 这个话题有意思,我也看了下JDK文档,应该就是和你说的是一个意思,只是一个view,所以对list本身进行修改了结构的操作时,会发生问题。

  3. 我写了个小例子,如下:
    import java.util.ArrayList;
    import java.util.List;

    class ListTest {
    public static void main(String[] args) {
    ArrayList al = new ArrayList(10);
    for (int i=0; i

  4. :em29: :em29: :em29:
    帖不上来

    简要说下我的例子的运行结果吧,
    从sublist中删除一个元素时,list中也没了
    从list中删除一个元素时,直接报java.util.ConcurrentModificationException

  5. 帖下JDK文档里的两句话
    The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa.

    The semantics of the list returned by this method become undefined if the backing list (i.e., this list) is structurally modified in any way other than via the returned list.

    第一段话说,非结构化的change使list和sublist互相影响,第二句话说,结构化change除非是发生在sublist上,如果是发生在list上,sublist的语义将是未定义的。我在list里删除一个元素时,直接报了并发异常。

  6. 老刘,你的地盘给我占领了 :em46: :em46: :em46:

  7. 我把那个例子发论坛里去了,有兴趣的可以去看看

  8. 哈哈,欢迎抢地盘啊。

    这个问题确实很有意思,sublist只能只读性的使用。
    因为是view,所以设置断点查看sublist的结果看到的还是list中的全部元素,只是使用
    size之类的方法时才会返回正确的结果。

  9. 我觉得sublist不仅可以只读性的使用
    我在例子里(例子我发在论坛里,这里帖不下)就操纵了sublist的元素,重新设置某个元素的值,还remove了一个子元素,这些变化都反映到了原来的list中,但在原来的list里remove一个元素时就报了某种并发异常

发表评论

邮箱地址不会被公开。 必填项已用*标注

© 2024 解惑

本主题由Anders Noren提供向上 ↑