code: private CompositeByteBuf addComponents(boolean increaseIndex, int cIndex, Iterable<ByteBuf> buffers) {
          if (buffers instanceof ByteBuf) {
              // If buffers also implements ByteBuf (e.g. CompositeByteBuf), it has to go to addComponent(ByteBuf).
              return addComponent(increaseIndex, cIndex, (ByteBuf) buffers);
          }
          checkNotNull(buffers, "buffers");
          Iterator<ByteBuf> it = buffers.iterator();
          try {
              checkComponentIndex(cIndex);
  
              // No need for consolidation
              while (it.hasNext()) {
                  ByteBuf b = it.next();
                  if (b == null) {
                      break;
                  }
                  cIndex = addComponent0(increaseIndex, cIndex, b) + 1;
                  cIndex = Math.min(cIndex, componentCount);
              }
          } finally {
              while (it.hasNext()) {
                  ReferenceCountUtil.safeRelease(it.next());
              }
          }
          consolidateIfNeeded();
          return this;
      }
docs: but we do in the most common case that the Iterable is a Collection)