字符串拆分和比较 - 最快的方法

Sub*_*i P 5 java string performance split

我有一个字符串:

1,2,3:3,4,5

需要将分隔符左侧的字符串与分隔符(:)右侧的字符串进行比较.现在,当我的意思是比较时,我实际上意味着要找出右侧部分(3,4,5)中的元素是否存在于左侧部分的元素中(1,2,3).正确的部分可以包含重复,这很好(显然意味着我不能使用a HashSet).我已经完成了这个(详情如下),但我需要以最快的方式来分割和比较上面提到的字符串.

这纯粹是一个基于性能的问题,以找出哪个方法可以更快,因为我将使用的实际输入是巨大的(在任何一方).只有一行,它将通过标准输入读取.

我是如何完成这个的:

  1. stdin.
  2. 使用string.split拆分并将左侧部分存储在a中HashSet.
  3. 将正确的部分存放在ArrayList.
  4. 迭代数组列表用于contains()检查元素是否存在于HashSet.

lev*_*tov 2

  1. 将输入读入byte[]数组以将指针保留在代码一侧。

  2. 逐字节读取,途中计算整数元素:

    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)
  3. 使用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)