Diferença entre ArrayList <String> () e mutableListOf <String> () em Kotlin

99
private val repositories = mutableListOf<String>()

private val repositories = ArrayList<String>()

Ambos são lista mutável, então qual é o sentido de duas palavras mutableListOf- chave ou ArrayList?

ou existe alguma diferença importante?

Sai
fonte
6
Nem mutableListOfnem ArrayListsão palavras-chave em Kotlin
Ilya

Respostas:

137

A única diferença entre os dois é comunicar sua intenção.

Quando você escreve val a = mutableListOf(), você está dizendo "Eu quero uma lista mutável e não me importo particularmente com a implementação". Ao escrever, em vez disso, val a = ArrayList()você está dizendo "Eu quero especificamente um ArrayList".

Na prática, na implementação atual de compilação do Kotlin para a JVM, a chamada mutableListOfproduzirá um ArrayList, e não há diferença no comportamento: uma vez que a lista é construída, tudo se comportará da mesma forma.

Agora, digamos que uma versão futura do Kotlin seja alterada mutableListOfpara retornar um tipo diferente de lista.

Mais provável do que não, a equipe Kotlin só faria essa mudança se descobrir que a nova implementação funciona melhor para a maioria dos casos de uso. mutableListOfentão, você usaria essa nova implementação de lista de forma transparente e obteria esse comportamento melhor gratuitamente. Vá em frente, mutableListOfse for esse o seu caso.

Por outro lado, talvez você tenha passado muito tempo pensando sobre seu problema e percebido que ArrayList realmente é a melhor opção para ele e não quer correr o risco de ser movido para algo abaixo do ideal. Então você provavelmente deseja usar ArrayListdiretamente ou usar a arrayListOffunção de fábrica (um ArrayListanálogo específico para mutableListOf).

PDPI
fonte
21

mutableListOf<T>()é uma invocação de função embutida que retorna um MutableList<T>. A partir de hoje, mutableListOfretorna uma instância de ArrayList.

ArrayList<String>() é uma invocação do construtor e não pode ser embutida.

Em outras palavras, dado:

 val a = mutableListOf<String>()
 val b = ArrayList<String>()
  • a é do tipo MutableList<String>
  • b é do tipo ArrayList<String>

Em tempo de execução, ae bmanterá uma instância de ArrayList.

Note-se que inline é particularmente útil quando combinado com o tipo reification , o que justifica a existência de listOf, mutableListOfe semelhantes.

miensol
fonte
1
Portanto, não há diferença.
Sai
2
ae btêm diferentes tipos declarados - portanto, há uma diferença em tempo de compilação.
miensol
Pode ser inline comoval b = arrayListOf<String>()
Vlad
8

Como você pode ver nas fontes :

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

Portanto, não há diferença, apenas um método de conveniência.

azizbekian
fonte
1
E eu colocaria "conveniência" entre aspas. Até que MutableList realmente tenha uma implementação diferente, fornecer um objeto central que faz a mesma coisa que outro objeto central é confuso e nem um pouco conveniente. :(
Mike Williamson