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)
调用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 使用同一块底层内存,只是读写指针是独立的。
copy 深层拷贝
会将底层内存数据进行深拷贝,因此无论读写,都与原始 ByteBuf 无关