我无法理解他的一段代码的逻辑:
Text text = new Text("hadoop");
System.out.println(text.getLength());
System.out.println(text.getBytes().length);
text.set(new Text("pig"));
System.out.println(text.getLength());
System.out.println(text.getBytes().length);
为什么最后的打印语句给出6
而不是3
?请解释 - 完全困惑。
文本由字节数组支持以保存其实际值。更新 Text 的值时,如果新值适合当前字节数组,则会覆盖字节数组的内容,而不是替换整个字节数组对象(否则会创建一个新的字节数组)。在您的示例中,您使用值"hadoop"初始化文本,该值需要长度为 6 的字节数组。当您将新值设置为"pig"时,"pig"被复制到长度为 6 的现有字节数组中,即 Text 不会为此创建长度为 3 的新字节数组。我假设,字节数组被重用以减少对象实例化的数量并减轻垃圾回收器的压力。
Text.getBytes() 的 JavaDocs 说:
返回原始字节;但是,只有 getLength() 之前的数据才有效。如果您需要返回的数组精确地是数据的长度,请使用 copyBytes()。