чем отличается ioc от di? передача параметров по ссылке или значению? что лучше, linkdList or arrayList? :D
По IoC и DI рекомендую прочитать эту классическую статью: https://martinfowler.com/articles/injection.html хоть она и 2004 года, но актуальность не утратила
В Java параметры передаются по значению, ссылок в Java нет. То, что в Java называют ссылками, правильней называть указателями и тогда всё встаёт на свои места, то, что называют передачей параметров по ссылке суть просто копирования указателя.
Практически всегда надо использовать ArrayList. LinkedList это в теории полезно, на практике задачу, в которой он будет уместен, найти очень сложно.
Ну, по очереди. linkdList и ArrayList
LinkedList реализует связный список. Он хорош когда планируется добавлять/удалять элементы в середину списка. Пример задачи: оптимизация маршрута. Есть набор точек, которые надо объехать. Нужно меняя маршрут вычислять станет лучше-хуже.
Но чтобы найти i-й элемент нужно пройти весь список.
ArrayList - хранит элементы в той последовательности, в какой они поступают. Быстрый поиск по номеру элемента. А вот добавление/удаление элементов в середину списка - просто боль.
Ещё короче: если планируется частая вставка/удаление в середину списка - то лучше LinkedList. Если обновление списка не планируется, или происходит редко, но часто нужно считать элемент с нужным индексом - то ArrayList.
Обратите внимание, что все коллекции реализуют интерфейс List, то есть с обоими коллекциями можно обращаться одинаково, если использовать методы общего интерфейса List.
Он хорош когда планируется добавлять/удалять элементы в середину списка.
на самом деле это не так :) тему с структурками нужно однозначно подтянуть, это на самом деле единственный вопрос, который был не холиварный и имел четкий ответ))) скорость вставки и удаления из обеих коллекций из середины O(n) по объекту, O{1) по индексу из массива, О(n) из списка по прежнему (рекоменду вообще изучить почему так, именно реализации данимически расширяющегося списка и связного, их алгоритм работы), опять же стоит понимать, что linkedList в жабе реализует двусвязный список, а не обычный и например с конца элемент удалить в 2связном О(1) в отличие от односвязного, массив же удаление в среднем это O(n), изза перестроения всех элементов в массиве
однако стоит понимать, что изза механизма работы arraylist в нем можно реализовать двоичный поиск сократив время, поиска и добавления элемента в середину до O(lonN) то есть для приведенной задачи больше подходит array, да и в целом данная коллекция предпочтительнее в большом ряде задач, связанных с быстродействием и где нет ограничений по памяти, ибо данная структурка жрет больше пямяти чем списки
а вообще в рамках данной задачи на самом деле больше всего напрашивается граф)
Скажите пожалуйста, какие есть стандартные реализации односвязанного списка в java? В тех что я встречал, самописных, присутствовал указатель как на начало, так и на конец списка.
В этом случае удаление элемента с конца, как я понимаю, все-таки O(1)?
Ioc - инверсия управления. Это больше про фреймворки. Например, Collection Framework. У Вас, как у программиста, нет полного контроля за поведением. Вы можете только менять то, что доступно. То есть сам фреймворк управляет, а не Вы. В этом и идея инверсии управления.
Dependemcy Injection - тоже часть инверсии управления. Допустим у Вас есть приложение, которое что-то пишет в БД. Причем планируется поддержка разных СУБД. И для объектам нужен объект для работы с СУБД. Чтобы не переписывать каждый раз код заботу о создании объекта для подключения к БД можно вынести за пределы этих классов.
Инверсия контроля - это принцип, согласно которому мы передаем управление созданием и распоряжением объектами фреймворку
Внедрение зависимостей это процесс внедрения в объект сущности извне (объект, заранее созданный и управляемый фреймворком во время создания контекста)
Вся эта вечеринка обеспечивает слабую связность элементов программы, что упрощает поддержку и расширение
У arrayList константное время поиска любого элемента, почти всегда он предпочтительнее, кроме случая вставки большого числа элементов в начало коллекции, потому что все последующие элементы будут перезаписаны со сдвигом на количество вставленных элементов. LinkedList имеет линейное время поиска, предпочителен при вставке большого количества элементов в начало коллекции так как по сути там просто изменятся ссылки в нодах, в остальных случаях предпочиителен arrayList
Для вставки в середину предпочтительнее ArrayList так как его метод поиска нативный и отработает быстрее при прочих равных
ioc - это принцип, когда основное время программа проводит не в прикладном коде, а во фреймворке/сервере приложений. И они уже передают управление в прикладной код при наступлении неких событий (запрос снаружи/наступление момента времени и т.д.). Нужно для того, что бы снять с разработчика прикладного кода заботы по кодированию большого кол-ва системного кода. А так же для уменьшения связанности кусков кода между собой. То есть один обработчик события может и не подозревать о наличии другого куска кода. А при классической разработке надо было бы разработать код, который бы обрабатывал системный слой (time/http и т.д.) и знал бы про все обработчики, и таким образом код был бы сильно связан.
di - это способ связывания компонентов системы между собой. В di мы просто декларируем, что тут вот и тут нам нужно то и то, но сами явно не ищем/создаем реализацию того, что нужно.
В подавляющем кол-ве случаев лучше ArrayList, но есть редкие кейсы, когда LinkedList будет лучше. В общем зависит от профиля нагрузки на список. Например если список очень большой и нам нужно проитерировать список и выкинуть из списка ненужные элементы, то LinkedList может выиграть в разы.
Помощники
243 поста785 подписчиков
Правила сообщества
Нельзя обсуждать Политику.
Ругаться и оскорблять.