我无法理解他那段代码的逻辑:
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
? 请解释-完全困惑。
1条答案
按热度按时间hsvhsicv1#
文本由字节数组支持以保存其实际值。更新文本值时,如果新值适合当前字节数组(否则将创建新字节数组),则会覆盖字节数组的内容,而不是替换整个字节数组对象。在您的示例中,使用值“hadoop”初始化文本,该值需要长度为6的字节数组。将新值设置为“pig”时,“pig”将复制到长度为6的现有字节数组中,即,文本不会为此创建长度为3的新字节数组。我假设,字节数组被重用以减少对象示例化的数量并减少垃圾收集器的压力。
text.getbytes()的javadocs说明:
返回原始字节;但是,只有getlength()以下的数据才有效。如果需要返回的数组正好是数据的长度,请使用copybytes()。