Одно заметное и важное отличие состоит в том, что listOf
дает вам только для чтения List
, тогда как arrayListOf
дает вам MutableList
. Определенно предпочтительнее использовать структуры данных только для чтения, когда это возможно.
val l1 = listOf(1)
l1.add(2) //not possible
val l2 = arrayListOf(2)
l2.add(1) //ok
С другой стороны, если вы не полностью полагаетесь на вывод типов, вы можете сделать переменную для ArrayList доступной только для чтения, как хорошо:
val l3: List<Int> = arrayListOf(2)
l3.add(1) //not possible anymore
Смысл не использования arrayListOf
в том, что вы хотите полагаться на библиотеку, чтобы выбрать фактическую реализацию. На данный момент это ArrayList
, который может измениться в будущих версиях. Например, если Kotlin решит добавить более мощную обратно-совместимую версию ArrayList, они могут изменить реализацию, и ваш код продолжит работать (улучшенным способом). Если вы, с другой стороны, хотите положиться на ArrayList (через arrayListOf
), у вас, вероятно, есть конкретный сценарий, в котором приемлема только эта реализация.