I think you are correct. Adding this code below "count = 0;" in 
HashMap#rehash() eliminates the errors:

if (keys != null) {
    keys.clear();
}

I'll check this in.

On Mar 25, 2011, at 8:08 AM, Simon Chatelain wrote:

> Hello again,
> 
> After some further investigation, I could make a guess : does the problem 
> comes from the fact that in the HashMap#rehash() method the keys list is not 
> cleared ?
> 
> What do you think ?
> 
> Simon
> 
> On Fri, Mar 25, 2011 at 11:59 AM, Simon Chatelain <[email protected]> wrote:
> Hello,
> 
> I observed a really weird behavior when using a Pivot Map with a comparator. 
> By executing the code bellow, we can see that from 0 to 12 the l_KeyCount == 
> l_Map.getCount(). But when adding the 13th element in the map the l_KeyCount 
> become 26 when the l_Map.getCount() == 13. Then if I remove one of the entry 
> of the Map, the iterator on the map's key still return the key corresponding 
> to the removed entry, but the l_Map.containsKey() return false.
> 
> If I do not set a comparator on the map, I do not have this problem.
> 
> I looked in the user mailing list for similar issue, but didn't find 
> anything. 
> 
> Sounds like a bug to me or am I missing something ?
> 
> Simon
> 
> Map<Integer, String> l_Map = new HashMap<Integer, String>();
> l_Map.setComparator(new Comparator<Integer>() {
> 
>     @Override
>     public int compare(Integer _arg0, Integer _arg1) {
>         return _arg0.compareTo(_arg1);
>     }
> });
> 
> for (int i = 0; i < 100; i++) {
>     l_Map.put(i, UUID.randomUUID().toString());
> 
>     int l_KeyCount = 0;
>     for (Integer l_Key : l_Map) {
>         l_KeyCount++;
>     }
>     if (l_KeyCount != l_Map.getCount()) {
>         Logger.getLogger(this.getClass().getName()).log(Level.INFO,
>                 "l_KeyCount should be {0} but is {1}",
>                 new Object[] { l_Map.getCount(), l_KeyCount });
>         l_Map.remove(0);
>     }
>     for (Integer l_Key : l_Map) {
>         if (!l_Map.containsKey(l_Key)) {
>             Logger.getLogger(this.getClass().getName()).log(Level.INFO,
>                             "WTF : {0}",
>             new Object[] { l_Key.toString()});
>         }
>     }
> }
> 

Reply via email to