Показать сообщение отдельно
Непрочитано 25.12.2016, 12:54   #10

По умолчанию Re: LinkedHashMap в эффекте

Цитата:
Сообщение от Anikey Посмотреть сообщение
Даже в разном порядке:
PHP код:
final Iterator<Entry<ObjectObject>> linked.entrySet().iterator();
    while (
i.hasNext()) {
       switch((String)
i.next().getKey()) {
           case 
"2":
           case 
"1":
               
i.remove();
               break;
     }

PHP код:
        public final boolean remove(Object o) {
            if (o instanceof Map.Entry) {
                Map.Entry<?,?> e = (Map.Entry<?,?>) o;
                Object key = e.getKey();
                Object value = e.getValue();
                return removeNode(hash(key), key, value, true, true) != null;
            }
            return false;
        }
Код из явки действительно поддерживает это.

Но есть побочные эффекты, такие как
PHP код:
    public Set<Map.Entry<K,V>> entrySet() {
       
Set<Map.Entry<K,V>> es;
        return (
es entrySet) == null ? (entrySet = new LinkedEntrySet()) : es;
    }

    final class 
LinkedEntrySet extends AbstractSet<Map.Entry<K,V>> {
        public final 
int size()                 { return size; }
        public final 
void clear()               { LinkedHashMap.this.clear(); }
        public final 
Iterator<Map.Entry<K,V>> iterator() {
            return new 
LinkedEntryIterator();
        }
    final class 
LinkedEntryIterator extends LinkedHashIterator
        
implements Iterator<Map.Entry<K,V>> {
        public final 
Map.Entry<K,Vnext() { return nextNode(); }
    } 



PHP код:
        final LinkedHashMap.Entry<K,VnextNode() {
            
LinkedHashMap.Entry<K,Vnext;
            if (
modCount != expectedModCount)
                throw new 
ConcurrentModificationException();
            if (
== null)
                throw new 
NoSuchElementException();
            
current e;
            
next e.after;
            return 
e;
        } 


Если в хранилище залетело какой то объект во время

while (i.hasNext()) {

switch((String)i.next().getKey()) {


Получим ConcurrentModification и опять же курим.
Как я сказал выше, во время доступа побочного потока если такой имеется, вызывать итератор, либо forEach методы не корректно, получим кучу соплей на выходе.
__________________
Mangol вне форума Отправить сообщение для Mangol с помощью ICQ Ответить с цитированием
Сказали спасибо: