NIO Buffer缓冲区的duplicate与slice区别

duplicate

英文翻译过来是复制的意思,根据源码,调用duplicate方法返回的Buffer对象就是复制了一份原始缓冲区,复制了position、limit、capacity这些属性,但是,复制后的缓冲区get和put所操作的数组还是与原始缓冲区一样的,所以对复制后的缓冲区进行修改也会修改原始的缓冲区,反之亦然。

 

slice

如下图所示

NIO Buffer缓冲区的duplicate与slice区别

英文翻译后是切片、划分的意思。。。调用该方法得到的新缓冲区所操作的数组还是原始缓冲区中的那个数组,不过,通过slice创建的新缓冲区只能操作原始缓冲区中数组剩余的数据,即索引为调用slice方法时原始缓冲区的position到limit索引之间的数据,超出这个范围的数据通过slice创建的新缓冲区无法操作到。

像上图中右下角的就是slice buffer,它操作的数组0、1、2三个索引的加上offset偏移量就是原始数组中的3、4、5了,在执行get或者put时,都会加上offset。。然后创建slice buffer时limit和capcity都会被限制为原始缓冲区的remainning的返回值,offset被设置比为原始position的值,所以slice buffer调用clear和flip之类的方法都不会导致操作越界。。

看源码:

NIO Buffer缓冲区的duplicate与slice区别