ByteBuffer duplicate()方法的作用:创建共享此缓冲区内容的新的字节缓冲区 。
新缓 冲区的内容将为此缓冲区的内容 。 此缓冲区内容的更改在新缓冲区中是可见的,反之亦然 。
在创建新的缓冲区时,容量、限制、位置和标记的值将与此缓冲区相同,但是这两个缓冲区 的位置、界限和标记值是相互独立的 。 当且仅当此缓冲区为直接缓冲区时,新缓冲区才是直 接缓冲区 。
当且仅当 此缓冲区为只读时,新缓冲区才是只读的 。
使用 duplicate() 方法和 slice() 方法能创建新的 缓 冲 区 ,但这些新缓冲区使用的还是原 来缓冲区中 的 byte[] 字节数组。
下面验证使用 duplicate()方法创建新的缓冲区后,在新缓冲区中添加数据时,被复制的 缓 冲区中的值也发生改变,说明这两个缓冲区用的是同 一个 byte[],代码如下 :
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
public class BufferTest06 {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] byteArrayinl = { 1, 2, 3, 4, 5 };
ByteBuffer bytebuffer1 = ByteBuffer.wrap(byteArrayinl) ;
ByteBuffer bytebuffer2 = bytebuffer1.duplicate() ;
System.out.println( "A capacity=" + bytebuffer1.capacity() + "position=" + bytebuffer1.position() + " limit= " + bytebuffer1 .limit());
System.out.println( "A capacity=" + bytebuffer2.capacity() + "position=" + bytebuffer2.position() + " limit= " + bytebuffer2 .limit());
bytebuffer2.put(1, (byte ) 222) ;
bytebuffer2 .position(3) ;
System.out.println( "A capacity=" + bytebuffer1.capacity() + "position=" + bytebuffer1.position() + " limit= " + bytebuffer1 .limit());
System.out.println( "A capacity=" + bytebuffer2.capacity() + "position=" + bytebuffer2.position() + " limit= " + bytebuffer2 .limit());
bytebuffer1.position(0);
for (int i =0 ; i < bytebuffer1.limit(); i++) {
System.out.print(bytebuffer1.get(i) + " ");
}
System.out.println( " ");
System.out.println( " ========================================================= ");
bytebuffer2.position(0);
for (int i =0 ; i < bytebuffer2.limit(); i++) {
System.out.print(bytebuffer1.get(i) + " ");
}
}
}
输出结果:
Connected to the target VM, address: '127.0.0.1:58980', transport: 'socket'
A capacity=5position=0 limit= 5
A capacity=5position=0 limit= 5
A capacity=5position=0 limit= 5
A capacity=5position=3 limit= 5
1 -34 3 4 5
=========================================================
1 -34 3 4 5 Disconnected from the target VM, address: '127.0.0.1:58980', transport: 'socket'
Process finished with exit code 0
结论:
使用的是同一个数组,更改一个里面的值,另外一个也跟着改变.
但是这两个引用的指针是两套独立的系统.