Java 字节缓冲区比较不使用分配,但包装没关系



使用java ByteBuffer似乎发现了非常奇怪的行为。我的目的是填写ByteBuffer并使用compareTo方法。我使用Ubuntu在OpenJDK 64位上运行。代码片段是scala工作表,但在java类中它的行为相同。这很好:

import java.nio.{ByteOrder, ByteBuffer}
import org.apache.commons.codec.binary.Hex
val str1 = "FFFFFFFFFFF000000000000000000000"
val str2 = "FFFFFFFFFFFF00000000000000000000"
val bb1 = ByteBuffer.wrap(Hex.decodeHex(str1.toCharArray))
val bb2 = ByteBuffer.wrap(Hex.decodeHex(str2.toCharArray))
println(
  s"""
     |bb1 hex: ${new String(Hex.encodeHex(bb1.array()))}
     |bb2 hex: ${new String(Hex.encodeHex(bb2.array()))}
     |Comparing: bb1.compareTo(bb2): ${ bb1.compareTo(bb2)}
  """.stripMargin)
bb1 hex: fffffffffff000000000000000000000
bb2 hex: ffffffffffff00000000000000000000
Comparing: bb1.compareTo(bb2): -15

这不起作用(也不知道为什么)

import java.nio.{ByteOrder, ByteBuffer}
import org.apache.commons.codec.binary.Hex
val str1 = "FFFFFFFFFFF000000000000000000000"
val str2 = "FFFFFFFFFFFF00000000000000000000"
val bb1 = ByteBuffer.allocate(16)
val bb2 = ByteBuffer.allocate(16)
bb1.put(Hex.decodeHex(str1.toCharArray))//Do the same like in wrap
bb2.put(Hex.decodeHex(str2.toCharArray))//Do the same like in wrap
println(
  s"""
     |bb1 hex: ${new String(Hex.encodeHex(bb1.array()))}
     |bb2 hex: ${new String(Hex.encodeHex(bb2.array()))}
     |Comparing: bb1.compareTo(bb2): ${ bb1.compareTo(bb2)}
  """.stripMargin)
bb1 hex: fffffffffff000000000000000000000
bb2 hex: ffffffffffff00000000000000000000
Comparing: bb1.compareTo(bb2): 0

啊,这是java的另一个"功能",有时会让你想打那个想出它并认为这是个好主意的家伙:)

ByteBuffer具有当前位置的概念,因此当您两次调用put时,第二个数组的内容会附加在第一个数组的末尾。有趣的是,compareTo比较了从各自当前位置开始的两个缓冲区的内容。因此,在您的情况下,两个序列都是空的,它只返回0。

最新更新