Светодиодный свет для чайников

svetodiodi_LEDs

Я не очень люблю формулы. Как и любой нормальный человек  Они вызывают у меня головную боль и желание кинуть что-нибудь в стену. Всю жизнь я старался держаться от них подальше. И ведь получалось. Но вот я заинтересовался светодиодами и понял – никуда не денешься. Чтобы получить нужный результат – нужно понимать – как это работает. Потихоньку, по шажку, начал я продираться сквозь дебри люмен, кандел, стерадиан. Постепенно в голове начала формироваться какая-то картинка. А заодно сожаление – ну почему некому это было объяснить простым доступным языком? Столько времени впустую… Попробую уберечь вас от головной боли и максимально доступно объяснить – что такое светодиод и как он работает.

Статья посвящена тем, кто путается в ваттах-канделах-люменах-люксах. Да и вообще в светодиодах. Написано продвинутым чайником для чайников начинающих.

Обычный светодиод – с чем его едят

Первым полупроводником в истории был Иван Сусанин.

Как ни верти, а придется вначале коснуться законов обычного электричества. В наглядных примерах, конечно 🙂 Все мы знаем – что такое 220 вольт – это то, что может как следует стукнуть, если не соблюдать меры предосторожности. Когда вы покупаете электроприбор, например, утюг – в паспорте написано, на какое напряжение он рассчитан. Обычно это 220 вольт. Но в этом же паспорте еще указаны такие параметры – переменное напряжение с частотой 50 герц. Зачем-то же производители упорно указывают эти параметры для вас ? Возьмите в руки любой технический паспорт на электроприбор и посмотрите – там указано, что напряжение питания должно быть – ~ 220 вольт, 50 Гц. Давайте разберемся – что это такое. Значок “~” означает, что напряжение должно быть переменным. В автомобильной бортовой сети, например, напряжение постоянное. И у пальчиковой батарейки оно постоянное. Разница простая – у постоянного напряжения есть плюс и минус – у переменного нет. А почему нет ? Все очень просто. В сети с переменным напряжением плюс и минус постоянно меняются местами. Один и тот же контакт – то плюс, то минус. Как часто ? А вот для этого и существует еще одно значение – 50 Гц. Что такое Гц ? Это одно колебание в секунду. То есть в нашей домашней сети плюс меняется с минусом пятьдесят раз в секунду. А теперь – какая практическая польза от этих знаний, какое это имеет оношение к светодиоду? Давайте разбираться. Предположим, у вас в руках лампочка на 220 вольт 100 ватт. Если вы ее включите в электрическую сеть – она засветится на все свои сто ватт. А если нам не нужны эти 100 ватт ? А нужно, скажем, 50 Вт ?  В этом нам поможет ДИОД.

Если разбить слово “светодиод” на составляющие, то мы получим “свето” и “диод“. То есть это обычный диод, который еще и светится. Диод – это такой прибор, который лучше всего сравнить, например, с клапаном или ниппелем в автоколесе. Туда вы можете закачать воздух, а обратно – ниппель не пускает.  Обычный диод выглядит как черный бочонок с двумя выводами – плюсом и минусом. Вот его мы и можем использовать для пра
15vtктических опытов, которые многим помогают закрепить материал. Конечно, опасно начинать опыты сразу с 220 вольтами, но при должной осторожности ничего страшного не произойдет. Тем не менее, все опыты вы проводите на свой страх и риск 🙂 Нам понадобится лампочка от холодильника на 220в, 15 Вт. Для нее нужно найти подходящий патрон и вывести из него два провода. Затем нам понадобится любой дио
diodд, который можно добыть, например, из любого неисправного телевизора или магнитофона. Чем больше он будет размером – тем лучше. Совсем маленькие брать не надо – 220 вольт все-таки. Возле него обычно есть обозначение в виде треугольника.
Затем нам понадобится сетевой шнур с вилкой, некоторое количество проводов и паяльник. Для начала просто подсоедините лампочку к сети и запомните – как она светится. Затем отсоедините и соберите цепь по схеме слева. Не забудьте тщательно заизолировать изолентой все соединения. Включайте в розетку. Как видите, лампочка светит гораздо хуже. Это и неудивительно – она теперь получает только половину нужного ей напряжения – вторую диод не пускает. Если опыт у вас удался, а диод достаточно большой – вы теперь можете сделать любую свою лампочку пратически вечной. Например, светит у вас в коридоре лампа на 50 ватт и постоянно перегорает. Возьмите 100 ваттную, включите ее через диод – светить она будет примерно как 50 ватт, зато не будет перегорать. Есть, правда, один нюанс – диод должен быть расчитан на напряжение 350-400 вольт и ток не менее ампера. Лучше всего купить такой в магазине радиодеталей.
Ну, раз мы разобрались с тем, что такое диод, есть смысл перейти к интересующей нас теме – светодиоду. У светодиода, как теперь понятно, тоже есть плюс и минус.  То есть для его работы нужен источник постоянного напряжения – аккумулятор, батарейка, блок питания. На блоке питания должно быть указано, что он выдает постоянное напряжение (DC). Обычно на крышке блока есть наклейка такого содержания.
Input – ~220V 50HZ,
output – 12v, 0,5 A DC
Это значит, что такой блок может выдать постоянное напряжение 12 вольт и ток 0,5 ампера.
Отметим, что зарядное устройство для сотовых телефонов – это тоже блок питания. Оно обычно имеет параметры 5-6 вольт, 0,2-0,5 А. Зачастую его очень удобно использовать для питания светодиодов, потому что зарядное устройство стабилизирует ток. Но об этом позже, в следующих статьях.
Нам важны два параметра – рабочее напряжение светодиода и ток. Рабочее напряжение светодиода называют еще “падением напряжения”. В сущности, этот термин обозначает, что после светодиода напряжение в цепи будет меньше на размер этого самого падения. То есть если мы подадим питание на светодиод, у которого падение напряжения 3 вольта, то он эти три вольта сьест, и включенному после него в эту же цепь прибору достанется на 3 вольта меньше. Но самое главное, что нужно усвоить – светодиоду важен ток, а не напряжение. Напряжения он возьмет столько, сколько ему нужно, а вот тока – сколько дадите. То есть если ваш источник питания может выдать 10 ампер – светодиод будет брать ток, пока не сгорит. Логика тут простая – подключенный светодиод потребляет ток и начинает греться. Чем сильнее он греется – тем больше тока через него может пройти – он же от нагрева расширяется. Вместе с током растет падение напряжения на диоде. И так пока не сгорит совсем – ток-то никто не ограничил. А делать это надо обязательно, используя ограничивающий элемент.
Отметим, что если источник питания имеет выходное напряжение, равное рабочему напряжению светодиода – ток ограничивать необязательно. То есть если у вас есть, например, белый светодиод и аккумулятор на 3,6 вольт от сотового телефона – можете прямо к этому аккумулятору и подключить – ничего светодиоду не будет. Он и рад бы побольше тока хапнуть – а напряжения не хватает. Так что аккумулятор от сотового на 3,6 в – идеальный источник питания для экспериментов с белыми и синими светодиодами. Почему только с ними – об этом в других статьях.
В общем, последовательно со светодиодом нам нужно поставить этакий кран и закрутить его на нужное нам значение. В роли такого крана могут выступать разные приборы. Самый простой из них – резистор. Как правильно ограничить ток светодиода говорится в моей статье о подключении светодиодов в авто. А мы пойдем дальше. Правда, если вам неинтересно, как работает светодиод, а всего лишь хочется узнать о его практическом применении – лучше перейти в конец страницы и выбрать другую часть “Для чайников”. Но если вы твердо намерены узнать о твердотельных источниках света “с азов” – продолжим знакомство 😉

Оптические аспекты использования светодиодов

“Существует достаточно света для тех, кто хочет видеть, и достаточно мрака для тех, кто не хочет”

Б. Паскаль

Предположим, мы научились подключать светодиод и ограничивать его ток. Встает вопрос – а насколько сильно он светит ? Тут нам придется немного окунуться в оптику.
В числе свойств светодиодов, особенно мощных, часто указывается тип распределения света. Обычно это так называмая Ламбертов
svetodiod-lambertianская диаграмма
. Дальше мы ее и будем рассматривать как самую распостраненную. Что этот термин обозначает ? “Ламбертовский” светодиод светит во все стороны одинаково, независимо от направления. Если бы светодиод был шариком, он бы во все стороны светил одинаково – вот суть диаграммы Ламберта. Чтобы было понятно- солнце – это ламбертиановский источник.  Стандартная конструкция светодиода – кристалл, тонкая пластинка, которая светится. Посмотрите в прозрачное окошко светодиода – и вы этот кристалл увидите. К нему идут тоненькие проволочки контактов. Если подключить воображение, то можно представить свет, идущий от светодиода, как сферообразное облако, висящее над ним. Свет – это же маленькие частички, называемые фотонами. Значит,  над светодиодом висит шарик, наполненный фотонами. И чем больше света испускает светодиод – тем больше шарик, тем дальше летят фотончики, толкая и вытесняя друг друга. Больше всего их летит вверх перпендикулярно плоскости кристалла, поэтому максимальная сила света светодиодов – 90 градусов относительно горизонтальной оси.  Надеюсь, теперь вам стали более понятны диаграммы, которые приводят производители светодиодов 🙂 Чтобы стали совсем уж понятны – давайте рассмотрим пример.

lambert  Примем, что есть светодиод, вверху которого висит излучаемая им световая сфера диаметром 1 метр (хор-роший светодиод ! :)).
Нижняя шкала – это расстояние до верхушки этого метра, верхняя – градус излучения. В соответствии с этой диаграммой больше всего фотонов – на оси с градусом 0. Чем дальше отклонение от оси и чем больше расстояние от кристалла – тем меньше плотность фотонов. Нужно также не забывать, что свет – это волна, не зря же для характеристик указывают длину волны. Соответственно, нашу световую сферу можно представить как электромагнитное поле с определенной плотностью.  Но это уже дебри – пойдем дальше 🙂

Угол половинной яркости

Производитель обычно указывает такой параметр, как двойной угол половинной яркости. Что означает этот термин ? Как мы выяснили, максимум света светодиод дает в центре, то есть угол равен нулю. Соответственно, чем дальше от центра, тем меньше света. Угол половинной яркости – это когда на “0” градусов светодиод дает 100 условных единиц света, а, например, на 30 градусах (относительно оси “0”) – 50.
degreeНа рисунке I – сила света, Imax – максимальная сила света. ImaxCos – половина силы света. Почему “двойной” – умножаем градусы на два, светодиод же симметрично светит. В итоге мы получаем симпатичный равнобедренный треугольник света. За пределами этого треугольника тоже свет есть, но точка отсчета для характеристики светодиода – это половинный угол.

Кандела

Теперь можно рассмотреть, что же такое Кандела. Кандела – это, по старому, “свеча”. Помните, раньше говорили – люстра или лампа в сто свечей ? В прежние времена нужна была какая-то точка отсчета. Договорились взять нужной толщины свечку, зажечь и считать ее эталоном, этим самым канделом. В наши времена, конечно, считают по-другому. Я не буду подробно объяснять – как, это за рамки статьи уже выходит. Просто есть единица измерения силы света, и она называется Кандела. Ее основная особенность – применение для измерения силы света направленных источников. Вот почему для 5 мм светодиодов значения указываются в канделах, точнее, милликанделах (1 cd=1000 mcd).
Пришло время разобраться, чем 5 мм светодиоды или любые другие в пластиковом корпусе отличаются от мощных.

Особенности конструкции индикаторных 5 мм светодиодов

Как уже говорилось выше, светодиод – это излучающий свет кристалл. Рассмотрим конструкцию светодиода в 5 мм пластиковом корпусе. При внимательном рассмотрении мы обнаруживаем две важных вещи – линзу и рефлектор. В рефлектор
led-diagram помещается кристалл светодиода. Этот рефлектор и задает первоначальный угол рассеивания. Затем свет проходит через корпус из эпоксидной смолы. Доходит до линзы – и тут начинает рассеиваться по сторонам на угол, зависящий от конструкции линзы. На практике – от 5 до
led-diagram-1160 градусов. Для обозначения силы света таких светодиодов как раз и используется кандела. Светодиоды с направленным свечением излучают свет в некотором телесном угле. Чтобы понять, что такое телесный угол, достаточно представить следующую картину. Вы берете фонарик, включаете и помещаете его в пожарное ведро в самый низ, затем закрываете крышкой. Свет внутри, соответственно, имеет вид объемного конуса по форме нашего ведра. Вот этот конус, ограниченный крышкой – и есть телесный угол. Попробую объяснить смысл распределения света попроще. Допустим,  сила света нашего фонаря –  1 кандела, то есть 1000 милликандел(чтобы было более образно, можно считать милликанделы фотонами :)) Если и дальше идти по аналогии, у нас есть полное ведро милликандел. Объем ведра при желании можно вычислить – добро пожаловать в геометрию 🙂 Соответственно, если мы возьмем ведро в два раза больше – милликанделы равномерно по нему распределятся, то есть больше их не станет, просто снизится плотность. Поэтому не гонитесь за канделами, когда выбираете светодиод – чем шире его угол, тем меньше кандел – у одного и того же.  Во всех этих объяснения можно найти ответ на сакральный вопрос – сколько надо светодиодов, чтобы заменить стоваттную лампочку. Об этом – далее.

Особенности конструкции мощных светодиодов

В отличие от индикаторных светодиодов, мощные – это не только прибор, но и маркетиновый продукт. На сегодняшний день между крупными производителями происходит настоящая гонка за люмены – кто больше ? И никого не волнует, что люмены эти надо еще применить. Давайте по порядку.
Основное отличие мощного светодиода от индикаторного в чистом виде  – сведение к минимуму каких-либо препятствий для выхода света из корпуса светодиода. Поэтому мощные светодиоды имеют ламбертовскую диаграмму. К чему это приводит на практике ? Вы включаете светодиод и получаете симпатичный световой шарик над ним. И что дальше делать ? Как им осветить нужную вам поверхность ? Очевидно, что нужно сделать поуже угол излучения. Вам приходится применять различную оптику или рефлекторы, что неизбежно ведет к потерям, а значит и снижению светового потока. Поэтому, если, купив мощный светодиод, вы не обзавелись хорошей оптикой, причем рассчитанной именно на его конструкцию – рано радуетесь – головная боль еще впереди. Доставить нужные вам люмены до поверхности, которую нужно осветить – непростая задача. Впрочем, если вам просто нужно осветить помещение – можно обойтись и без оптики – достаточно рассеивателя.

Люмен

svetodiod-1

Как вы уже поняли, канделы для оценки силы света мощных светодиодов не подходят. Для этого существуют люмены – это общее количество света, которе может дать светодиод при подключении с заданными значениями тока и напряжения. Помните аналогию про пожарное ведро ? Здесь она тоже подходит. Будем считать, что если светодиод имеет силу света 100 люмен – то в нашем ведре будет 100 люмен.  Обычная электрическая лампочка на 100 Вт – это тоже ламбертовский источник. Средняя светоотдача этой лампочки – 10-15 люмен на ватт. То есть 100 ватт лампы накаливания дадут нам, скажем, 1000 люмен. Значит, чтобы заменить лампу 100 вт светодиодами, нужно 10 шт по 100 люмен. Вот так вот все просто ? Нет, к сожалению. Мы подходим к такому термину, как ЛЮКС.

Люкс

Люкс – это соотношение количества люмен и освещаемой площади. 1 люкс – это 1 люмен на квадратный метр. Допустим, у нас есть квадратная поверхность площадью один метр. Вся она равномерно освещена лампочкой, расположенной на некотором расстоянии отвесно сверху . Для этой лампочки производитель заявил освещенность 100 люкс. Берем прибор, называемый люксметр и померяем в любой точке нашего квадрата, мы должны получить 100 люкс. Если это так – производитель нас не обманул.  Это касается источника света, который во все стороны светит одинаково (ламбертиановский источник ). Но светодиод наибольшую силу света имеет на оси, перпендикулярной плоскости кристалла. Иными словами, подвесив светодиод на потолок и померяв люксметром, мы увидим, что чем дальше от оси, тем меньше показания прибора.  Все вы наверняка сталкивались с точечными лампами накаливания – это так называемые “зеркалки”. Задняя часть колбы у этих ламп  покрыта зеркальным составом, и светят они только вниз.  Вот вам и аналог.

Особенности практического применения светодиодов – в следующей статье.

(с) Юрий Рубан, февраль 2009 г, http://led22.ru.  Пожелания и замечания приветствуются на форуме http://ledway.ru или по электронной почтеruban@led22.ru

Источник

Устанавливаем WordPress локально

Установка Apache

В очередной раз Apache убрал со своего сайта бинарники посим качать приходится откуда прийдется:

http://apache.ip-connect.vn.ua/httpd/binaries/win32

(Раздел “Downloading Apache for Windows”)

Далее:

1) Скачиваем и распаковываем

В моем случае это был httpd-2.2.31-x86. Причем версия сервера должна быть потокобезопасна.

2) Настраиваем

В моем случае пришлось отключить модули ssl, прописать корневую дирректорию и порт.

3) Запускаем

Впринципе достаточно трёх комманд:

4) Проверяем что всё работает

В браузере идем на корень установленного сервера. Должны увидеть нечто без ошибки.

Установка MySQL

Расписывать не буду. ПОсле установки у нас есть порт, хост, имя пользователя и пароль. Это надо для дальнейшей настройки.

Установка PHP

1) Скачиваем и распаковываем

Для вышеуказанного web-сервера я скачивал версию php-5.2.17-Win32-VC6-x86. Здесь тоже важна потокобезопасность, так что необходимо быть внимательным.

2) Настраиваем

  • На web-сервере

  • В папке PHP

переименовываем файл php.ini и включаем модули для поддержки MySQL

проверить включены ли модули можно коммандой

3) Запускаем

После изменениий конфигурации не забываем перегружать web-сервер.

4) Проверяем что всё работает

В папке htdocs я создал файлик hello.php со следующим содержимим и ходил на него из браузера

Устновка WordPress

Собсно здесь все вкратце описано

Добавляем карту сайта в поисковики Google и Yandex

Как добавить карту сайта Sitemap.xml в Google и Яндекс

Сегодня я покажу, как добавить Sitemap.xml в Google и Яндекс. Напомню, что файл Sitemap – это карта сайта в формате XML для поисковиков, которая не видна посетителям блога. Она содержит список страниц сайта, которые должны быть проиндексированы поисковыми роботами, информацию о степени их важности и частоте обновления. Создание такой карты сайта помогает улучшить внутреннюю SEO оптимизацию сайта.

Подробнее можно почитать в моей статье, где описано, как создать карту сайта Sitemap.xml и зачем она нужна на блоге WordPress.

Как добавить карту сайта Sitemap.xml в панели для вебмастеров Яндекс и Google

Чтобы добавить файл Sitemap в Google и Яндекс, надо, прежде всего, его создать. Далее добавляем сайт в панели для вебмастеров Яндекса и Гугла и подтверждаем права на сайт. Если Вы этого еще не сделали, то ранее я писал, как добавить сайт в Яндекс.Вебмастер и как добавить блог в Google Webmasters Tools.

Теперь переходим непосредственно к добавлению карты сайта в поисковики. Сообщить поисковым системам о наличии файла Sitemap можно двумя способами:

  • Добавить директиву Sitemap в файл robots.txt. Подробнее об этом в статье “Правильный robots.txt“.
  • Добавить файлы Sitemap в поисковики в Яндекс.Вебмастер и Инструменты для веб-мастеров Гугл.

Даже если у Вас уже прописаны пути к карте сайта в robots.txt, выполнение второго способа будет совсем не лишним.

Как добавить Sitemap.xml в Яндекс.Вебмастер

Заходим в панель Яндекс.Вебмастер по ссылке http://webmaster.yandex.ua/, предварительно авторизовавшись. Выбираем в списке добавленных сайтов тот, чей файл Sitemap хотим добавить в Яндекс. В левом меню “Общая информация” выбираем пункт “Настройка индексирования” – “Файлы Sitemap“. На открывшейся странице в специальное поле вводим полный путь к карте сайта и нажимаем кнопку “Добавить“.

1

Теперь карта сайта XML добавлена в поисковик Яндекс и файл Sitemap будет находиться в обработке около двух недель.

2

 

Если все сделано правильно, то через время можно будет наблюдать такую картину:

3

Как видите, я добавил в Яндекс два файла: Sitemap.xml и Sitemap.xml.gz. Второй – это запакованный XML-файл, сгенерированный плагином для WordPress Google XML Sitemaps. Думаю, сжатый файл Sitemap добавлять в Яндекс не обязательно, так как при нажатии на любую из кнопок “Подробнее“, можно увидеть совершенно одинаковую информацию.

4

Я оставил добавленными оба файла Sitemap, так как индексация блога проходит без проблем, и не вижу смысла что-то менять.

Если потребуется удалить карту сайта, нажмите на крестик напротив названия файла (см. предыдущий рисунок).

Как добавить файл Sitemap в Google

Здесь все делаем аналогично. Авторизуемся в Гугл и входим в Инструменты для вебмастеров по ссылке https://www.google.com/webmasters/tools/. Выбираем из списка нужный сайт и в левом меню выбираем пункт “Конфигурация сайта” – “Файлы Sitemap“. Нажимаем кнопку “Добавление/Проверка файла Sitemap“.

5

Появится всплывающее окно, где вводим адрес карты сайта и нажимаем “Отправить файл Sitemap“. Обратите внимание, что адрес http://blogibiznes.ru/ уже автоматически подставлен и надо дописать только недостающую часть.

6

Далее нажимаем “Обновите страницу“.

7

Как видим, добавить Sitemap.xml в Google и получить информацию о нем можно быстрее, чем в Яндекс.

8

Точно также, при необходимости, делается проверка файла Sitemap в Гугл. Только для этого надо будет нажать кнопку “Проверить файл Sitemap” во всплывающем окне.

Если при добавлении XML-файлов в Google возникли ошибки, удалите файлы из списка (см. рисунок выше) и попробуйте загрузить их вновь.

Добавить Sitemap.xml в Яндекс и Google надо один раз. Теперь при появлении новых статей на блоге поисковики точно не пропустят их при индексации, а сам процесс будет происходить быстрее. Карта сайта автоматически обновляется в панелях вебмастеров Яндекса и Гугла. Поэтому добавлять каждый раз новый файл Sitemap не надо.

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

Источник

 

Java коллекции

Введение

Java коллекции, наверное, наиболее распространенные сущности с которыми работает программист. Причем в завасимости от области разработки варьируется также и глубина осознания реализации той коллекции с которой работает разработчик. К примеру, в web разработке очень часто та или иная коллекция используется как промежуточная структура данных, целью которой является передать данные из DAO уровня в сервис или UI. Для многих опытных инженеров даже отсутствует разница между ArrayList и LinkedList, поскольку и та и другая структура полностью удовлетворяют его нуждам и нет причин использовать преимущества одной из них.

И в общем то хорошо все как-бы. Есть коллекции – бери любую работай и проблем не знай. Кабы вот на собеседованиях не пытали бесполезными вопросами. Да и в приграммировании низкоуровневых алгоритмов без них никуда, иногда за счет просаживания по перфомансу алгоритм может просто не взлететь и тогда уж очень важны становятся те “мелочи” на которые не обращаешь внимания изначально. Сюда же как следствие можно добавить модное сейчас направление “биг дата”, где очень пригодятся знания о всякоразных ньюансах и особенностях Java Collections Framework.

Давайте постараемся бегло рассмотреть общую структуру Java коллекций дабы получить общее представление об оных.

Для начала упомянем что Java Collections Framework не единственный фреймворк предоставляющий возможность работы с коллекциями вот еще некоторые:

1. Guava (Google Collections Library) – Библиотека добавляет несколько полезных реализаций структур данных, таких как мультимножество, мультиотображение и двунаправленное отображение. Улучшена эффективность.
2. Trove library – Реализация коллекций, позволяющая хранить примитивы (в Java Collections Framework примитивы хранить нельзя, только сущности унаследованные от класса Object), что позволяет повысить эффективность работы.
3. PCJ (Primitive Collections for Java) – так же как и Trove предназначены для примитивных типов, что позволит повысить эффективность.
4. Наконец Вы сами можете написать собственную коллекцию (тот же связной список). Иногда бизнес логика может затребовать существования некоего объекта, который должен частично реализовывать функционал коллекции. Так что опыт работы может здесь пригодится.

Как видим, выбрать есть из чего. Но для начала необходимо освоить базовые коллекции Java которыми пользуются чаще всего. К тому же некоторые сторонние библиотеки реализуют интерфейсы Java Collections Framework (пример Guava). То есть знание иерархии классов базовых коллекций позволит более быстро освоить сторонние библиотеки.

Базовые интерфейсы

В библиотеке коллекций Java существует два базовых интерфейса, реализации которых и представляют совокупность всех классов коллекций:

1. Collection – коллекция содержит набор объектов (элементов). Здесь определены основные методы для манипуляции с данными, такие как вставка (add, addAll), удаление (remove, removeAll, clear), поиск (contains)
2. Map –  описывает коллекцию, состоящую из пар “ключ — значение”. У каждого ключа только одно значение, что соответствует математическому понятию однозначной функции или отображения. Такую коллекцию часто называют еще словарем (dictionary) или ассоциативным массивом (associative array). Никак НЕ относится к интерфейсу Collection и является самостоятельным.

Хотя фреймворк называется Java Collections Framework, интерфейс Map и его реализации входят во фреймворк также!
Интерфейсы Collection и Map являются базовыми, но они не есть единственными. Их расширяют другие интерфейсы, добавляющие дополнительный функционал. О них мы ещё поговорим.

Интерфейс Collection

jc1

Итак, что же порождает Collection? Как видно с диаграммы, интерфейс Collection не является базовым. Он расширяет интерфейс Iterable, у которого есть только один метод iterator(). Это значит что любая коллекция будет возвращать итератор а также ее можно без всяких трудностей использовать в конструкции foreach.

Итератор – объект, который абстрагирует за единым интерфейсом доступ к элементам коллекции. Итератор это паттерн позволяющий получить доступ к элементам любой коллекции без вникания в суть ее реализации.

Идем дальше. Как видим на рисунке, интерфейс Collection расширяют интерфейсы List, Set и Queue. Давайте рассмотрим зачем нужен каждый.
1. List – Представляет собой упорядоченную коллекцию, в которой допустимы дублирующие значения. Иногда их называют последовательностями (sequence). Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу.
2. Set – описывает коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому понятию множества (set).
3. Queue – очередь. Это коллекция, предназначенная для хранения элементов в порядке, нужном для их обработки. В дополнение к базовым операциям интерфейса Collection, очередь предоставляет дополнительные операции вставки, получения и контроля.

Реализации интерфейса List

jc2

Красным на рисунке выделены интерфейсы, зеленым – абстрактные классы, а синим готовые реализации. Сразу заметим что здесь не вся иерархия, а только основная её часть.

Как видим на рисунке, между интерфейсом и конкретной реализацией коллекции существует несколько абстрактных классов. Это сделано для того, что бы вынести общий функционал в абстрактный класс, таким образом реализовать повторное использование кода.

ArrayList – пожалуй самая часто используемая коллекция. Он инкапсулирует в себе обычный массив, длина которого может увеличиваться при добавлении новых элементов. Так как ArrayList использует массив, то  время доступа к элементу по индексу минимально (В отличии от LinkedList). При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его емкость, capacity) не изменяется. Если при добавлении элемента, оказывается, что массив полностью заполнен, будет создан новый массив размером (n * 3) / 2 + 1, в него будут помещены все элементы из старого массива + новый, добавляемый элемент.

LinkedList – Двусвязный список. Это структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и две ссылки («связки») на следующий и предыдущий узел списка. Доступ к произвольному элементу осуществляется за линейное время (но доступ к первому и последнему элементу списка всегда осуществляется за константное время — ссылки постоянно хранятся на первый и последний, так что добавление элемента в конец списка вовсе не значит, что прийдется перебирать весь список в поисках последнего элемента).

Реализации интерфейса Set

jc3

HashSet – коллекция, не позволяющая хранить одинаковые объекты (как и любой Set).  HashSet инкапсулирует в себе объект HashMap (то-есть использует для хранения хэш-таблицу).
Как большинство читателей, вероятно, знают, хеш-таблица хранит информацию, используя, так называемый, механизм хеширования, в котором содержимое ключа используется для определения уникального значения, называемого хеш-кодом. Этот хеш-код затем применяется в качестве индекса, с которым ассоциируются данные, доступные по этому ключу. 

Если Вы хотите использовать HashSet для хранения объектов СВОИХ классов, то вы ДОЛЖНЫ переопределить методы hashCode() и equals(), иначе два логически-одинаковых объекта будут считаться разными по хеш-коду, так как при добавлении элемента в коллекцию будет вызываться метод hashCode() класса Object (который скорее-всего вернет разный хэш-код для ваших объектов).
Важно отметить, что класс HashSet не гарантирует упорядоченности элементов, поскольку процесс хеширования сам по себе обычно не порождает сортированных наборов. Если вам нужны сортированные наборы, то лучшим выбором может быть другой тип коллекций, такой как класс TreeSet.

LinkedHashSet – поддерживает связный список элементов набора в том порядке, в котором они вставлялись. Это позволяет организовать упорядоченную итерацию вставки в набор. То есть, когда идет перебор объекта класса LinkedHashSet с применением итератора, элементы извлекаются в том порядке, в каком они были добавлены.

TreeSet – коллекция, которая хранит свои элементы в виде упорядоченного по значениям дерева. TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов. TreeSet хорош тем, что для операций add, remove и contains потребуется гарантированное время log(n).

Реализации интерфейса Queue

jc4

PriorityQueue – единственная прямая реализация интерфейса Queue (не считая LinkedList, который больше является списком, чем очередью).

Реализации интерфейса Map

Интерфейс Map соотносит уникальные ключи со значениями. Ключ — это объект, который вы используете для последующего извлечения данных. Задавая ключ и значение, вы можете помещать значения в объект карты. После того как это значение сохранено, вы можете получить его по ключу.

jc5

HashMap — основан на хэш-таблицах, реализует интерфейс Map. Ключи и значения могут быть любых типов, в том числе и null. Данная реализация не дает гарантий относительно порядка элементов. Больше можно почитать здесь.

LinkedHashMap –  расширяет класс HashMap. Он создает связный список элементов в карте, расположенных в том порядке, в котором они вставлялись. Это позволяет организовать перебор карты в порядке вставки. То есть, когда происходит итерация по коллекционному представлению объекта класса LinkedHashMap, элементы будут возвращаться в том порядке, в котором они вставлялись. Вы также можете создать объект класса LinkedHashMap, возвращающий свои элементы в том порядке, в котором к ним в последний раз осуществлялся доступ. Рекомендуется почитать.

Небольшое замечание. Очень часто, как было уже означено, есть необходимость использовать список пар (ключ значение). И, по правде говоря, в Java не существует из коробки коллекции, которая бы позволила наполнить этот список и затем по нему пройтись. Выход казалось бы очевидный – создать кастомный класс пары (ключ, значение) и помещать такие объекты в любимый список. Но очень часто программисты для этого используют именно HashMap. Но тут есть два ньюанса. Во первых механизм хеширования. Для описанной задачи он явно излишний – ведь обходить нам надо весь список по порядку а не брать произвольный элемент изнутри. И во вторых порядок. Как было уже сказанно HashMap не гарантирует порядок хранения элементов. В отличие от LinkedHashMap. Посим как вывод, если вам нужен упорядоченный список пар – используйте LinkedHashMap.

TreeMap – красно-черное дерево реализующее интерфейс NavigableMap. Коллекция сортируется по естественному упорядочиванию (natural ordering) ее ключей или с помощью интерфейса Comparator который задается при создании коллекции. Эта имплементация гарантирует время доступа log(n) для следующих методов: containsKey, get, put и remove.

WeakHashMap – основан на хэш-таблицах, реализует интерфейс Map с так называемыми слабыми ключами (weak keys). Пара в данной коллекции автоматически будет удалена когда ссылка на ключ больше нигде не используется. Другими словами, нахождение объекта представленного ключем в данной коллекции не блокирует сборщик мусора от зачистки. После того как ключ будет зачищен вся пара будет удалена из коллекции.

Другие коллекции

Их еще называют “устаревшими”. Но я не нашел аннотации @Deprecated или каких-либо иных, которые бы запрещали их использование в коде.

  1. Enumeration — Интерфейс. В современной версии Java рекомендуется применять Iterator.
  2. Dictionary — Абстрактный класс, аналог интерфейса Map. Реализации не имеет, посим рекомендую его рассматривать как интерфейс. Наиболее известная реализация – Hashtable.
  3. Hashtable — Класс. Имплементит классическую структуру данных – хэш таблицу. В современных версиях Java рекомендуется использовать HashMap.
  4. Vector — Класс. Аналог класса ArrayList. Поддерживает упорядоченный список элементов, хранимых во “внутреннем” массиве.
  5. Stack — Класс. Производный от Vector,  в который добавлены методы “вталкивания” (push) и “выталкивания” (pop) элементов,  так что список может трактоваться в терминах, принятых для описания структуры данных стека (stack).

Все методы Hashtable, Stack, Vector являются синхронизированными, что делает их менее эффективными в однопоточных приложениях.

Синхронизированные коллекции

Получить синхронизированные объекты коллекций можно с помощью статических методов synchronizedMap и synchronizedList класса Collections.

Map m = Collections.synchronizedMap(new HashMap());
List l = Collections.synchronizedList(new ArrayList());

Синхронизированные обрамления коллекций synchronizedMap и synchronizedList иногда называют условно потоко безопасными – все операции в отдельности потокобезопасны, но последовательности операций, где управляющий поток зависит от результатов предыдущих операций, могут быть причиной конкуренции за данные. Здесь более. Условная безопасность потоков, обеспечиваемая synchronizedList и synchronizedMap представляет скрытую угрозу – разработчики полагают, что, раз эти коллекции синхронизированы, значит, они полностью потокобезопасны, и пренебрегают должной синхронизацией составных операций. В результате, хотя эти программы и работают при лёгкой нагрузке, но при серьёзной нагрузке они могут начать выкидывать NullPointerException или ConcurrentModificationException.

Кроме того всегда существует возможность “классической” синхронизации с помощью блока synchronized.

Заключение

В заключение приведем общую диаграмму рассмотренной иерархии:

jc6

 

Полезные статьи

Java собеседование. Коллекции