Какой цикл будет быстрее

233
31 мая 2018, 08:00
ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add("два");
        //Этот?
        for(int i = 0; arrayList.size() > i; i++){
            System.out.println(arrayList.get(i));
        }
        //или этот в котором как я понимаю будет приведение типов?
        for (Object temp: arrayList){
           System.out.println(temp);
        }

Знаем, что forEach медленнее при работе с коллекциями, чем for (хотя может сейчас и это уже оптимизируется) Но накладывает ли приведение типов дополнительные расходы или же компилятор увидит, что я элементы всего лишь печатаю и в любом случае они будут приведены к String и оптимизирует это?

UPD:
В этом случае у нас в листе Integer. в ForEach всё тоже Integer. А в первом варианте в forEach был Object.

ArrayList<Integer> arr = new ArrayList<>();
        arr.add(1);
        arr.add(2);
        arr.add(5);
 for (Integer temp : arr ) {
      System.out.println(temp);
 }

Вопрос в том, будет ли ненужное приведение типов к объекту в forEach , а в for мы к Object не приводим. Вот в этом моменте я запутался

Answer 1

В этом случае у нас в листе Integer. в ForEach всё тоже Integer. А в первом варианте в forEach был Object.

нет там тоже был Integer

ArrayList items = new ArrayList();
items.add(1);
System.out.println(items.get(0).getClass()); // class java.lang.Integer

В java нет шаблонов, есть дженерики (generics) и в ее коллекциях (списки, словари, множества и т.п.) не хранятся простые типы (int, float, boolean, и т.п.), а если и добавляются, то они будут обернуты в соответствующий им класс. Поэтому, в коде int стал в списке Integer.

Все коллекции хранят значения в типе Object

ArrayList items_1 = new ArrayList();
ArrayList<Integer> items_2 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    items_1.add(i);
    items_2.add(i);
}
long startTime;
int number = 1000000;
startTime = System.nanoTime();
for (int i = 0; i < number; i++) {
    for (Object temp : items_1) {
        Integer num = (Integer) temp;
    }
}
System.out.println(String.format("Elapsed time %s nanoseconds", (System.nanoTime() - startTime) / number));
startTime = System.nanoTime();
for (int i = 0; i < number; i++) {
    for (Integer num : items_2) {
        // ...
    }
}
System.out.println(String.format("Elapsed time %s nanoseconds", (System.nanoTime() - startTime) / number));

Консоль:

Elapsed time 892 nanoseconds
Elapsed time 860 nanoseconds
READ ALSO
Как наполнять контентом android приложение? [закрыт]

Как наполнять контентом android приложение? [закрыт]

уважаемые разработчикиСтолкнулся с такой проблемой, точнее вопросом

162
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)

Пытаюсь подключиться к БД Sqlite с помощью JDBC

386
Кто-нибудь работал с Neuroph studio?

Кто-нибудь работал с Neuroph studio?

Такой вопрос, создал сеть, обучил на одной выборке до ошибки в 001

217
Работа со switch

Работа со switch

Придумал пример:

194