Hadoop Text是可变的

时间:2015-01-24 05:11:42

标签: java hadoop mapreduce bigdata

我无法理解他的代码的逻辑:

    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?请解释 - 完全糊涂。

1 个答案:

答案 0 :(得分:1)

文本由字节数组支持以保存其实际值。当更新Text的值时,如果新值适合当前字节数组(否则创建新的字节数组),则覆盖字节数组的内容而不是替换整个字节数组对象。 在您的示例中,使用值“hadoop”初始化Text,该值需要长度为6的字节数组。当您将新值设置为“pig”时,“pig”将复制到长度为6的现有字节数组中,即Text不会为此创建长度为3的新字节数组。我假设,字节数组被重用以减少对象实例化的数量并减少垃圾收集器的压力。

Text.getBytes()的JavaDocs说:

  

返回原始字节;但是,只有getLength()的数据才有效。如果您需要返回的数组恰好是数据的长度,请使用copyBytes()。