Самым большим ударом по производительности будет использование substring
, и при вызове "0" +
я также посмотрю, можно ли также отменить использование Character.digit
и, наконец, вы сможете не создавать byte[]
каждый раз.Дальнейшая оптимизация будет заключаться в том, чтобы не использовать % 2
в начале или i / 2
внутри цикла.
Как-то так.
// assume the input is valid.
static int digit(char ch) {
return ch < 'A' ? ch - '0' : (ch & 31) + 10;
}
public static byte[] decodeHexString(String hexString) {
byte[] bytes = new byte[(hexString.length() + 1) / 2];
int i = 0, j = 0;
if ((hexString.length() & 1) != 0) {
bytes[i++] = (byte) digit(hexString.charAt(j++));
}
for (; j < hexString.length(); i++, j += 2)
bytes[i] = (byte) ((digit(hexString.charAt(j)) << 4) + digit(hexString.charAt(j + 1)));
return bytes;
}
для повторного использования byte[]
, который вы бы сделалинеобходимо передать массив для использования, избегая его создания.
Вы можете оптимизировать это далее, используя отражение, чтобы захватить базовый массив в String.