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 не приводим. Вот в этом моменте я запутался
В этом случае у нас в листе 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
уважаемые разработчикиСтолкнулся с такой проблемой, точнее вопросом
Пытаюсь подключиться к БД Sqlite с помощью JDBC
Такой вопрос, создал сеть, обучил на одной выборке до ошибки в 001