private void resizeGroups( int newCapacity ) {
        GroupNode<K, V>[] oldBuckets = mGroupBuckets;

        int oldCap = oldBuckets.length;
        if( oldCap >= MAXIMUM_CAPACITY ) {
            mGroupThreshold = Integer.MAX_VALUE;
            return;
        }

        GroupNode<K, V>[] newBuckets = new GroupNode[newCapacity];

        for( int i = 0; i < oldBuckets.length; i++ ) {
            GroupNode<K, V> groupNode = oldBuckets[i];

            while( groupNode != null ) {
                GroupNode<K, V> next = groupNode.mNext;

                int idx = (groupNode.mHash & (newCapacity - 1));
                groupNode.mNext = newBuckets[idx];
                newBuckets[idx] = groupNode;

                groupNode = next;
            }
        }

        mGroupBuckets = newBuckets;
        mGroupThreshold = (int)(newCapacity * mGroupLoadFactor);
    }