duplicate() 和slice() 方法都是浅层复制。不同的是,slice()方法是切取一段的浅层复制,而duplicate( )是整体的浅层复制。

一、slice 切片复制

  • ByteBuf的slice方法可以获取到一个ByteBuf的一个切片。一个ByteBuf可以进行多次的切片浅层复制;
  • 多次切片后的ByteBuf对象可以共享一个存储区域
  • 切片后的 ByteBuf 维护独立的 read,write 指针

slice方法有两个重载版本:
(1)public ByteBuf slice()
(2)public ByteBuf slice(int index, int length)
image.png
调用slice()方法后,返回的切片是一个新的ByteBuf对象,该对象的几个重要属性值,大致如下:

  • readerIndex(读指针)值为 0。
  • writerIndex(写指针)值为源ByteBuf的readableBytes()可读字节数。
  • maxCapacity(最大容量)值为源ByteBuf的readableBytes( )可读字节数。

切片后的新ByteBuf有两个特点:

  • 切片不可以写入,原因是:maxCapacity与writerIndex值相同。
  • 切片和源ByteBuf的可读字节数相同,原因是:切片后的可读字节数为自己的属性writerIndex – readerIndex,也就是源ByteBuf的readableBytes() - 0。

切片后的新ByteBuf和源ByteBuf的关联性:

  • 切片不会复制源ByteBuf的底层数据,底层数组和源ByteBuf的底层数组是同一个。
  • 切片不会改变源ByteBuf的引用计数。从根本上说,slice()无参数方法所生成的切片就是源ByteBuf可读部分的浅层复制。

    二、duplicate 整体复制

    截取了原始 ByteBuf 所有内容,并且没有 max capacity 的限制,也是与原始 ByteBuf 使用同一块底层内存,只是读写指针是独立的。
    image.png

copy 深层拷贝

会将底层内存数据进行深拷贝,因此无论读写,都与原始 ByteBuf 无关