protected void splitNextLargeSublist() {
    if (smallSublistCount < sublists.size()) {
      if (sublists.isFull()) {
        sublists = copyTo(sublists,
                          new FixedListInternal<CircularListInternal<T>>(
                              sublists.capacity() << 1));
      }
      int firstLargeSublistIndex = smallSublistCount;
      boolean isHeadList = firstLargeSublistIndex <= headSublistIndex;
      boolean isTailList = firstLargeSublistIndex >= tailSublistIndex;
      CircularListInternal<T> large = sublists.get(firstLargeSublistIndex);
      assert large.capacity() == (1 << largeSublistSizeExp);
      CircularListInternal<T> small1 = new CircularListInternal<T>(
          large.capacity() >>> 1);
      CircularListInternal<T> small2 = new CircularListInternal<T>(
          large.capacity() >>> 1);
      split(large, small1, small2, isHeadList);
      if (isHeadList) {
        sublists.set(firstLargeSublistIndex, small2);
        sublists.add(firstLargeSublistIndex, small1);
        smallSublistCount += 2;
        if (small1.isEmpty()) {
          headSublistIndex += 1;
        }
        tailSublistIndex += 1;
      } else if (isTailList) {
        sublists.set(firstLargeSublistIndex, small1);
        sublists.add(firstLargeSublistIndex + 1, small2);
        smallSublistCount += 2;
        if (!small2.isEmpty()) {
          tailSublistIndex += 1;
        }
      } else {
        sublists.set(firstLargeSublistIndex, small2);
        sublists.add(firstLargeSublistIndex, small1);
        smallSublistCount += 2;
        tailSublistIndex += 1;
      }
    }
  }