java - Why does LinkedList.indexOf() return -1 if the object is contained in the list? -
i have declared linkedlist, frame list item.
private linkedlist<frame> linkedlist = new linkedlist<frame>(); i realized when test indexof -1 returned though list contains queried item. documentation states "(...) or -1 if list not contain element.".
https://docs.oracle.com/javase/7/docs/api/java/util/linkedlist.html#indexof(java.lang.object)
look @ these strange results:
linkedlist.size() -> 1 linkedlist.get(0) -> frame linkedlist.contains(linkedlist.get(0)) -> false linkedlist.indexof(linkedlist.get(0)) -> -1 did overlook anything? ideas what's going on?
i accessing list various threads without synchronization. have caused problem?
--
log (see below):
12-05 20:30:00.101  16446-16461/cc.closeup i/system.out﹕ **** test              0 12-05 20:30:00.301  16446-16476/cc.closeup i/system.out﹕ **** test              -1 12-05 20:30:00.856  16446-16461/cc.closeup i/system.out﹕ **** test              0 12-05 20:30:01.051  16446-16476/cc.closeup i/system.out﹕ **** test              -1 12-05 20:30:01.601  16446-16461/cc.closeup i/system.out﹕ **** test              0 12-05 20:30:01.801  16446-16476/cc.closeup i/system.out﹕ **** test              -1 12-05 20:30:02.356  16446-16461/cc.closeup i/system.out﹕ **** test              0 12-05 20:30:02.551  16446-16476/cc.closeup i/system.out﹕ **** test              -1 12-05 20:30:03.101  16446-16461/cc.closeup i/system.out﹕ **** test              0 12-05 20:30:03.301  16446-16476/cc.closeup i/system.out﹕ **** test              -1 
look @ javadocs contains , indexof.  states methods determine if element in collection using equals method.
if contains , indexof saying "it isn't there" object present in list different 1 one testing ... according object's implementation of equals(object).
the other possibility accessing / updating collection different threads, , haven't synchronized properly. can lead 1 thread seeing stale or inconsistent version of list.
would think fine if synchronize list itself?
collections.synchronizedlist(new linkedlist<>())
if perform operations via synchronized list , don't use iterator, each individual operation thread-safe , atomic. however:
- the iterator of "synchronized list" not synchronized, and
- this doesn't if need sequence of operations synchronized / performed atomically.
for example:
    list<integer> l =  collections.synchronizedlist(new linkedlist<>());      // make list visible other threads ...      (int = 0; < l.size(); i++) {         integer ii = l.get(i);         ...     } while l.size() give current size, size might change between l.size() , l.get(i) calls, potentially resulting in exception.
in short ... collections.synchronizedlist(...) not solution thread-safety problems involving lists.  still need think doing.
Comments
Post a Comment