O CPF sempre será assim, com os separadores (123.456.789-44)?
Se for, não precisa ficar fazendo split e join, basta usar substring e pegar os pedaços da string que você quer:
String cpf = "123.456.789-44";
for (int inicio = 0, fim = 3; inicio < cpf.length(); inicio += 4, fim += 4) {
if (fim > cpf.length()) // se passou do tamanho da string, ajusta o final
fim = cpf.length();
System.out.println(cpf.substring(inicio, fim));
}
Talvez o que vou falar agora seja micro-otimização, mas enfim: o split do Java não é lá muito eficiente porque sempre cria uma regex (que por si só é bem custosa), além de retornar um array com várias strings. E depois join ainda cria outra string juntando os elementos do array (sem contar cada chamada de replace, que também cria outra string).
Claro que substring também cria outra string, mas neste caso são criadas menos do que se usar replace, split e join. Claro também que, para strings pequenas rodando poucas vezes, a diferença será insignificante e imperceptível. Mas em sistemas maiores, com muitos dados sendo processados, isso pode começar a fazer diferença, então aprenda desde já a prestar atenção a esses detalhes
Vale lembrar que este é um código “ingênuo”, pois não valida o tamanho da string nem nada (se tem números ou outros caracteres, se de fato é um CPF, etc), mas aí já é outra história…