Hi,

On Jun 4, 2013, at 1:34 AM, Brent Christian <brent.christ...@oracle.com> wrote:

> Hi, Paul
> 
> If a HashMap is created via serialization or clone(), we don't check if the 
> table needs resizing when adding entries, but still need to check if a bin 
> should be converted to a TreeBin.  In this case, putForCreate() calls 
> createEntry() directly, instead of addEntry().
> 

But putForCreate calculates "checkIfNeedTree":
1161         if (table[i] instanceof Entry) {
1162             int listSize = 0;
1163             Entry<K,V> e = (Entry<K,V>) table[i];
1164             for (; e != null; e = (Entry<K,V>)e.next) {
1165                 Object k;
1166                 if (e.hash == hash && ((k = e.key) == key || 
key.equals(k))) {
1167                     e.value = value;
1168                     return;
1169                 }
1170                 listSize++;
1171             }
1172             // Didn't find, fall through to createEntry().
1173             // Check for conversion to TreeBin done via createEntry().
1174             checkIfNeedTree = listSize >= TreeBin.TREE_THRESHOLD;
1175         } else if (table[i] != null) {
...
1186 
1187         createEntry(hash, key, value, i, checkIfNeedTree);
1188     }

So the call to createEntry is just recalculating the same "listSize" value:

2232     void createEntry(int hash, K key, V value, int bucketIndex, boolean 
checkIfNeedTree) {

...
2239         if (checkIfNeedTree) {
2240             int listSize = 0;
2241             for (e = (Entry<K,V>) table[bucketIndex]; e != null; e = 
(Entry<K,V>)e.next) {
2242                 listSize++;
2243                 if (listSize >= TreeBin.TREE_THRESHOLD) { // Convert to 
TreeBin
2244                     if (comparableClassFor(key) != null) {
2245                         TreeBin t = new TreeBin();
2246                         t.populate((Entry)table[bucketIndex]);
2247                         table[bucketIndex] = t;
2248                     }
2249                     break;
2250                 }
2251             }
2252         }
Paul.

> Thanks,
> -Brent
> 
> On 6/3/13 12:56 AM, Paul Sandoz wrote:
>> Hi Brent,
>> 
>> A minor thing: take it or leave it :-)
>> 
>> In HashMap:
>> 
>> 2207     void addEntry(int hash, K key, V value, int bucketIndex, boolean 
>> checkIfNeedTree) {
>> 2208         // assert key != null;
>> 2209         if ((size >= threshold) && (null != table[bucketIndex])) {
>> 2210             resize(2 * table.length);
>> 2211             hash = hash(key);
>> 2212             bucketIndex = indexFor(hash, table.length);
>> 2213         }
>> 2214         createEntry(hash, key, value, bucketIndex, checkIfNeedTree);
>> 2215     }
>> 
>> You could re-verify the bucket size if the table is resized rather
> than in createEntry, since that AFAICT is the only case where conditions
> after the call to addEntry might change.
>> 
>> Pau.
>> 

Reply via email to