Кастинг и дженерики, есть разница в производительности? - PullRequest
5 голосов
/ 02 августа 2011

В последнее время я много пишу в Android, хотя я чувствую себя комфортно в JAVA, но скучаю по некоторым идеи об основных понятиях, используемых там.

Мне интересно узнать, есть ли разница в производительности между этими двумя кодами.

Первый метод:

//Specified as member variable.   
ArrayList <String> myList  = new ArrayList <String>(); 

и использование в качестве String temp = myList.get(1);

2-й метод:

ArrayList myList  = new ArrayList(); //Specified as member variable.   

и использование

String temp1 = myList.get(1).toString();   

Я знаю о кастинге. Имеет ли первый метод большое преимущество перед вторым, Большую часть времени в реальном кодировании мне приходится использовать второй метод, потому что arraylist может принимать разные типы данных, в итоге я указываю

ArrayList <Object> = new ArrayList <Object>(); 

или более общий способ.

Ответы [ 5 ]

7 голосов
/ 02 августа 2011

Короче говоря, нет разницы в производительности, о которой стоит беспокоиться, если она вообще существует.Общая информация в любом случае не сохраняется во время выполнения, поэтому на самом деле больше ничего не происходит, чтобы замедлить работу - и, как указывают другие ответы, она может быть даже быстрее (хотя, даже если она гипотетически была немного медленнее, я все равно рекомендовал бы использоватьгенерики.) Наверное, хорошо бы привыкнуть к , а не , чтобы думать о производительности на этом уровне.Читаемость и качество кода, как правило, гораздо важнее микрооптимизаций!

Короче говоря, дженерики являются предпочтительным вариантом, поскольку они гарантируют безопасность типов и делают ваш код более чистым для чтения.

В терминахиз-за того, что вы храните совершенно разные типы объектов (т.е. не связанные с какой-то иерархией наследования, которую вы используете) в массиве, это почти наверняка является недостатком вашего дизайна!Я могу сосчитать, сколько раз я делал это с одной стороны, и это всегда было временным обманом.

6 голосов
/ 02 августа 2011

Обобщения не ограничены, что означает, что они исчезают во время выполнения.Использование обобщений является предпочтительным по нескольким причинам:

  • Это делает ваш код более понятным в отношении того, какие классы взаимодействуют
  • Он сохраняет его тип в безопасности: вы не можете случайно добавить список вa List
  • Это быстрее: приведение требует, чтобы JVM проверила возможность преобразования типов во время выполнения, в случае, если это должно вызвать исключение ClassCastException.С Generics, компилятор знает, какие типы вещей должны быть, и поэтому ему не нужно проверять их.
2 голосов
/ 02 августа 2011

Там - это разница в производительности в этом коде: Метод second на самом деле медленнее .

Причина, по которой:

Обобщения не требуют приведения / преобразования (ваш код использует метод преобразования, не приведение), тип уже правильный. Поэтому, когда вы вызываете метод toString(), это дополнительный вызов с дополнительными операциями, которые не нужны при использовании метода с обобщениями.

Не будет проблем с приведением типов, так как вы используете метод toString(). Но вы можете случайно добавить неправильный объект (например, массив String s). Метод toString() будет работать правильно и не будет генерировать исключение, но вы получите странные результаты.

0 голосов
/ 02 августа 2011

Нет никакой разницы в производительности во время выполнения из-за " типа стирания ".

Но если вы используете Java 1.5 или выше, вы ДОЛЖНЫ использовать дженерики, а не слабо типизированные аналоги.

Преимущества дженериков -

* The flexibility of dynamic binding, with the advantage of static type-checking. Compiler-detected errors are less expensive to repair than those detected at runtime.
* There is less ambiguity between containers, so code reviews are simpler.
* Using fewer casts makes code cleaner. 
0 голосов
/ 02 августа 2011

Поскольку android используется для мобильных телефонов и портативных устройств, где ресурсы ограничены, вы должны быть осторожны при кодировании. Приведение может быть затруднено, если вы используете тип данных String для хранения в ArrayList. Поэтому, на мой взгляд, вы должны использовать первый метод, чтобы быть конкретным.

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