比较String或字节数组是否更快?

时间:2011-08-25 18:49:44

标签: java string hadoop bytearray hbase

所以,可能听起来像一个奇怪的问题,但是比较2个字符串或字节[](使用Arrays.equals())是否更快?我正在使用Hadoop / Hbase,我得到了来自Hbase的byte []作为值,并且我有一个传入的值。将我得到的值转换为String并进行比较会更快吗?或者将它们与字节数组进行比较?

3 个答案:

答案 0 :(得分:2)

如果没有实际测试,看起来Array.equals()似乎是你的朋友。要创建一个字符串,你最终在String构造函数中创建字节数组的副本,然后你必须解码unicode,这涉及为默认的Unicode编码创建解码器,并将字节数组转换为char数组,然后你必须做等于,这涉及遍历每个字符串中的每个字符。

因此,在O()类型计算中,您必须读取数组中的每个字节才能转换为字符,因此我认为转换为String等于等于复杂性更差。

更新: 鉴于添加到问题的注释,听起来你给了一个字符串,并使用它来比较MapReduce作业中的多个结果。在这种情况下,似乎有一个输入字符串转换为字节,并且它们是多字节数组比较。这似乎比保留输入String并转换作业中返回的每个字节数组更快。

答案 1 :(得分:1)

首先,您必须考虑两个字符串是否具有相同的编码。 然后,如果您只想进行等号检查,则继续进行字节比较。但是如果你想拥有String的 compareTo 行为,那么你可能必须弄清楚如何知道哪个字符串更大或更小,在这种情况下我更喜欢首先转换为String然后进行比较。

如果它们的编码不相同,那么最好创建字符串然后进行比较,因为解码部分将由String类本身完成。

答案 2 :(得分:1)

首先,你应该问问自己这是否真的重要。鉴于您正在处理HBase,从而处理网络通信,无论您做什么,都可能会被时间彻底淹没。就像@Clint和@Suraj一样,我认为使用较少的方法调用(即使用Array.equals())可能会更好。想一想当你执行String equals时会发生什么,然后添加将字节数组转换为字符串的开销。