为什么我们需要在 CharBuffer 中使用 `hasArray()` 方法?

Why do we ever need `hasArray()` method in CharBuffer?

CharBuffer 有方法 array()hasArray()

为什么我们需要 hasArray()

CharBuffer buf = CharBuffer.allocate(20) 之后,hasArray() 始终为真,之前 - 我们不能使用 buf 引用 b/c 它未初始化。

hasArray的条件是

(hb != null) && !isReadOnly

isReadOnly 如果您使用 asReadOnlyBuffer

会发生变化
CharBuffer.allocate(20).asReadOnlyBuffer();

例如。
所以是的,我们需要它。


走这条线

final CharBuffer cb = instance.getCharBuffer(...);

是否只读?它是否包含有效的 char[] 数组?我们真的不知道。如果我们这样做

cb.array();

而且是只读Buffer,我们得到一个ReadOnlyBufferException.
如果它没有 char[] 数组支持,我们会得到 UnsupportedOperationException.

所以我们可能做的是

if (cb.hasArray()) {
   final char[] arr = cb.array();
}

现在我们 Exception-安全了。
此外,您可以确定 Oracle/OpenJDK/whateverJDK 工程师知道他们在做什么 ;)

是的,但是:

System.out.println(ByteBuffer.allocateDirect(100).asCharBuffer().hasArray());

returns false.

即使没有,也不知道缓冲区是如何被检索到的。您可以想象 OS 分配缓冲区并且它仅由 Java 使用,例如打开文本文件时。你不能自己直接分配它是无关紧要的。

此外 hasArray() 是一个 function defined in the parent class Buffer,因此 需要 仅出于这个原因。


正如其他答案所指出的那样,从文档中检索一个只读可访问的数组也会 return 错误:

true if, and only if, this buffer is backed by an array and is not read-only

这是有道理的,因为您不想传递只读缓冲区,只是为了让某人检索支持数组并以这种方式将数据写入数组来更改它; Java 毕竟数组总是可变的。