我无法理解他的代码的逻辑:
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);
为什么最后一个print语句提供6
而不是3
?请解释 - 完全糊涂。
答案 0 :(得分:1)
文本由字节数组支持以保存其实际值。当更新Text的值时,如果新值适合当前字节数组(否则创建新的字节数组),则覆盖字节数组的内容而不是替换整个字节数组对象。 在您的示例中,使用值“hadoop”初始化Text,该值需要长度为6的字节数组。当您将新值设置为“pig”时,“pig”将复制到长度为6的现有字节数组中,即Text不会为此创建长度为3的新字节数组。我假设,字节数组被重用以减少对象实例化的数量并减少垃圾收集器的压力。
Text.getBytes()的JavaDocs说:
返回原始字节;但是,只有getLength()的数据才有效。如果您需要返回的数组恰好是数据的长度,请使用copyBytes()。