有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    是的,但是:

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

    返回false

    即使没有,也不知道缓冲区是如何被检索的。您可以想象,操作系统分配了缓冲区,而Java只使用它,例如在打开文本文件时。你不能自己直接分配它是无关紧要的

    除此之外hasArray()是一个function defined in the parent class ^{},所以它需要仅仅因为这个原因


    正如另一个答案所示,从文档中检索只读可访问的数组也会返回false:

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

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

  2. # 2 楼答案

    hasArray的条件是

    (hb != null) && !isReadOnly
    

    isReadOnly如果使用asReadOnlyBuffer会发生变化

    CharBuffer.allocate(20).asReadOnlyBuffer();
    

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


    接这条线

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

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

    cb.array();
    

    它是一个只读缓冲区,我们得到一个ReadOnlyBufferException
    如果它没有char[]数组的支持,我们得到一个UnsupportedOperationException

    所以我们要做的是

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

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