Sub*_*i P 5 java string performance split
我有一个字符串:
1,2,3:3,4,5
需要将分隔符左侧的字符串与分隔符(:)右侧的字符串进行比较.现在,当我的意思是比较时,我实际上意味着要找出右侧部分(3,4,5)中的元素是否存在于左侧部分的元素中(1,2,3).正确的部分可以包含重复,这很好(显然意味着我不能使用a HashSet).我已经完成了这个(详情如下),但我需要以最快的方式来分割和比较上面提到的字符串.
这纯粹是一个基于性能的问题,以找出哪个方法可以更快,因为我将使用的实际输入是巨大的(在任何一方).只有一行,它将通过标准输入读取.
我是如何完成这个的:
HashSet.ArrayList.contains()检查元素是否存在于HashSet.将输入读入byte[]数组以将指针保留在代码一侧。
逐字节读取,途中计算整数元素:
int b = inputBytes[p++];
int d = b - '0';
if (0 <= d) {
if (d <= 9) {
element = element * 10 + d;
} else {
// b == ':'
}
} else {
// b == ','
// add element to the hash; element = 0;
...
}
if (p == inputBytesLength) {
inputBytesLength = in.read(inputBytes);
if (inputBytesLength == 0) { ... }
p = 0;
}
Run Code Online (Sandbox Code Playgroud)使用int[]足够大的二的幂的长度作为散列:
// as add()
int h = element * 0x9E3779B9;
int i = h >>> (32 - hashSizePower);
while (hash[i] != 0) {
if (--i < 0) i += hashSize;
}
hash[i] = element;
// contains() similarly
Run Code Online (Sandbox Code Playgroud)