Só um detalhe: stream tem um custo adicional que provavelmente é a causa da diferença tão grande de desempenho. Afinal, existe toda uma complexidade por debaixo dos panos para que ela funcione.
Mas se a ideia é comparar somente os algoritmos, uma busca linear deveria ser feita assim:
for (int i = 0; i < lista.size(); i++)
if (target == lista.get(i)) {
// encontrado
break;
}
Aí a diferença cai bastante e os tempos ficam bem próximos, variando de acordo com o elemento sendo buscado - se o número está no começo, a busca binária é mais lenta, por exemplo. Mas claro que na média ela é mais rápida.
Por fim, vale lembrar que medir os tempos com System.currentTimeMillis()
, apesar de simples, é muito propenso a erros - leia aqui para entender melhor. Para resultados mais confiáveis, use alguma ferramenta específica, como por exemplo o JMH. Ou, a partir do Java 12, o Microbenchmark Suite.
Outro detalhe, o filter
não necessariamente itera por toda a coleção, pois as streams são implementadas com lazy evaluation - ou seja, somente nas operações terminais é que os elementos começam a ser processados.