Перезапись элемента Float в ArrayList в Kotlin вызывает выделение? - PullRequest
0 голосов
/ 21 февраля 2019

Я пересчитываю значения массива в вызовах ValueAnimator, поэтому я просто устанавливаю значения как

mValues[i] = newValue

Profiler говорит мне, что здесь каждый раз создается объект Float.Для Java есть рекомендации по использованию простого типа 'float', но в Kotlin это не вариант.

Действительно ли так создается новый объект во время обновления массива?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Ваш заголовок говорит ArrayList, сам вопрос дважды говорит "массив".Это разные!Если вы можете перейти к работе с примитивными массивами (float[] в Java и FloatArray в Kotlin), выделение не будет.

Если вам нужен список (например, потому что вы хотите, чтобы размер изменился), подумайте об использовании библиотеки примитивных коллекций: их много для Java, все должны быть просты в использовании из Kotlin.

0 голосов
/ 21 февраля 2019

Давайте проверим этот код котлина:

fun main(args: Array<String>) {
    val list = ArrayList<Int>()
    list.add(0)
    list[0] = 10
}

Давайте декомпилируем его в класс Java:

public final class AllocationKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      ArrayList list = new ArrayList();
      list.add(0);
      list.set(0, 10);
   }
}

Это декомпилированный код.Не похоже, что новый объект был создан ( на данный момент ).

А теперь давайте проверим код Java - исходный код и декомпилированный:

public class Allocation {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(0);
        arrayList.set(0, 10);
    }
}

И декомпилированный:

public class Allocation {
    public Allocation() {
    }

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList();
        arrayList.add(0);
        arrayList.set(0, 10);
    }
}

(Почти то же самое).

Заключение : При присваивании Int для ArrayList<Int> в Kotlin не генерируется new Integer(i) в коде Java.Я также проверил на двойную - примитив используется в скомпилированном коде.

Обновление 1: Как я понял позже, я только доказал, что сгенерированный код kotlin не отличается от кода Java.Но я забыл об одной очень важной вещи. Аргументы общего типа должны быть ссылочными типами .Итак, что происходит, когда я пытаюсь поместить примитив int в список Integer?

Автобокс - это ответ.

Автобокс - это автоматическое преобразование, которое Java-компилятор выполняет между примитивными типами и соответствующими им классами обертки объектов.

Таким образом, в байт-коде ваш примитив int станетInteger, ваш примитив bool станет Boolean и т. д. - когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...