f***e 发帖数: 5443 | 1 java.util 的没法O(1)remove 一个元素,只能用o(n),因为他的Node是private的
我猜是因为这样比较不容易在并发的情况下出错
之前在c里面可以直接remove double linked list的元素,因为 pre, nxt 都在Node里
面,现在java, Node private了,没法做到
如果用iterator, 只要改变了 list中的任何一个元素,iterator 都失效了,没法作为
永久存储
这样没法和 HashMap等等配合工作
高手有啥建议? |
g*****g 发帖数: 34805 | 2 Iterator.remove() is an O(1) operation for LinkedList. If you have the
element and you want O(1) operation, you need to write your own double
linked list, which should be trivial enough.
【在 f***e 的大作中提到】 : java.util 的没法O(1)remove 一个元素,只能用o(n),因为他的Node是private的 : 我猜是因为这样比较不容易在并发的情况下出错 : 之前在c里面可以直接remove double linked list的元素,因为 pre, nxt 都在Node里 : 面,现在java, Node private了,没法做到 : 如果用iterator, 只要改变了 list中的任何一个元素,iterator 都失效了,没法作为 : 永久存储 : 这样没法和 HashMap等等配合工作 : 高手有啥建议?
|
f***e 发帖数: 5443 | 3 的确是可以copy一个出来,暴露 Node,
有更好的方法吗?
【在 g*****g 的大作中提到】 : Iterator.remove() is an O(1) operation for LinkedList. If you have the : element and you want O(1) operation, you need to write your own double : linked list, which should be trivial enough.
|
l*********s 发帖数: 5409 | 4 如果用iterator, 只要改变了 list中的任何一个元素,iterator 都失效了
I don't know java, but it sounds odd, why mutating an element needs to
invalidate a container iterator? |
l**********n 发帖数: 8443 | 5 不会吧, iterator是Java实现generator的一种方式吧
【在 l*********s 的大作中提到】 : 如果用iterator, 只要改变了 list中的任何一个元素,iterator 都失效了 : I don't know java, but it sounds odd, why mutating an element needs to : invalidate a container iterator?
|
z****e 发帖数: 54598 | 6 它说的应该是并发的问题
iterator就是一个enhanced loop
这个时候remove任何一个element都会导致concurrent modification exception的抛出
用弱循环就好了,或者用其他的并发类
【在 l*********s 的大作中提到】 : 如果用iterator, 只要改变了 list中的任何一个元素,iterator 都失效了 : I don't know java, but it sounds odd, why mutating an element needs to : invalidate a container iterator?
|
z****e 发帖数: 54598 | 7 永久存储说的是persistence吗?
为啥要用list和serialisable捏?
找个db或者nosql存起来
不过这个问题怎么看都像是一个leetcode问题 |
g*****g 发帖数: 34805 | 8 You can't change a java list in a loop, but you can do remove on an iterator.
【在 l*********s 的大作中提到】 : 如果用iterator, 只要改变了 list中的任何一个元素,iterator 都失效了 : I don't know java, but it sounds odd, why mutating an element needs to : invalidate a container iterator?
|
z****e 发帖数: 54598 | 9 还是要区分一下强循环和弱循环
弱循环的话,是可以更改list的
boolean objRemoved = false;
for(int i=0;i
if(list.get(i).equals(sth.)){
list.remove(i); //ok
objRemoved = true;
}
if(objRemoved)
objRemoved = false;
else
i++;
}
强循环会出问题
for(Obj obj:list){
list.remove(obj); //exception
}
iterator的话
Iterator iterator = list.iterator();
while(iterator.hasNext()){
list.remove(i.next()); //exception,类似强循环
iterator.remove(); //ok,类似弱循环
}
iterator.
【在 g*****g 的大作中提到】 : You can't change a java list in a loop, but you can do remove on an iterator.
|
l*********s 发帖数: 5409 | |
f***e 发帖数: 5443 | 11 多谢解释,
我不应该用永久存储,就是放在另一个 数据结构里做reference, 感觉iterator 不合
适,因为可能被invalidate.
【在 z****e 的大作中提到】 : 永久存储说的是persistence吗? : 为啥要用list和serialisable捏? : 找个db或者nosql存起来 : 不过这个问题怎么看都像是一个leetcode问题
|
g*****g 发帖数: 34805 | 12 Leetcode LRU? 手写个double linked list就完了。
【在 f***e 的大作中提到】 : 多谢解释, : 我不应该用永久存储,就是放在另一个 数据结构里做reference, 感觉iterator 不合 : 适,因为可能被invalidate.
|
f***e 发帖数: 5443 | 13 我用的是暴露 Node
【在 g*****g 的大作中提到】 : Leetcode LRU? 手写个double linked list就完了。
|