Стоимость приведения к ArrayList объектов, а затем приведения к пользовательскому ArrayList

У меня есть ситуация, в которой я получаю данные из базы данных, и я хочу выгружать их в ArrayList of objects а затем уменьшить его до другого пользовательского ArrayList т.е. List<User>, List<Groups> и т.п.

Мой вопрос - приведение к объекту, а затем приведение к ArrayList, какова будет стоимость, является ли это эффективной или хорошей практикой.

РЕДАКТИРОВАНИЕ

Вместо того, чтобы получать данные как List<User>, List<Groups> и т.д. Я хочу получить данные как ArrayList<objetcs> один раз, а затем в соответствии с моей потребностью, я буду понижать данные до ArrayList<User>,ArrayList<Groups> позже.

5 ответов

Решение

"Приведение вниз" не очень хорошая идея, так как вам не нужно использовать какие-либо специфические методы ArrayList. Вы должны быть в состоянии использовать List За все. Единственные открытые методы, которые предоставляет ArrayList, которых нет в List, ensureCapacity (что не так полезно, как кажется) и trimToSize что редко полезно.

С точки зрения стоимости, это зависит от того, можете ли вы потерпеть неудачу. Если вы не генерируете исключения, типичная проверка типа может занять ~ 40 нано-секунд. Upcast должен быть оптимизирован с помощью JIT.

Если база данных на самом деле не возвращает ArrayList, кастинг не преобразует его для вас - вместо этого вы увидите ClassCastException во время выполнения. Вместо этого вы должны создать новую коллекцию типа, который вы хотели бы использовать, и вызвать ее addAll(Collection c) метод для коллекции, возвращенной из базы данных.

Если вы начнете с ArrayList<Object>Кастинг это ArrayList это не upcast: он просто приводит параметризованный тип к своему необработанному аналогу. Кроме того, кастинг ArrayList в ArrayList<String> также не является унылым: это непроверенное приведение к параметризованному типу. Оба являются только артефактами компилятора и не имеют эквивалента во время выполнения.

Если ты getting/saving разные таблицы из database тогда для каждого table сначала создайте классы для каждого table с полным отображением table, Затем в функции (Вставить, обновить, удалить, выбрать) передать данные с соответствующими объектами класса таблицы. и использовать как есть. Для этого вам нужно создать другую функцию для получения или сохранения данных в таблицу. Но это самый эффективный способ решения этой задачи. Для получения дополнительной информации об апкастинге / даункастинге смотрите ссылку здесь

"Стоимость" с точки зрения производительности будет практически равна нулю (единственная стоимость - проверка во время выполнения при снижении).

Кастинг не меняет список как таковой, только тип ссылки.

В какой форме (тип данных) вы получаете "данные из базы данных"? Если вы ожидаете, что сможете преобразовать, например, JDBC ResultSet в List, это не сработает с приведением типов - вам действительно нужно перебрать ResultSet для получения данных.

Другие вопросы по тегам