2011-08-25 117 views
0

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

+0

你尝试过和配置/基准吗? –

+0

不,我没有,我在这里问,因为其他人可能已经做了类似的事情,我似乎无法通过谷歌找到它。 – Drizzt321

+0

你需要清理这个问题。该值是在字符串或字节数组中传递的,并且是具有等效字符串或等效字节的点?如果它是以字节形式存储的字符串,则需要进行信息编码,即使它们表示它们都是相同的编码。 – Clint

回答

2

没有真正的测试它,它似乎Array.equals()是你的朋友。要创建一个字符串,最终在String构造函数中创建一个字节数组的副本,那么您必须对unicode进行解码,这需要为默认的Unicode编码创建解码器,然后将字节数组转换为char数组,然后您必须做等于,这涉及迭代每个字符串中的每个字符。

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

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

1

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

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

+0

是的,在字节[](使用Hbase的Bytes.toByte())中以相同的方式进行编码,并且我不需要compareTo()功能,只需equals()。 – Drizzt321

+0

然后继续进行字节比较。事实上使用Arrays.equals本身 –

1

首先,你应该问自己是否真的很重要。考虑到你正在处理HBase,从而进行网络通信,无论你做什么都可能会被完全淹没,而且是时间上的。就像@Clint和@Suraj一样,我认为用较少的方法调用可能会更好(即使用Array.equals())。考虑一下当你做一个String equals时会发生什么,然后添加将字节数组转换为Strings的开销。