Split
- Aceita regex como parâmetro;
- Retorna String[];
- Quando não houver conteúdo entre os delimitadores retorna uma String vazia, ou seja, o Array sempre terá o tamanho igual a (quantidade de delimitadores + 1);
Tokenize
- Cada char do parâmetro token será considerado um delimitador;
- Retorna List<String>;
- Quando não houver conteúdo entre os delimitadores, não retorna nada, ou seja, a lista resultante pode ter tamanho variável.
Exemplos
A,B,C,,E,F,G
A,,C,,E,,G
,B,,D,E,F,
Tendo estas linhas como exemplo o tokenize(',')
e o split(',')
de cada linha executam de formas diferentes por conta dos conteúdos vazios. O split(',')
mantém as posições dos elementos da string enquanto o tokenize(',')
remove os conteúdos vazios. Que é o cenário do caso de dois delimitadores consecutivos (,,
) entre alguns valores dos exemplos.
O resultado do split(',')
das linhas individualmente seriam os seguintes vetores:
['A', 'B', 'C', '', 'E', 'F', 'G']
['A', '', 'C', '', 'E', '', 'G']
['', 'B', '', 'D', 'E', 'F', '']
Perceba que para o split()
teremos neste exemplo nas posições [0] sempre o 'A' ou '' e nas posições [3] sempre o 'D' ou ''.
O resultado do tokenize(',')
das linhas individualmente seriam as seguintes listas:
['A', 'B', 'C', 'E', 'F', 'G']
['A', 'C', 'E', 'G']
['B', 'D', 'E', 'F']
Perceba que para o tokenize()
teremos neste exemplo nas posições [0] os valores variáveis 'A' ou 'B', e nas posições [3] os valores 'E' ou 'G' ou 'F'.
Assinatura diferenciada
Perceba no exemplo desta outra linha onde o split
aceita ainda a informação de um limit
de valores, parando de quebrar o texto após atingir o limite. (Informar 0 é o mesmo que sem limite).
Note a diferença entre informar 0 (ou sem limite) e informar -1.
String linha = 'A-B-C-D---'
assert linha.split('-') == ['A', 'B', 'C', 'D']
assert linha.split('-', 0) == ['A', 'B', 'C', 'D']
assert linha.split('-', 1) == ['A-B-C-D---']
assert linha.split('-', 2) == ['A', 'B-C-D---']
assert linha.split('-', 3) == ['A', 'B', 'C-D---']
assert linha.split('-', 4) == ['A', 'B', 'C', 'D---']
assert linha.split('-', 5) == ['A', 'B', 'C', 'D', '--']
assert linha.split('-', 6) == ['A', 'B', 'C', 'D', '', '-']
assert linha.split('-', -1) == ['A', 'B', 'C', 'D', '', '', '']
Conclusão
Portanto se você utilizar o tokenize()
para tratar os retornos baseando-se em posições fixas, por conta desta remoção de valores em branco você pode atingir comportamentos inesperados. Então cuidado! Ou na dúvida utilize sempre o split()
.