Разное

Шпаргалка java: Java SE — Шпаргалка для собеседований и повторений / Хабр

Содержание

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

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

Поэтому я подготовил данный сборник видео докладов на русском языке с различных конференций (Joker, JPoint, JavaDays, JEEConf, конечно, с DEV labs, которые организовывает Luxoft), и, естественно, видео из канала Luxoft Training Center. Всё видео разделено на различные категории и при необходимости добавлено описание.

Update: Внимание, актуальная версия со всеми ссылками на видео находиться теперь в моем github’e проекте useful-java-links, по этой ссылке.

Общее оглавление ‘Шпаргалок’

Чего НЕ БУДЕТ в данном сборнике:
1. Не будет видео про scala, так как scala это целый отдельный мир, для программистов на scala могу порекомендовать вот этот сборник,
2. Не будет видео на английском языке, я старался выбирать русскоязычное видео, так как далеко не все программисты все-таки владеют английским в совершенстве, ну и англоязычного видео слишком много, поэтому я решил остановится пока только на русскоязычных видео (и небольшом количестве видео на украинском языке), К тому же, уверен, для англоязычного видео по Java в инете и так найдется немало подобных сборников.

Не стесняйтесь писать в комментариях (или мне в личку) о других интересных видео по Java, которое нет в этом списке.

Итак, начнем:

1. Вопросы оптимизации и производительности

1.1 Производительность и оптимизация

  1. Сергей Куксенко — «Квантовые» эффекты производительности,
  2. Сергей Куксенко — Сессия вопросов-ответов о производительности Java,
  3. Алексей Шипилёв и Сергей Куксенко, Россия — Методология оптимизации производительности,
  4. Сергей Куксенко, Oracle — Железные счётчики
  5. Алексей Шипилёв, Oracle — Катехизис java.lang.String — о реализации строк в Java, способы оптимизации работы со строками и ошибки, которые часто допускают при оптимизации работы со строками,
  6. Алексей Шипилёв — Java Benchmarking: как два таймстампа прочитать!
  7. Алексей Шипилёв — Java Benchmarking: как два таймстампа записать
  8. Алексей Шипилёв и Сергей Куксенко — Оптимизация производительности Java-приложений: теория
  9. Алексей Шипилёв и Сергей Куксенко — Оптимизация производительности Java-приложений: детали
  10. Алексей Шипилёв и Сергей Куксенко — Оптимизация производительности Java-приложений: ещё детали
  11. Олег Бунин, Андрей Паньгин, Алексей Рагозин, Олег Анастасьев — Круглый стол. HighLoad
  12. Алексей Шипилёв, Oracle — Сжимай меня полностью
  13. Дмитрий Лазаренко — Оптимизация работы JVM в облаке
  14. Дмитрий Чуйко — Быстрая загрузка ваших классов
  15. Глеб Смирнов — HotSpot, что ты делаешь?! Ахаха, прекрати!
  16. Kirill Golodnov — О бесконечно долгой работе дочерних процессов Java-приложения
  17. Андрей Афанасьев — Оптимизация производительности распределенных приложений…
  18. Руслан Черёмин — Disruptor и прочие фокусы
  19. Gleb Smirnov — Side-By-Side Performance Comparisons — что значит «тормозит» и как с этим бороться
  20. Nikita Salnikov Tarnovski — First steps in GC tuning — проблемы, связанные с производительностью из-за сборщика мусора

1.2 Высоконагруженные приложения (HighLoad)

  1. Андрей Паньгин — Особенности разработки высоконагруженного сервера на Java
  2. Алексей Шевчук — Подходы к решению проблем производительности высоконагруженых сервисов
  3. Роман Елизаров — Миллионы котировок в секунду на чистой Java
  4. Олег Анастасьев — За гранью возможного (Keynote) — о проблемах при создания Однокласников и решения для высоконагруженных сервисов,
  5. Андрея Паньгина — Выжимаем из сервера максимум: приемы кеширования и передачи данных на Java — описание приемов создания высоконагруженных систем на Odnoklassniki.ru,
  6. Alexander Oleynikov — Практический опыт построения API высоконагруженных сервисов — описание создания высоконагруженных систем в Yandex’е,
  7. Valerii Moisieienko — How to Manage 10K request per second in HA manner — история разработки высоконагруженного приложения на недорогом железе,

1.3 Сборка мусора, утечки памяти и работа с памятью

  1. Алексей Рагозин — Сборка мусора, битва алгоритмов
  2. Владимир Долженко — GC: друг или враг?
  3. Роман Елизаров — Почему GC съедает все моё CPU?
  4. Никита Сальников-Тарновский, Plumbr — Где моя память, чувак?!
  5. Глеб Смирнов, Plumbr — Тайны — в наших головах, а не в JVM
  6. Никита Сальников-Тарновский — Утечки памяти
  7. Алексей Шипилёв — О чём молчат Heap Dump-ы
  8. Владимир Воскресенский — Микрохирургия HotSpot
  9. Александр Макаров — Исследование возможностей и ограничений JVM по оптимизации памяти
  10. Андрей Паньгин — Кеширование данных вне Java Heap и работа с разделяемой памятью в Java
  11. Владимир Иванов — G1 Garbage Collector
  12. Иван Крылов — StructuredArray и ObjectLayout — как JVM представляет объекты и вопросы производительности представления объектов,
  13. Никита Сальников-Тарновский — Heap, off you go
  14. Nikita Salnikov-Tarnovski — I bet you have a permgen leak in your application — утечки памяти из-за class load’ов

2. Инструменты и IDE

2.1 IDE и инструменты разработки

  1. Андрей Зайцев, Дмитрий Нестерук, JetBrains — Инструменты командной разработки
  2. Николай Чашников — Поддержка Java 8 в IntelliJ IDEA
  3. Андрей Солнцев — Eclipse vs Intellij IDEA
  4. Николай Чашников — IntelliJ IDEA изнутри
  5. Дмитрий Найданов — Play Framework 2.0 в IntelliJ IDEA
  6. Николай Чашников — Компилятор Java и IDE: взаимовыгодное сотрудничество
  7. Андрей Чепцов, Барух Садогурский, Антон Архипов — Круглый стол. Инструменты Java-разработчика
  8. Александр (Шура) Ильин — Анализ покрытия с помощью JCov
  9. Антон Архипов — JRebel — инструмент, который позволяет «на лету» перезагружать классы, измененные с момента развёртывания приложения.,
  10. Барух Садогурский — Разработка модулярного софта: добро пожаловать в АД!
  11. Alexey Alexandrov — All inclusive Jeastic PaaS — описание платформы для облачных вычислений
  12. Baruch Sadogurskii — Managing Modular Software for your NuGet, C++ and Java Development
  13. Philip Torchinsky — Интеграция баг-трекера и сервера CI с IntelliJ IDEA
  14. ladimir Kozhaev — How to write IDE for your DSL in one day
  15. Евгений Борисов — Power of Gradle
  16. Sergey Morenets — Gradle 2. Write once, build everywhere — внимание: видео на украинском языке

2.2 Отладка, профилирование, мониторинг

  1. Алексей Рагозин — Непрерывное профилирование Java-приложений в ходе эксплуатации
  2. Андрей Паньгин, Одноклассники — Лучший отладчик — сделанный своими руками
  3. Владимир Ситников — Профайлер в каждый дом
  4. Владимир Красильщик — Мониторинг Java-приложения с многопроцессной архитектурой
  5. Виталий Трифанов и Дмитрий Цителов — Динамическое обнаружение гонок в многопоточных Java-программах
  6. Андрей Паньгин — Лучший отладчик — сделанный своими руками
  7. Андрей Паньгин — Аварийный дамп — черный ящик упавшей JVM
  8. Андрей Паньгин — Анализ аварийных дампов JVM, часть 2
  9. Андрей Паньгин — Анализ аварийных дампов JVM, часть 1
  10. Александр Отенко — О чём молчит профайлер
  11. Андрей Паньгин — Аварийный дамп — «черный ящик» JVM
  12. Алексей Рагозин — Диагностические интерфейсы JVM, или Как сделать профайлер своими руками
  13. Владимир Воскресенский — Практическое применение OSS для анализа Java-приложений — Использование Oracle Solaris Studio для анализа высокопроизводительных Java-приложений
  14. Алексей Шипилёв — (The Art of) (Java) Performance Benchmarking II

3. Особенности разных языков JVM и версий Java

3.1 Groovy и Grails

  1. Барух Садогурский, Евгений Борисов — Эпичные Groovy Puzzlers — Месть Скобок
  2. Барух Садогурский и Евгений Борисов — Groovy Puzzlers
  3. Барух Садогурский и Евгений Борисов — Groovy Puzzlers — Странное, Непонятное и Мамочки-а-это-что-такое?!
  4. Евгений Борисов — Марлезонский балет по Groovy в трех частях
  5. Барух Садогурский — Метапрограммирование на уровне компилятора в Groovy
  6. Барух Садогурский — Groovy DSL для plugin-ов: расширения человеческим языком
  7. Барух Садогурский — Транcформации Абстрактного Синтаксического Дерева в Груви. ЩИТО?!
  8. Izzet Mustafaiev — Groovy MOPping — принципы построения DSL на groovy
  9. Baruch Sadogursky — Search for the Holy Grail (and test it once found) — какие решения для поиска существуют в Grail и какие решения для тестирования существуют в Grails

3.2 Clojure

  1. Николай Рыжиков — Clojure: интерактивная разработка для интерактивного веб
  2. Maurice Naftalin — Closures and Collections: the World After Eight
  3. Dmitriy Morozov — ETL all the things! — использование ETL (Extract, transform, load) в Clojure, как можно использовать Spark c Clojure,
  4. Misha Kozik — DSL in Clojure — использование Clojure для написания DSL,

3.3 Kotlin

  1. Андрей Бреслав — Type-safe Web with Kotlin
  2. Андрей Бреслав — Project Kotlin
  3. Евгений Геращенко — Kotlin, язык программирования для JVM
  4. — Язык программирования Kotlin

3.4 Java Embedded и IoT

  1. Александр Белокрылов, Александр Мироненко, Oracle — Восстание машин: в энтерпрайз с 256 КБ RAM
  2. Белокрылов, Мироненко — Силовая установка c сердцем из Raspberry Pi и мозгом на Java Embedded
  3. Александр Белокрылов и Александр Мироненко — Java Embedded у вас дома
  4. Александр Мироненко и Александр Белокрылов — Java Embedded у вас дома
  5. Лев Прийма — Java SE Embedded 8
  6. Александр Белокрылов и Александр Мироненко — Полноценный Java runtime, 256Kb RAM и 5 литров пива
  7. — Java ME Embedded: проверенные технологии на перспективных рынках
  8. Yakov Fain — RESTful services and OAUTH protocol in IoT

3.5 Java EE 7

  1. Markus Eisele — 50 Best Features of Java EE 7

3.6 Java 8, лямбды и Stream Api

  1. Сергей Куксенко — Я, лямбда
  2. Сергей Куксенко — JDK 8: Молот лямбд
  3. Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 1
  4. Владимир Иванов — Java 8 и JVM: что нового в HotSpot
  5. Сергей Куксенко — Java 8: Advanced Stream Techniques
  6. Дмитрий Козорез — Java 8 Time API
  7. Владимир Иванов — Java 8: что нового в HotSpot JVM?
  8. Maurice Naftalin — What’s New in Java 8
  9. Александр Ильин — Type annotations in Java 8. И почему это хорошо
  10. Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 2
  11. Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 1
  12. Сергей Куксенко — Stream API, часть 2
  13. Сергей Куксенко — Stream API, часть 1
  14. Сергей Куксенко — JDK8: Stream style
  15. Алексей Фёдоров — Компромиссы в Java 8 с примерами и картинками
  16. Александр Белокрылов — Знакомьтесь, Java 8
  17. Дмитрий Козорез — Долгий путь к Лямбдам
  18. Соколов Михаил — Java 8: лямбда выражения и Stream API
  19. Oleg Tsal-Tsalko — Java 8 Date&Time benefits
  20. Oleg Tsal-Tsalko — Java 8 Lambdas Hands-On-Labs
  21. Pavel Grushetzky — Java for hipsters and rocks stars
  22. Oleg Tsal-Tsalko — 10+ new features you ought to know using Java 8

3.7 Java 9+ и будущее Java

  1. Иван Крылов, Владимир Иванов, Volker Simonis, Никита Липский — Круглый стол. Будущее Java-платформы
  2. Владимир Иванов — Future of Java: 9 and beyond
  3. Владимир Иванов — Платформа Java: прошлое и будущее
  4. Шура Ильин — Project Jigsaw. Take 2
  5. Александр Белокрылов, Oracle — Java: эволюция неизбежна
  6. Аня Барски — Java Life Story
  7. Olena Syrota, Oleg Tsal-Tsalko — Standard Java JSON binding. When? — описание существующих библиотек работы с JSON, их особенностей и проблем, ожидание стандартного JSON’a в Java 9

4. Фреймворки Java

4.1 Spring

  1. Барух Садогурский, Евгений Борисов — Spring Puzzlers — Начало
  2. Евгений Борисов — Spring Data? Да, та!
  3. Барух Садогурский, Евгений Борисов, Николай Алименков — Зачем у Spring столько конфигураций?
  4. Евгений Борисов — Spring the Ripper
  5. Евгений Борисов — Spring-потрошитель, часть 2
  6. Евгений Борисов — Spring-потрошитель, часть 1
  7. Евгений Борисов — Spring 4.0: новое поколение
  8. Владимир Сонькин — Использование Spring 4 и AngularJS для разработки веб-приложений на базе архитектуры REST
  9. Меркурьев Евгений — Весна идет, весне — дорогу! Новое в Spring Framework
  10. Artem Bilan — Spring and Messaging: The next development generation
  11. Vladimir Tsukur — From CRUD to Hypermedia APIs with Spring
  12. Igor Khotin — App infrastructure for microservices with Spring Cloud 1.0.0 — микросервисы, cloud, Spring и DevOps,
  13. Sergey Morenets — Spring Boot. Boot up your development — описание фреймворка Spring Boot, почему данный фреймворк позволяет создавать приложения намного быстрее,

4.2 Вебфреймворки (JavaFX, Javascript, AngularJS и т.п.)

  1. Сергей Гринёв — JavaFX: FXML и SceneBuilder
  2. Артём Ананьев — Неформально о JavaFX
  3. Дмитрий Кузовец — FXML и SceneBuilder: отделяем пользовательский интерфейс от логики в JavaFX
  4. Павел Нестеренко — Java + JavaScript: переходи на мобильную сторону
  5. Евгений Родин — Асинхронная обработка данных в web-приложениях на Java
  6. Евгений Родин — Разработка веб-сайтов средствами Java (на примере простого сайта) — примеры разработки вебсайта с использованием mysql, tomcat и т.п. технологий
  7. Соколов Дмитрий — Как выбрать библиотеки для современного Web-приложение на Java
  8. Владимир Сонькин — Использование AJAX в разработке web-приложений на Java
  9. Александор Дворецкий — Как подготовиться к созданию нагруженных сайтов
  10. Владимир Сонькин — Использование Spring 4 и AngularJS для разработки веб-приложений на базе архитектуры REST
  11. Victor Polischuk — Web-application I have always dreamt of
  12. Nikita Lipsky — Delivering Native User Experience in Client-Side Java Applications — нативные клиенты для работы с вебом вместо браузерного веба (от мобильных до десктопных приложений),
  13. Olga Semeniuk — Less JS! Web components for back-end developers — введение в веб компоненты для бакенд разработчиков

4.3 Прочие фреймворки и популярные библиотеки

  1. Цытович Павел — Основы разработки приложения на платформе Android
  2. Андрей Шевченко — Генерация больших отчетов с использованием Jasper Reports
  3. Владимир Красильщик — Java-mapping для прагматичных программистов — использования библиотек и фреймворктов для mapping’а (dozer, spring type converter api, nomin, scala dsl, transmorf и т.д.)
  4. Andrii Golovei — Highly available and scalable application for dummies with Storm — Storm фреймворк для машинного обучения, высокопроизводительных вычислений

5. Базы данных, поисковые системы и BigData

5.1 NoSql и кеши

  1. Олег Анастасьев — За гранью NoSQL: NewSQL на Cassandra
  2. Алексей Зиновьев — Мама, я так хочу Hibernate для NoSQL, ну или что там у вас есть на примете
  3. Яков Жданов — In-memory accelerator for MongoDB
  4. Олег Анастасьев — Класс! ная Cassandra
  5. Роман Антипин — Франкенштейнизация Voldemort, или Key-Value данные в «Одноклассниках»
  6. Яков Жданов — От дисковой архитектуры к In-Memory
  7. Алексей Рагозин — Блеск и нищета распределенных кешей
  8. Alexey Tokar — MongoDB в продакшене — миф или реальность?
  9. Artem Orobets — How do you store your data?
  10. Roman Nikitchenko — Big Data: from mammoth to elephant – transforming legacy with Hadoop — как преобразовать легаси проекты в новые Big Data приложений с современным стеком технологий,

5.2 Sql базы данных и JPA

  1. Николай Алименков — Босиком по граблям Hibernate
  2. Яков Сироткин, Sidenis — Миграция с PL/SQL на Java

5.3 Поисковые системы

  1. Михаил Хлуднев — В поисках Tommy Hilfiger — о Apache Lucene, свободной библиотеки для высокоскоростного полнотекстового поиска, о разных системах поиска,
  2. Alexey Tokar — To find a needle in a haystack — о нечетком поиске в словарях от разработчика Яндекса

5.4 BigData, Data Scientist, Машинное обучение

  1. Алексей Зиновьев — Java в качестве основного рабочего инструмента Data Scientist
  2. Roman Nikitchenko — Apache HBase: crazy dances on the elephant back
  3. Serhiy Masyutin — Big Data Analysis — внимание на украинском языке
  4. Boris Trofimov — Scalding Big Data: Thorns and Roses,
  5. Taras Matyashovskyy — Introduction to Real-Time Big Data with Apache Spark — внимание на украинском языке
  6. Serhiy Masyutin — Big Data analysis approaches in Java world — что такое Big Data, технология Map-Reduce и примеры проектов
  7. Kyrylo Holodnov — Scaling a solution of an NP-hard problem with Apache ZooKeeper — о Apache ZooKeeper, как с работать и решать различные задачи,
  8. Andrii Golovei — Elastic stack in BigData — использование полнотексового поиска в BigData используя решения компании Elastic (Elastic Search)

6. Особенности языка Java

6.1 Cериализации

  1. Роман Елизаров — Факты и заблуждения о Java-сериализации
  2. Olena Syrota, Oleg Tsal-Tsalko — Standard Java JSON binding. When? — описание существующих библиотек работы с JSON, их особенностей и проблем, ожидание стандартного JSON’a в Java 9

6.2 Работа с байткодом, java agent’ы, class loader и компиляции на лету

  1. Антон Архипов, ZeroTurnaround — Javassist на службе у Java-разработчика
  2. Никита Липский — Ahead-of-time компиляция
  3. Антон Архипов — Java-агенты, Instrumentation API и Javassist
  4. Антон Архипов — Загрузчики классов в Java: коллекция граблей
  5. Владимир Иванов — Динамическая (JIT) компиляция в JVM
  6. Дмитрий Завалишин — Конвертер байткода JVM для виртуальной машины Фантом

6.3 Aсинхронность и многопоточность

  1. Барух Садогурский — Как написать асинхронные многопоточные HTTP приложения
  2. Алексей Шипилёв — ForkJoinPool в Java 8
  3. Николай Алименков — Прикладная многопоточность
  4. Дмитрий Чуйко, Oracle — CompletableFuture уже здесь
  5. Глеб Смирнов — Расчленяя многопоточность
  6. Алексей Шипилёв — Прагматика Java Memory Model
  7. Глеб Смирнов — Многопоточность Java под капотом
  8. Роман Елизаров — Теоретический минимум для понимания Java Memory Model
  9. Дмитрий Чуйко — Новинки в java.util.concurrent
  10. Алексей Шипилёв — Bulletproof Java Concurrency
  11. Сергей Куксенко — Модель памяти
  12. Руслан Черёмин — Модель памяти Java: близкие контакты третьей степени
  13. Alexey Fyodorov — Atomics, CAS, and Nonblocking Algorithms — вопросы многозадачности, атомики, неблокирующие алгоритмы, CAS и т.п.
  14. Mikalai Alimenkou — Java Concurrency Applied — примеры практических решений про многозадачность

6.4 Интеграция

  1. Николай Алименков — Нужен ли нам JMS в мире современных Java-технологий?
  2. Яков Файн, Farata Systems — RESTful-сервисы и протокол OAuth в IoT
  3. Александр Белоцерковский — Windows Azure + Java = Open Integration
  4. Вадим Цесько — Фреймворк Akka и его использование в Яндексе
  5. Vladimir Tsukur — Вместе веcело шагать с HATEOAS! — разработка Web Api,
  6. Максим Юнусов — «Масштабируемое приложение за 15 минут (используем AKKA под Java)
  7. Вячеслав Лапин — Слабая связанность Java-сервера и web-интерфейса посредством REST API

6.5 Безопасность, Java Security Model и т.д.

  1. Михаил Дударев — Побег из песочницы. Уязвимости нулевого дня в Java
  2. Михаил Дударев — USS «Enterprise» — сквозь черные дыры безопасности Java Web-контейнеров
  3. Михаил Дударев — Опасные типы, или Java Security Model на практике

6.6 Виртуальная машина Java и особенности реализации JVM

  1. Андрей Паньгин — Java Runtime: повседневные обязанности виртуальной машины Java
  2. Олег Плисс — Виртуальные машины. Часть 1
  3. Олег Плисс — Виртуальные машины. Часть 2
  4. Олег Плисс — Виртуальные машины. Часть 3
  5. Олег Плисс — Виртуальные машины. Часть 4
  6. Артём Ананьев — Проект OpenJDK
  7. Андрей Бреслав — Компромиссы в разработке языков программирования
  8. Андрей Бреслав — Компромиссы, или Как проектируются языки программирования
  9. Никита Липский и Павел Павлов — Excelsior JET: внутренняя архитектура — описание быстрой JVM реализации Excelsior JET с компиляцией в машинный код,
  10. Никита Липский и Павел Павлов — Excelsior JET: обзор возможностей — описание быстрой JVM реализации Excelsior JET с компиляцией в машинный код,
  11. Nikita Lipsky — AOT компиляция — статическая компиляция JVM в Excelsior JET, её преимущества и возможности по сравнению с обычной компиляцией,
  12. Nikita Lipsky — Java худеет. Уменьшение размера дистрибутива Java приложения без зависимостей — использование статического компилятора Excelsior JET для уменьшения размеров дистрибутивов Java приложений,
  13. Никита Липский и Миша Быков — Занимательные истории из жизни техподдержки JVM — о техподержке JVM Excelsior JET, о Excelsior JET и об особенностях реализации JVM, различия между JVM и проблемы при переходе между разными JVM,
  14. Алексей Шипилёв — OpenJDK Frameworks: jmh & jcstress
  15. Шура Ильин — OpenJDK Test Base
  16. Шура Ильин — JTReg: OpenJDK test harness
  17. Шура Ильин — OpenJDK TestFest Intro
  18. Alexey Fyodorov — JDK: CPU, PSU, LU, FR – WTF??? — рассказывается о четырех типах обновлений JDK в компании Oracle (Critical Patch Update (CPU), Patch Set Update (PSU), Limited Update (LU) and Feature Release (FR)). Чем отличаются типы обновления, какие изменения возможны в каждом типе обновлений.

6.7 Аспектно-ориентированное программирование

  1. Николай Гарбузов, Донривер — Аспектно-ориентированное решение классических проблем
  2. Игорь Сухоруков. AspectJ Scripting

6.8 Рефлексия и Invokedynamic

  1. Владимир Иванов — Invokedynamic: роскошь или необходимость?
  2. Владимир Иванов — Глубокое погружение в invokedynamic

6.9 Работа с нативными библиотеками и кодом (JNI/JNA)

  1. Петр Кудрявцев — Эффективная разработка Java приложений с использованием JNI/JNA технологий

6.10 Особенности языка Java

  1. Владимир Ситников, NetCracker — Выражаемся регулярно — описание регулярных выражений, их использования и проблем,
  2. Алексей Рагозин — Структуры данных в Java, изобретаем заново — описание реализации коллекций в Java и возможные методы их улучшения,
  3. Светлана Исакова — Простыми словами про вывод типов

7. Качество кода и вопросы архитектуры

7.1 Рефакторинги, качество кода, методики программирования

  1. Яков Сироткин, Никита Липский, Олег Анастасьев, Филипп Дельгядо — Рефакторинги и технический долг
  2. Антон Кекс — Как нам спасти Java? — Часть 1 — о проблемах Java, о том как можно сделать Java лучше, какие привычные подходы программирования в Java на самом деле больше вредны, чем полезны,
  3. Антон Кекс — Как нам спасти Java? — Часть 2 — о проблемах Java, о том как можно сделать Java лучше, какие привычные подходы программирования в Java на самом деле больше вредны, чем полезны,
  4. Николай Чашников — Писать код быстрее, ошибаться реже
  5. Николай Чашников — Разработка API в Java-проекте
  6. Николай Алименков — Парадигмы ООП
  7. Михаил Ершов — Разработка совместимого API
  8. Nikolay Chashnikov — Write code faster with fewer errors: is it possible? — как избегать ошибок при написании кода,

7.2 Архитектура, бизнес правила, бизнес модель и примеры приложений

  1. Антон Кекс — Архитектура интернет-банка без Enterprise
  2. Константин Кривопустов — Выбор технологий для корпоративного приложения
  3. Александр Тоболь — Платформа для видео сроком в квартал
  4. Антон Кекс — Как я создал desktop-приложение на Java, скачанное 9 миллионов раз
  5. Виктор Полищук — JBoss Drools Expert против грязи — описание системы управления бизнес правилами JBoss Drools
  6. Дмитрий Завалишин и Александр Шлянников — Java-технологии в Digital Zone — примеры реализаций приложений в Digital Zone (использование груви скриптов для гибкой настройки бизнес модели системы приложения такси)
  7. Яков Сироткин — Почему геномный ассемблер нельзя написать за выходные? — история разработки геномного ассемблера
  8. Яков Сироткин — История релизов — продолжение истории разработки геномного ассемблера
  9. Евгений Борисов — eXtreme Application Platform (XAP)
  10. Барух Садогурский — Bintray: Масштабируемый сервис в облаке с нуля
  11. Anatoliy Sokolenko — Key Problems of Microservice Architecture — что такое сервисы и микросервисы, как их реализовать на практике, чем это лучше стандартной архитектуры и какие проблемы возникают при такой архитектуре,
  12. Izzet Mustafaiev — Fault tolerance – look, it’s possible!
  13. Oleg Tsal-Tsalko — Distributed systems and scalability rules
  14. Baruch Sadogursky — Everything you wanted to know about async HTTP apps in Java — о написании асинхронного менеджера загрузок с параллельной загрузок файлов, одного файла, прерывания и паузы для программы репозиторий
  15. Maxim Ivanov — Hey, I’ve seen something like it before! — подходы к принятию архитектурных решений. Хайп (использования модных базвордов — микросервисов, nosql и т.п. ради базвордов) и его последствия для архитекторов.

7.3 Тестирование приложений

  1. Глеб Смирнов — Мутационное тестирование, или О чём молчит Code Coverage — описание почему 100% Code Coverage у Unit тестов не гарантирует правильную работу кода, что такое мутационное тестирование и как оно помогает улучшить Unit тесты, описание мутационной системы pitest (http://pitest.org/)
  2. Алексей Рагозин — Как и зачем эмулировать распределённый кластер в JVM — описание библиотеки, которая позволяет для задач Unit тестирования эмулировать распределённый кластер на одной ноде
  3. Алексей Рагозин — Сеть — это большая JVM — часть 2 лекции » Как и зачем эмулировать распределённый кластер в JVM «
  4. Mikalai Alimenkou — «TDD for database related code, how is it possible?» — описание TDD методологии
  5. Katya Kameneva — How I lost my QA job — о внедрении TDD технологий
  6. Dmytro Chyzhykov — Testing Web Apps with Spring Framework — тестирование Spring MVC приложений
  7. Андрей Солнцев — Пацан накодил — пацан протестил!

8. Прочее

  1. Алексей Вишенцев и Илья Агошков — Advanced Deployment
  2. Дмитрий Черепанов — Self-contained Application
  3. Сергей Куксенко — Quantum Performance Effects
  4. Кузьма Деретюк — UrsaJ HTTP File Storage
  5. Дмитрий Чуйко — Java Mission Control
  6. Igor Khotin — The Craft of Metaprogramming on JVM — о метапрограммировании в Java

Update: Внимание, актуальная версия со всеми ссылками на видео находиться теперь в моем github’e проекте useful-java-links, по этой ссылке.

Общее оглавление ‘Шпаргалок’

Лучшие шпаргалки по программированию

Чит-лист – это краткое изложение процедур, тегов и синтаксиса. Шпаргалки по программированию не научат кодить, но помогут вспомнить азы.

Это колоссальная экономия времени, которое обычно тратится на Google, поиски печатной литературы или документации, и шпаргалки по программированию особенно актуальны, если проект нужно сдать в кратчайшие сроки. В статье приведен список рассортированных по разделам ссылок на сайты и картинки, которые станут качественным инструментом в решении распространенных вопросов. Вы можете распечатать их и повесить на стену или сохранить в электронном виде, чтобы была возможность «подсмотреть» даже в дороге.

Языки С

C#
Как писать на С++
Чит-лист по C++ в PDF
Сравнение C++ и Java

Java

Шпаргалка по синтаксису Java
Быстрая справка по Java
Java: подборка основной информации

PERL

Чит-лист по PERL
Подборка справок по PERL в PDF
PERL-гайд

Python

101 чит-лист по Python
Шпаргалки по программированию на Python
Python: подборка основной информации

PHP

Лучший помощник для работы с PHP
PHP: подборка основной информации

Ruby

Ruby в PDF
Нитеобразный чит-лист по Ruby
Ruby: подборка основной информации

Другие

Ada в PDF
Шпаргалки по программированию на Delphi в PDF
JSP в PDF
LaTEX в PDF

Actionscript 3.0
Полезный чит-лист по CSS
CSS: подборка основной информации
Чит-лист для CSS
По работе с Drupal 4.7
.htaccess
HTML: подборка основной информации
Удобные шпаргалки по HTML
HTML-DOM: подборка основной информации
HTML & XHTML
JavaScript
JavaScript: подборка основной информации 
Чит-лист по JQuery в PDF
Подборка справок по JQuery в PDF
JQuery: подборка основной информации
Помощник в работе с JS-библиотекой script.aculo.us в PDF
XHTML
Синтаксис XML в PDF
XML Schema PDF
XSLT & XPath в PDF

MySQL
MySQL: подборка основной информации
Oracle SQL команды
Oracle
PostgreSQL
SQL Server

Команды Linux
Список портов TCP
Unix
Полезное дополнение по Unix

DOS
Bash
Windows CMD
TextMate в PDF
Vi
CVS
ASCII
Цветовая диаграмма RGB
Чит-лист по информатике в PDF
UML
Краткая справочная карта UML в PDF

7 книг по UNIX/Linux
Подборка материалов и видеокурсов по Java
13 материалов для «продолжающих» С++ разработчиков
Python: советы, трюки, идиомы
10 способов проверить знания HTML/CSS
10 вещей, которые стоит знать каждому JavaScript-разработчику

Шпаргалка Java программиста 3. Коллекции в Java (стандартные, guava, apache, trove, gs-collections и другие)

Сегодня я хотел бы поговорить о коллекциях в Java. Это тема встречается практически на любом техническом интервью Java разработчика, однако далеко не все разработчики в совершенстве освоили все коллекции даже стандартной библиотеки, не говоря уже о всех библиотеках с альтернативными реализациями коллекций, таких как guava, apache, trove и ряд других. Давайте посмотрим какие вообще коллекции можно найти в мире Java и какие методы работы с ними существуют.

Эта статья полезна как для начинающих (чтобы получить общее понимание что такое коллекции и как с ними работать), так и для более опытных программистов, которые возможно найдут в ней что-то полезное или просто структурируют свои знания. Собственно, главное чтобы у вас были хотя бы базовые знания о коллекциях в любом языке программирования, так как в статье не будет объяснений что такое коллекция в принципе.

Общее оглавление ‘Шпаргалок’

I. Стандартная библиотека коллекций Java

Естественно, практически все и так знают основные коллекции в JDK, но все-таки вспомним о них, если вы уверены, что и так все знаете о стандартных коллекциях можете смело пропускать все что в спойлерах до следующего раздела.

Замечание о коллекциях для начинающих

Иногда достаточно сложно для начинающих (особенно если они перешли из других языков программирования) понять, что в коллекции Java хранятся только ссылки/указатели и ничего более. Им кажется, что при вызове add или put объекты действительно хранятся где-то внутри коллекции, это верно только для массивов, когда они работают с примитивными типами, но никак не для коллекций, которые хранят только ссылки. Поэтому очень часто на вопросы собеседований вроде «А можно ли назвать точный размер коллекции ArrayList» начинающие начинают отвечать что-то вроде «Зависит от типа объектов что в них хранятся». Это совершенно не верно, так коллекции никогда не хранят сами объекты, а только ссылки на них. Например, можно в List добавить миллион раз один и то же объект (точнее создать миллион ссылок на один объект).

1) Интерфейсы коллекций JDK
Интерфейсы коллекций JDK Интерфейсы коллекций













НазваниеОписание
IterableИнтерфейс означающий что у коллекции есть iterator и её можно обойти с помощью for(Type value:collection). Есть почти у всех коллекций (кроме Map)
CollectionОсновной интерфейс для большинства коллекций (кроме Map)
ListСписок это упорядоченная в порядке добавления коллекция, так же известная как последовательность

(sequence). Дублирующие элементы в большинстве реализаций — разрешены. Позволяет доступ по

индексу элемента. Расширяет Collection интерфейс.
SetИнтерфейс реализующий работу с множествами (похожими на математические множества), дублирующие

элементы запрещены. Может быть, а может и не быть упорядоченным. Расширяет Collection интерфейс.
QueueОчередь — это коллекция, предназначенная для хранения объектов до обработки, в отличии от обычных операций над коллекциями, очередь предоставляет дополнительные методы добавление, получения и просмотра. Быстрый доступ по индексу элемента, как правило, не содержит. Расширяет Collection интерфейс
DequeДвухсторонняя очередь, поддерживает добавление и удаление элементов с обоих концов. Расширяет

Queue интерфейс.
MapРаботает со соответствием ключ — значение. Каждый ключ соответствует только одному значению. В

отличие от других коллекций не расширяет никакие интерфейсы (в том числе Collection и Iterable)
SortedSetАвтоматически отсортированное множество, либо в натуральном порядке (для подробностей смотрите

Comparable интерфейс), либо используя Comparator. Расширяет Set интерфейс
SortedMapЭто map’а ключи которой автоматически отсортированы, либо в натуральном порядке, либо с помощью

comparator’а. Расширяет Map интерфейс.
NavigableSetЭто SortedSet, к которому дополнительно добавили методы для поиска ближайшего значения к заданному значению поиска. NavigableSet может быть доступен для доступа и обхода или в порядке

убывания значений или в порядке возрастания.
NavigableMapЭто SortedMap, к которому дополнительно добавили методы для поиска ближайшего значения к заданному значению поиска. Доступен для доступа и обхода или в порядке убывания значений или в

порядке возрастания.

Интерфейсы из пакета java.util.concurrent







НазваниеОписание
BlockingQueueМногопоточная реализация Queue, содержащая возможность задавать размер очереди, блокировки по условиях, различные методы, по-разному обрабатывающие переполнение при добавлении или отсутствие данных при получении (бросают exception, блокируют поток постоянно или на время, возвращают false и т.п.)
TransferQueueЭта многопоточная очередь может блокировать вставляющий поток, до тех пор, пока принимающий поток не вытащит элемент из очереди, таким образом с её помощью можно реализовывать синхронные и асинхронные передачи сообщений между потоками
BlockingDequeАналогично BlockingQueue, но для двухсторонней очереди
ConcurrentMap Интерфейс, расширяет интерфейс Map. Добавляет ряд новых атомарных методов: putIfAbsent, remove, replace, которые позволяют облегчить и сделать более безопасным многопоточное программирование.
ConcurrentNavigableMapРасширяет интерфейс NavigableMap для многопоточного варианта

Если вам интересны более подробная информация о интерфейсах и коллекциях из java.util.concurrent советую
прочитать вот эту статью.

2) Таблица с очень кратким описанием всех коллекций
Таблица с очень кратким описанием всех коллекций






ТипОднопоточныеМногопоточные
Lists

  • ArrayList — основной список, основан на массиве
  • LinkedList — полезен лишь в некоторых редких случаях
  • Vector — устарел

  • CopyOnWriteArrayList — редкие обновления, частые чтения

Queues /

Deques
  • ArrayDeque — основная реализация, основан на массиве
  • Stack — устарел
  • PriorityQueue — отсортированная очередь

  • ArrayBlockingQueue — блокирующая очередь
  • ConcurrentLinkedDeque / ConcurrentLinkedQueue — очередь на связанных нодах
  • DelayQueue — очередь с задержкой для каждого элемента
  • LinkedBlockingDeque / LinkedBlockingQueue — блокирующая очередь на связанных нодах
  • LinkedTransferQueue — может служить для передачи элементов
  • PriorityBlockingQueue — многопоточная PriorityQueue
  • SynchronousQueue — простая многопоточная очередь

Maps
  • HashMap — основная реализация
  • EnumMap — enum в качестве ключей
  • Hashtable — устарел
  • IdentityHashMap — ключи сравниваются с помощью ==
  • LinkedHashMap — сохраняет порядок вставки
  • TreeMap — сортированные ключи
  • WeakHashMap — слабые ссылки, полезно для кешей

  • ConcurrentHashMap — основная многопоточная реализация
  • ConcurrentSkipListMap — отсортированная многопоточная реализация

Sets
  • HashSet — основная реализация множества
  • EnumSet — множество из enums
  • BitSet* — множество битов
  • LinkedHashSet — сохраняет порядок вставки
  • TreeSet — отсортированные set
  • ConcurrentSkipListSet — отсортированный многопоточный set
  • CopyOnWriteArraySet — редкие обновления, частые чтения

* — на самом деле, BitSet хоть и называется Set’ом, интерфейс Set не наследует.

3) Устаревшие коллекции в JDK
Устаревшие коллекции Java Универсальные коллекции общего назначения, которые признаны устаревшими (legacy)





ИмяОписание
HashtableИзначально задумывался как синхронизированный аналог HashMap, когда ещё не было возможности

получить версию коллекции используя Collecions.synchronizedMap. На данный момент как правило

используют ConcurrentHashMap. HashTable более медленный и менее потокобезопасный чем синхронный

HashMap, так как обеспечивает синхронность на уровне отдельных операций, а не целиком на уровне

коллекции.
VectorРаньше использовался как синхронный вариант ArrayList, однако устарел по тем же причинам что и

HashTable.
StackРаньше использовался как для построения очереди, однако поскольку построен на основе Vector,

тоже считается морально устаревшим.

Специализированные коллекции, построенные на устаревших (legacy) коллекциях




ИмяОснован наОписание
PropertiesHashtableКак структура данных, построенная на Hashtable, Properties довольно устаревшая конструкция,

намного лучше использовать Map, содержащий строки. Подробнее почему Properties

не рекомендуется использовать можно найти в этом обсуждении.
UIDefaultsHashtableКоллекция, хранящая настройки по умолчанию для Swing компонент

4) Коллекции, реализующие интерфейс List (список)
Коллекции, реализующие интерфейс List (список) Универсальные коллекции общего назначения, реализующие List:




НазваниеОснован

на
ОписаниеРазмер*
ArrayListListРеализация List интерфейса на основе динамически изменяемого массива. В большинстве случаев, лучшая возможная реализация List интерфейса по потреблению памяти и производительности. В крайне редких случаях, когда требуются частые вставки в начало или середину списка с очень малым

количеством перемещений по списку, LinkedList будет выигрывать в производительности (но советую в этих случаях использовать TreeList от apache). Если интересны подробности ArrayList советую посмотреть эту статью.
4*N
LinkedListListРеализация List интерфейса на основе двухстороннего связанного списка, то есть когда каждый элемент, указывает на предыдущий и следующий элемент. Как правило, требует больше памяти и хуже по производительности, чем ArrayList, имеет смысл использовать лишь в редких случаях когда часто требуется вставка/удаление в середину списка с минимальными перемещениями по списку (но советую в этих случаях использовать TreeList от apache).Так же реализует Deque интерфейс. При работе через Queue интерфейс, LinkedList действует как FIFO очередь. Если интересны подробности LinkedList советую посмотреть эту статью.24*N

Коллекции из пакета java.util.concurrent



НазваниеОснован

на
Описание
CopyOnWriteArrayListListРеализация List интерфейса, аналогичная ArrayList, но при каждом изменении списка, создается

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

однако для данного вида коллекции не требуется синхронизации, даже при изменении коллекции во

время итерирования.

Узкоспециализированные коллекции на основе List.





НазваниеОснован наОписание
RoleListArrayListКоллекция для хранения списка ролей (Roles). Узкоспециализированная коллекция основанная на

ArrayList с несколькими дополнительными методами
RoleUnresolvedListArrayListКоллекция для хранения списка unresolved ролей (Unresolved Roles). Узкоспециализированная

коллекция основанная на ArrayList с несколькими дополнительными методами
AttributeListArrayListКоллекция для хранения атрибутов MBean. Узкоспециализированная коллекция основанная на ArrayList

с несколькими дополнительными методами

* — размер дан в байтах для 32 битных систем и Compressed Oops, где N это capacity списка

5) Коллекции, реализующие интерфейс Set (множество)
Коллекции, реализующие интерфейс Set (множество)






НазваниеОснован

на
ОписаниеРазмер*
HashSetSetРеализация Set интерфейса с использованием хеш-таблиц. В большинстве случаев, лучшая возможная реализация Set интерфейса.32*S + 4*C
LinkedHashSetHashSetРеализация Set интерфейса на основе хеш-таблиц и связанного списка. Упорядоченное по добавлению множество, которое работает почти так же быстро как HashSet. В целом, практически тоже самое что HashSet, только порядок итерирования по множеству определен порядком добавления элемента во

множество в первый раз.
40 * S + 4*C
TreeSetNavigableSetРеализация NavigableSet интерфейса, используя красно-черное дерево. Отсортировано с помощью Comparator или натурального порядка, то есть обход/итерирование по множеству будет происходить в зависимости от правила сортировки. Основано на TreeMap, так же как HashSet основан на HashMap40 * S
EnumSetSetВысокопроизводительная реализация Set интерфейса, основанная на битовом векторе. Все элементы EnumSet объекта должны принадлежать к одному единственному enum типуS/8

* — размер дан в байтах для 32 битных систем и Compressed Oops, где С это capacity списка, S это size списка

Узкоспециализированные коллекции на основе Set



НазваниеОснован

на
Описание
JobStateReasonsHashSetКоллекция для хранения информации о заданиях печати (print job’s attribute set).

Узкоспециализированная коллекция основанная на HashSet с несколькими дополнительными методами

Коллекции из пакета java.util.concurrent




НазваниеОснован

на
Описание
CopyOnWriteArraySetSetАналогично CopyOnWriteArrayList при каждом изменении создает копию всего множества, поэтому

рекомендуется при очень редких изменениях коллекции и требованиях к thread-safe
ConcurrentSkipListSetSetЯвляется многопоточным аналогом TreeSet

6) Коллекции, реализующие интерфейс Map (ассоциативный массив)
Коллекции, реализующие Map интерфейс Универсальные коллекции общего назначения, реализующие Map:








НазваниеОснован

на
ОписаниеРазмер*
HashMapMapРеализация Map интерфейса с помощью хеш-таблиц (работает как не синхронная Hashtable, с

поддержкой ключей и значений равных null). В большинстве случаев лучшая по производительности и

памяти реализация Map интерфейса. Если интересны подробности устройства HashMap советую посмотреть эту статью.
32 * S + 4*C
LinkedHashMapHashMapРеализация Map интерфейса, на основе хеш-таблицы и связного списка, то есть ключи в Map’е

хранятся и обходятся во порядке добавления. Данная коллекция работает почти так же быстро как

HashMap. Так же она может быть полезна для создания кешей (смотрите

removeEldestEntry(Map.Entry) ). Если интересны подробности устройства LinkedHashMap советую посмотреть эту статью.
40 * S + 4*C
TreeMapNavigableMapРеализация NavigableMap с помощью красно-черного дерева, то есть при обходе коллекции, ключи

будут отсортированы по порядку, так же NavigableMap позволяет искать ближайшее значение к ключу.
40 * S
WeakHashMapMapАналогична HashMap, однако все ключи являются слабыми

ссылками (weak references), то есть garbage collected может удалить объекты ключи и объекты

значения, если других ссылок на эти объекты не существует. WeakHashMap один из самых простых

способов для использования всех преимуществ слабых ссылок.
32 * S + 4*C
EnumMapMapВысокопроизводительная реализация Map интерфейса, основанная на простом массиве. Все ключи в

этой коллекции могут принадлежать только одному enum типу.
4*C
IdentityHashMapMapIdentity-based Map, так же как HashMap, основан на хеш-таблице, однако в отличии от HashMap он

никогда не сравнивает объекты на equals, только на то является ли они реально одиним и тем же

объектом в памяти. Это во-первых, сильно ускоряет работу коллекции, во-вторых, полезно для

защиты от «spoof attacks», когда сознательно генерируется объекты equals другому объекту.

В-третьих, у данной коллекции много применений при обходе графов (таких как глубокое копирование

или сериализация), когда нужно избежать обработки одного объекта несколько раз.
8*C

* — размер дан в байтах для 32 битных систем и Compressed Oops, где С это capacity списка, S это size списка

Коллекции из пакета java.util.concurrent




НазваниеОснован

на
Описание
ConcurrentHashMap ConcurrentMapМногопоточный аналог HashMap. Все данные делятся на отдельные сегменты и блокируются только

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

режиме. Итераторы никогда не кидают ConcurrentModificationException для данного вида коллекции
ConcurrentSkipListMapConcurrentNavigableMapЯвляется многопоточным аналогом TreeMap

7) Коллекции, основанные на интерфейсах Queue/Deque (очереди)
Коллекции, основанные на Queue/Deque





НазваниеОснован

на
ОписаниеРазмер*
ArrayDequeDequeЭффективная реализация Deque интерфейса, на основе динамического массива, аналогичная

ArrayList
6*N
LinkedListDequeРеализация List и Deque интерфейса на основе двухстороннего связанного списка, то есть когда каждый элемент, указывает на предыдущий и следующий элемент.При работе через Queue интерфейс, LinkedList действует как FIFO очередь.40*N
PriorityQueueQueueНеограниченная priority queue, основанная на куче (нeap). Элементы отсортированы в натуральном

порядке или используя Comparator. Не может содержать null элементы.

* — размер дан в байтах для 32 битных систем и Compressed Oops, где С это capacity списка, S это size списка

Многопоточные Queue и Deque, который определены в java.util.concurrent, требуют отдельной статьи, поэтому здесь приводить их не буду, если вам интересна информация о них советую прочитать вот эту статью

8) Прочие коллекции
Прочие коллекции



НазваниеОписаниеРазмер*
BitSetНесмотря на название, BitSet не реализует интерфейс Set. BitSet служит для компактной записи массива битов.N / 8

9) Методы работы с коллекциями
Методы работы с коллекциями Алгоритмы- В классе Collections содержится много полезных статистических методов.
Для работы с любой коллекцией:







МетодОписание
frequency(Collection, Object)Возвращает количество вхождений данного элемента в указанной коллекции
disjoint(Collection, Collection)Возвращает true, если в двух коллекциях нет общих элементов
addAll(Collection<? super T>, T…)Добавляет все элементы из указанного массива (или перечисленные в параметрах) в указанную коллекцию
min(Collection)Возвращение минимального элемента из коллекции
max(Collection)Возвращение максимального элемента из коллекции

Для работы со списками:













МетодОписание
sort(List)Сортировка с использованием алгоритма сортировки соединением (merge sort algorithm), производительность которой в большинстве случаев близка к производительности быстрой сортировки (high quality quicksort), гарантируется O(n*log n) производительность (в отличии от quicksort), и стабильность (в отличии от quicksort). Стабильная сортировка это такая которая не меняет порядок одинаковых элементов при сортировке
binarySearch(List, Object)Поиск элемента в списке (list), используя binary search алгоритм.
reverse(List)Изменение порядка всех элементов списка (list)
shuffle(List)Перемешивание всех элементов в списке в случайном порядке
fill(List, Object) Переписывание каждого элемента в списке каким-либо значением
copy(List dest, List src)Копирование одного списка в другой
rotate(List list, int distance)Передвигает все элементы в списке на указанное расстояние
replaceAll(List list, Object oldVal, Object newVal)Заменяет все вхождения одного значения на другое
indexOfSubList(List source, List target)Возвращает индекс первого вхождения списка target в список source
lastIndexOfSubList(List source, List target)Возвращает индекс последнего вхождения списка target в список source
swap(List, int, int)Меняет местами элементы, находящиеся на указанных позициях

В Java 8 так же появился такой способ работы с коллекциями как stream Api, но мы рассмотрим примеры его использование далее в разделе 5.

10) Как устроенны разные типы коллекций JDK внутри
Как устроенны разные типы коллекций JDK внутри











КоллекцияОписание внутреннего устройства
ArrayListДанная коллекция лишь настройка над массивом + переменная хранящая size списка. Внутри просто

массив, который пересоздается каждый раз когда нет места для добавления нового элемента. В

случае, добавления или удаления элемента внутри коллекции весь хвост сдвигается в памяти на

новое место. К счастью, копирование массива при увеличении емкости или при добавлении/удалении

элементов производится быстрыми нативными/системными методами. Если интересны подробности

советую посмотреть эту статью.
LinkedListВнутри коллекции используется внутренний класс Node, содержащий ссылку на предыдущий элемент,

следующий элемент и само значение элемента. В самом инстансе коллекции хранится размер и ссылки

на первый и последний элемент коллекции. Учитывая что создание объекта дорогое удовольствие для

производительности и затратно по памяти, LinkedList чаще всего работает медленно и занимает

намного больше памяти чем аналоги. Обычно ArrayList, ArrayDequery лучшее решение по производительности и памяти, но в некоторых редких случаях (частые вставки в середину списка с редкими перемещениями по списку), он может быть быть полезен (но в этом случае полезнее использовать TreeList от apache). Если интересны подробности советую посмотреть эту статью.
HashMapДанная коллекция построена на хеш-таблице, то есть внутри коллекции находится массив внутреннего класса (buket) Node равный capacity коллекции. При добавлении нового элемента вычисляться его хеш-функция, делиться на capacity HashMap по модулю и таким образом вычисляется место элемента в массиве. Если на данном месте ещё не храниться элементов создается новый объект Node с ссылкой на добавляемый элемент и записывается в нужное место массива. Если на данном месте уже есть элемент/ы (происходит хеш-коллизия), то так Node является по сути односвязным списком, то есть содержит ссылку на следующий элемент, то можно обойти все элементы в списке и проверить их на equals добавляемому элементу, если этот такого совпадение не найдено, то создается новый объект Node и добавляется в конец списка. В случае, если количество элементов в связном списке (buket) становится более 8 элементов, вместо него создается бинарное дерево. Подробнее о хеш таблицах смотрите вики (в HashMap используется метод цепочек для разрешения коллизий). Если интересны подробности устройства HashMap советую посмотреть эту статью.
HashSetHashSet это просто HashMap, в которую записывается фейковый объект Object вместо значения, при этом имеет значение только ключи. Внутри HashSet всегда хранится коллекция HashMap.
IdentityHashMapIdentityHashMap это аналог HashMap, но при этом не требуется элементы проверять на equals, так

как разными считаются любые два элементы. указывающие на разные объекты. Благодаря этому удалось

избавится от внутреннего класса Node, храня все данные в одном массиве, при этом при коллизиях

ищется подходящая свободная ячейка до тех пор пока не будет найдена (метод

открытой адресации).Подробнее о хеш таблицах смотрите вики

(в IdentityHashMap используется метод открытой адресации для разрешения коллизий)
LinkedHashMap/LinkedHashSetВнутренняя структура практически такая же как при HashMap, за исключением того что вместо

внутреннего класса Node, используется TreeNode, которая знает предыдущее и следующее значение,

это позволяет обходить LinkedHashMap по порядку добавления ключей. По сути, LinkedHashMap =

HashMap + LinkedList. Если интересны подробности устройства LinkedHashMap советую посмотреть эту статью.
TreeMap/TreeSetВнутренняя структура данных коллекций построена на сбалансированным красно-черным деревом,

подробнее о нем можно почитать в вики
WeakHashMapВнутри все организовано практически как в HashMap, за исключением что вместо обычных ссылок

используются WeakReference и есть отдельная очередь ReferenceQueue, необходимая для удаления

WeakEntries
EnumSet/EnumMapВ EnumSet и EnumMap в отличие от HashSet и HashMap используются битовые векторы и массивы для

компактного хранения данных и ускорения производительности. Ограничением этих коллекций является

то что EnumSet и EnumMap могут хранить в качестве ключей только значения одного Enum’а.

Шпаргалки Java HTML CSS PHP SQL SEO

Дата публикации . Опубликовано в Создание

При создании сайтов бывают моменты, когда не можешь вспомнить какую-то мелочь. На эти случаи созданы шпаргалки для вебдизайнеров. Ниже представленны шпоргалки по Java, HTML, CSS, PHP, SQL, SEO, безопасным цветам и т.д. Шпаргалки дают возможность быстро вспомнить кодовый синтаксис и ускорить работу при создании сайта.

1. CSS шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

Это краткий справочник по CSS — список выбора синтаксиса, свойств, частей и другой полезной информации.

 

 

 

2. RGB шпаргалка (безопасные цвета), в PDF и PNG форматах.

Скачать
PDF
PNG

Данный список показывает 216 так называемых «безопасных цветов», применяемых при создании сайтов.

 

 

 

3. HTML шпаргалка (коды символов), в PDF и PNG форматах.

Скачать
PDF
PNG

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

 

4. HTML шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

HTML является языком в интернете. Это семантическая опора, на которой держатся сайты.

 

 

 

5. PHP шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

Краткий справочник по PHP с функциями справки, руководства синтаксиса и другими популярными функциями.

 

 

 

6. SQL шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

Microsoft в SQL Server является мощным сервером базы данных, которая хорошо интегрируется с другими технологиями Microsoft, такими как ASP и. NET, и включает в себя одни из лучших управления базами данных инструментов.

 

 

 

7. JavaScript шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

Краткий справочник по JavaScript, список методов и функций, в том числе руководство по регулярным выражениям и объектам XMLHttpRequest.

 

 

 

8. MySQL шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

Краткое руководство по MySQL, в том числе функции (как в MySQL и PHP), типы данных и примеры запросов.

 

 

 

 

9. mod_rewrite шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

Краткий справочник для mod_rewrite, с перечнем флагов, синтаксисов регулярных выражений и правил.

 

 

10. regular_expressions шпаргалка, в PDF и PNG форматах.

Скачать
PDF
PNG

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

 

 

 

11. SEO шпаргалки.

Ниже представлены два изображения, которые структурируют информацию по раскрутке сайтов (SEO).

 

 

Вторая версия CSS шпаргалка, краткий справочник по CSS, список выбора синтаксиса, свойств, частей и других полезных битов информации.

Java шпаргалка — gulenm — LiveJournal

?

LiveJournal

  • Main
  • Ratings
  • Interesting
  • iOS & Android
  • Disable ads

Login

  • Login
  • CREATE BLOG

    Join

  • English

    (en)

    • English (en)
    • Русский (ru)
    • Українська (uk)
    • Français (fr)
    • Português (pt)
    • español (es)
    • Deutsch (de)
    • Italiano (it)
    • Беларуская (be)

Обзор java.util.concurrent.* / Блог компании Luxoft / Хабр

В повседневной работе не так уж часто приходится сталкиваться с пакетом для многопоточности java.util.concurrent. Иногда существуют проектные ограничения по использованию java 1.4.2, где нет данного пакета, но чаще всего хватает обычной синхронизации и не требуется ничего сверхъестественного. К счастью, периодически возникают задачи, заставляющие немного пораскинуть мозгами и либо написать велосипед, либо порыться в javadoc’ах и найти что-то более подходящее. С велосипедом проблем нет — просто берешь и пишешь, благо ничего суперсложного в многопоточности нет. С другой стороны, меньше кода — меньше багов. Тем более, что на многопоточность никто в здравом уме юнит тестов не пишет, т.к. это уже полноценные интеграционные тесты получаются со всеми вытекающими последствиями.

Что выбрать для конкретного случая? В условиях запарки и deadline’ов довольно сложно охватить весь java.util.concurrent. Выбирается что то похожее и вперед! Так, постепенно, в коде появляются ArrayBlockingQueue, ConcurrentHashMap, AtomicInteger, Collections.synchronizedList(new LinkedList()) и другие интересности. Иногда правильно, иногда нет. В какой то момент времени начинаешь осознавать, что более 95% стандартных классов в java вообще не используются при разработке продукта. Коллекции, примитивы, перекладывание байтиков с одного места на другое, hibernate, spring или EJB, еще какая то библиотека и, вуаля, приложение готово.

Чтобы хоть как то упорядочить знания и облегчить вхождение в тему, ниже идет обзор классов для работы с многопоточностью. Пишу прежде всего как шпаргалку для себя. А если еще кому сгодится — вообще замечательно.

Сразу приведу пару интересных ссылок. Первая для тех, кто немного плавает в многопоточности. Вторая для «продвинутых» программеров — возможно тут найдётся что-нибудь полезное.

Если кто хоть когда-нибудь открывал исходники классов java.util.concurrent, не могли не заметить в авторах Doug Lea (Даг Ли), профессора Oswego (Осуиго) университета штата Нью Йорк. В список наиболее известных его разработок попали java collections и util.concurrent, которые в том или ином виде отразились в существующих JDK. Также им была написана dlmalloc имплементация для динамического выделения памяти. Среди литературы отметилась книга по многопоточности Concurrent Programming in Java: Design Principles and Pattern, 2nd Edition. Более подробно можно ознакомиться на его домашней страничке.


Выступление Doug Lea на JVM Language Summit в 2010 году.

Наверное у многих возникало чувство некоторого хаоса при беглом взгляде на java.util.concurrent. В одном пакете намешаны разные классы с совершенно разным функционалом, что несколько затрудняет понимание что к чему относится и как это работает. Поэтому, можно схематично поделить классы и интерфейсы по функциональному признаку, а затем пробежаться по реализации конкретных частей.

Concurrent Collections — набор коллекций, более эффективно работающие в многопоточной среде нежели стандартные универсальные коллекции из java.util пакета. Вместо базового враппера Collections.synchronizedList с блокированием доступа ко всей коллекции используются блокировки по сегментам данных или же оптимизируется работа для параллельного чтения данных по wait-free алгоритмам.

Queues — неблокирующие и блокирующие очереди с поддержкой многопоточности. Неблокирующие очереди заточены на скорость и работу без блокирования потоков. Блокирующие очереди используются, когда нужно «притормозить» потоки «Producer» или «Consumer», если не выполнены какие-либо условия, например, очередь пуста или перепонена, или же нет свободного «Consumer»’a.

Synchronizers — вспомогательные утилиты для синхронизации потоков. Представляют собой мощное оружие в «параллельных» вычислениях.

Executors — содержит в себе отличные фрейморки для создания пулов потоков, планирования работы асинхронных задач с получением результатов.

Locks — представляет собой альтернативные и более гибкие механизмы синхронизации потоков по сравнению с базовыми synchronized, wait, notify, notifyAll.

Atomics — классы с поддержкой атомарных операций над примитивами и ссылками.

CopyOnWrite коллекции

Название говорит само за себя. Все операции по изменению коллекции (add, set, remove) приводят к созданию новой копии внутреннего массива. Тем самым гарантируется, что при проходе итератором по коллекции не кинется ConcurrentModificationException. Следует помнить, что при копировании массива копируются только референсы (ссылки) на объекты (shallow copy), т.ч. доступ к полям элементов не thread-safe. CopyOnWrite коллекции удобно использовать, когда write операции довольно редки, например при реализации механизма подписки listeners и прохода по ним.

CopyOnWriteArrayList<E> — Потокобезопасный аналог ArrayList, реализованный с CopyOnWrite алгоритмом.

Дополнительные методы и конструктор






CopyOnWriteArrayList(E[] toCopyIn)Конструктор, принимающий на вход массив.
int indexOf(E e, int index)Возвращает индекс первого найденного элемента, начиная поиск с заданного индекса.
int lastIndexOf(E e, int index)Возвращает индекс первого найденного элемента при обратном поиске, начиная с заданного индекса.
boolean addIfAbsent(E e)Добавить элемент, если его нет в коллекции. Для сравнения элементов используется метод equals.
int addAllAbsent(Collection<? extends E> c)Добавить элементы, если они отсутствуют в коллекции. Возвращает количество добавленных элементов.

CopyOnWriteArraySet<E> — Имплементация интерфейса Set, использующая за основу CopyOnWriteArrayList. В отличии от CopyOnWriteArrayList, дополнительных методов нет.

Scalable Maps

Улучшенные реализации HashMap, TreeMap с лучшей поддержкой многопоточности и масштабируемости.

ConcurrentMap<K, V> — Интерфейс, расширяющий Map несколькими дополнительными атомарными операциями.

Дополнительные методы





V putIfAbsent(K key, V value)Добавляет новую пару key-value только в том случае, если ключа нет в коллекции. Возвращает предыдущее значение для заданного ключа.
boolean remove(Object key, Object value)Удаляет key-value пару только если заданному ключу соответствует заданное значение в Map. Возвращает true, если элемент был успешно удален.
boolean replace(K key, V oldValue, V newValue)Заменяет старое значение на новое по ключу только если старое значение соответствует заданному значению в Map. Возвращает true, если значение было заменено на новое.
V replace(K key, V value)Заменяет старое значение на новое по ключу только если ключ ассоциирован с любым значением. Возвращает предыдущее значение для заданного ключа.

ConcurrentHashMap<K, V> — В отличие от Hashtable и блоков synhronized на HashMap, данные представлены в виде сегментов, разбитых по hash’ам ключей. В результате, для доступ к данным лочится по сегментам, а не по одному объекту. В дополнение, итераторы представляют данные на определенный срез времени и не кидают ConcurrentModificationException. Более детально ConcurrentHashMap описан в хабратопике тут. Дополнительный конструктор


ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel)3-й параметр конструктора — ожидаемое количество одновременно пишущих потоков. Значение по умолчанию 16. Влияет на размер коллекции в памяти и производительность.

ConcurrentNavigableMap<K,V> — Расширяет интерфейс NavigableMap и вынуждает использовать ConcurrentNavigableMap объекты в качестве возвращаемых значений. Все итераторы декларируются как безопасные к использованию и не кидают ConcurrentModificationException.

ConcurrentSkipListMap<K, V> — Является аналогом TreeMap с поддержкой многопоточности. Данные также сортируются по ключу и гарантируется усредненная производительность log(N) для containsKey, get, put, remove и других похожих операций. Алгоритм работы SkipList описан на Wiki и хабре.

ConcurrentSkipListSet<E> — Имплементация Set интерфейса, выполненная на основе ConcurrentSkipListMap.

Non-Blocking Queues

Потокобезопасные и неблокирующие имплементации Queue на связанных нодах (linked nodes).

ConcurrentLinkedQueue<E> — В имплементации используется wait-free алгоритм от Michael & Scott, адаптированный для работы с garbage collector’ом. Этот алгоритм довольно эффективен и, что самое важное, очень быстр, т.к. построен на CAS. Метод size() может работать долго, т.ч. лучше постоянно его не дергать. Детальное описание алгоритма можно посмотреть тут тут.

ConcurrentLinkedDeque<E> — Deque расшифровывается как Double ended queue и читается как «Deck». Это означает, что данные можно добавлять и вытаскивать с обоих сторон. Соответственно, класс поддерживает оба режима работы: FIFO (First In First Out) и LIFO (Last In First Out). На практике, ConcurrentLinkedDeque стоит использовать только, если обязательно нужно LIFO, т.к. за счет двунаправленности нод данный класс проигрывает по производительности на 40% по сравнению с ConcurrentLinkedQueue.

Blocking Queues

BlockingQueue<E> — При обработке больших потоков данных через очереди становится явно недостаточно использования ConcurrentLinkedQueue. Если потоки, разгребающие очередь перестанут справляться с наплывом данных, то можно довольно быстро схлопотать out of memory или перегрузить IO/Net настолько, что производительность упадет в разы пока не настанет отказ системы по таймаутам или из за отсутствия свободных дескрипторов в системе. Для таких случаев нужна queue с возможностью задать размер очереди или с блокировками по условиям. Тут то и появляется интерфейс BlockingQueue, открывающий дорогу к целому набору полезных классов. Помимо возможности задавать размер queue, добавились новые методы, которые реагируют по-разному на незаполнение или переполнение queue. Так, например, при добавлении элемента в переполненную queue, один метод кинет IllegalStateException, другой вернет false, третий заблокирует поток, пока не появится место, четвертый же заблокирует поток с таймаутом и вернет false, если место так и не появится. Также стоит отметить, что блокирующие очереди не поддерживают null значения, т.к. это значение используется в методе poll как индикатор таймаута.

ArrayBlockingQueue<E> — Класс блокирующей очереди, построенный на классическом кольцевом буфере. Помимо размера очереди, доступна возможность управлять «честностью» блокировок. Если fair=false (по умолчанию), то очередность работы потоков не гарантируется. Более подробно о «честности» можно посмотреть в описании ReentrantLock’a.

DelayQueue<E extends Delayed> — Довольно специфичный класс, который позволяет вытаскивать элементы из очереди только по прошествии некоторой задержки, определенной в каждом элементе через метод getDelay интерфейса Delayed.

LinkedBlockingQueue<E> — Блокирующая очередь на связанных нодах, реализованная на «two lock queue» алгоритме: один лок на добавление, другой на вытаскивание элемента. За счет двух локов, по сравнению с ArrayBlockingQueue, данный класс показывает более высокую производительность, но и расход памяти у него выше. Размер очереди задается через конструктор и по умолчанию равен Integer.MAX_VALUE.

PriorityBlockingQueue<E> — Является многопоточной оберткой над PriorityQueue. При вставлении элемента в очередь, его порядок определяется в соответствии с логикой Comparator’а или имплементации Comparable интерфейса у элементов. Первым из очереди выходит самый наименьший элемент.

SynchronousQueue<E> — Эта очередь работает по принципу один вошел, один вышел. Каждая операция вставки блокирует «Producer» поток до тех пор, пока «Consumer» поток не вытащит элемент из очереди и наоборот, «Consumer» будет ждать пока «Producer» не вставит элемент.

BlockingDeque<E> — Интерфейс, описывающий дополнительные методы для двунаправленной блокирующей очереди. Данные можно вставлять и вытаскивать с двух сторон очереди.

LinkedBlockingDeque<E> — Двунаправленная блокирующая очередь на связанных нодах, реализованная как простой двунаправленный список с одним локом. Размер очереди задается через конструктор и по умолчанию равен Integer.MAX_VALUE.

TransferQueue<E> — Данный интерфейс может быть интересен тем, что при добавлении элемента в очередь существует возможность заблокировать вставляющий «Producer» поток до тех пор, пока другой поток «Consumer» не вытащит элемент из очереди. Блокировка может быть как с таймаутом, так и вовсе может быть заменена проверкой на наличие ожидающих «Consumer»ов. Тем самым появляется возможность реализации механизма передачи сообщений с поддержкой как синхронных, так и асинхронных сообщений.

LinkedTransferQueue<E> — Реализация TransferQueue на основе алгоритма Dual Queues with Slack. Активно использует CAS и парковку потоков, когда они находятся в режиме ожидания.

В данном разделе представлены классы для активного управления потоков.

Semaphore — Семафоры чаще всего используются для ограничения количества потоков при работе с аппаратными ресурсами или файловой системой. Доступ к общему ресурсу управляется с помощью счетчика. Если он больше нуля, то доступ разрешается, а значение счетчика уменьшается. Если счетчик равен нулю, то текущий поток блокируется, пока другой поток не освободит ресурс. Количество разрешений и «честность» освобождения потоков задается через конструктор. Узким местом при использовании семафоров является задание количества разрешений, т.к. зачастую это число приходится подбирать в зависимости от мощности «железа».

CountDownLatch — Позволяет одному или нескольким потокам ожидать до тех пор, пока не завершится определенное количество операций, выполняющих в других потоках. Классический пример с драйвером довольно неплохо описывает логику класса: Потоки, вызывающие драйвер, будут висеть в методе await (с таймаутом или без), пока поток с драйвером не выполнит инициализацию с последующим вызовом метода countDown. Этот метод уменьшает счетчик count down на единицу. Как только счетчик становится равным нулю, все ожидающие потоки в await продолжат свою работу, а все последующие вызовы await будут проходить без ожиданий. Счетчик count down одноразовый и не может быть сброшен в первоначальное состояние.

CyclicBarrier — Может использоваться для синхронизации заданного количества потоков в одной точке. Барьер достигается когда N-потоков вызовут метод await(…) и заблокируются. После чего счетчик сбрасывается в исходное значение, а ожидающие потоки освобождаются. Дополнительно, если нужно, существует возможность запуска специального кода до разблокировки потоков и сброса счетчика. Для этого через конструктор передается объект с реализацией Runnable интерфейса.

Exchanger<V> — Как видно из названия, основное предназначение данного класса — это обмен объектами между двумя потоками. При этом, также поддерживаются null значения, что позволяет использовать данный класс для передачи только одного объекта или же просто как синхронизатор двух потоков. Первый поток, который вызывает метод exchange(…) заблокируется до тех пор, пока тот же метод не вызовет второй поток. Как только это произойдет, потоки обменяются значениями и продолжат свою работу.

Phaser — Улучшенная реализация барьера для синхронизации потоков, которая совмещает в себе функционал CyclicBarrier и CountDownLatch, вбирая в себя самое лучшее из них. Так, количество потоков жестко не задано и может динамически меняться. Класс может повторно переиспользоваться и сообщать о готовности потока без его блокировки. Более подробно можно почитать в хабратопике тут.

Вот мы и подобрались к самой большой части пакета. Здесь будут описаны интерфейсы для запуска асинхронных задач с возможностью получения результатов через Future и Callable интерфейсы, а также сервисы и фабрики для создания thread pools: ThreadPoolExecutor, ScheduledPoolExecutor, ForkJoinPool. Для лучшего понимания, сделаем небольшую декомпозицию интерфейсов и классов.

Future and Callable

Future<V> — Замечательный интерфейс для получения результатов работы асинхронной операции. Ключевым методом здесь является метод get, который блокирует текущий поток (с таймаутом или без) до завершения работы асинхронной операции в другом потоке. Также, дополнительно существуют методы для отмены операции и проверки текущего статуса. В качестве имплементации часто используется класс FutureTask.

RunnableFuture<V> — Если Future — это интерфейс для Client API, то интерфейс RunnableFuture уже используется для запуска асинхронной части. Успешное завершение метода run() завершает асинхронную операцию и позволяет вытаскивать результаты через метод get.

Callable<V> — Расширенный аналог интерфейса Runnable для асинхронных операций. Позволяет возвращать типизированное значение и кидать checked exception. Несмотря на то, что в этом интерфейсе отсутсвует метод run(), многие классы java.util.concurrent поддерживают его наряду с Runnable.

FutureTask<V> — Имплементация интерфейса Future/RunnableFuture. Асинхронная операция принимается на вход одного из конструкторов в виде Runnable или Callable объектов. Сам же класс FutureTask предназначен для запуска в worker потоке, например через new Thread(task).start(), или через ThreadPoolExecutor. Результаты работы асинхронной операции вытаскиваются через метод get(…).

Delayed — Используется для асинхронных задач, которые должны начаться в будущем, а также в DelayQueue. Позволяет задавать время до начала асинхронной операции.

ScheduledFuture<V> — Маркерный интерфейс, объединяющий Future и Delayed интерфейсы.

RunnableScheduledFuture<V> — Интерфейс, объединяющий RunnableFuture и ScheduledFuture. Дополнительно можно указывать является ли задача одноразовой или же должна запускаться с заданной периодичностью.

Executor Services

Executor — Представляет собой базовый интерфейс для классов, реализующих запуск Runnable задач. Тем самым обеспечивается развязка между добавлением задачи и способом её запуска.

ExecutorService — Интерфейс, который описывает сервис для запуска Runnable или Callable задач. Методы submit на вход принимают задачу в виде Callable или Runnable, а в качестве возвращаемого значения идет Future, через который можно получить результат. Методы invokeAll работают со списками задач с блокировкой потока до завершения всех задач в переданном списке или до истечения заданного таймаута. Методы invokeAny блокируют вызывающий поток до завершения любой из переданных задач. В дополнении ко всему, интерфейс содержит методы для graceful shutdown. После вызова метода shutdown, данный сервис больше не будет принимать задачи, кидая RejectedExecutionException при попытке закинуть задачу в сервис.

ScheduledExecutorService — В дополнении к методам ExecutorService, данный интерфейс добавляет возможность запускать отложенные задачи.

AbstractExecutorService — Абстрактный класс для построения ExecutorService’a. Имплементация содержит базовую имплементацию методов submit, invokeAll, invokeAny. От этого класса наследуются ThreadPoolExecutor, ScheduledThreadPoolExecutor и ForkJoinPool.

ThreadPoolExecutor & Factory

Executors — Класс-фабрика для создания ThreadPoolExecutor, ScheduledThreadPoolExecutor. Если нужно создать один из этих пулов, эта фабрика именно то, что нужно. Также, тут содержатся разные адаптеры Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable и другие.

ThreadPoolExecutor — Очень мощный и важный класс. Используется для запуска асинхронных задач в пуле потоков. Тем самым практически полностью отсутствует оверхэд на поднятие и остановку потоков. А за счет фиксируемого максимума потоков в пуле обеспечивается прогнозируемая производительность приложения. Как было ранее сказано, создавать данный пул предпочтительно через один из методов фабрики Executors. Если же стандартных конфигураций будет недостаточно, то через конструкторы или сеттеры можно задать все основые параметры пула. Более подробно можно ознакомиться в этом топике.

ScheduledThreadPoolExecutor — В дополнении к методам ThreadPoolExecutor, позволяет запускать задачи после определенной задержки, а также с некоторой периодичностью, что позволяет реализовать на базе этого класса Timer Service.

ThreadFactory — По умолчанию, ThreadPoolExecutor использует стандартную фабрику потоков, получаемую через Executors.defaultThreadFactory(). Если нужно что-то больше, например задание приоритета или имени потока, то можно создать класс с реализацией этого интерфейса и передать его в ThreadPoolExecutor.

RejectedExecutionHandler — Позволяет определить обработчик для задач, которые по каким то причинам не могут быть выполнены через ThreadPoolExecutor. Такой случай может произойти, когда нет свободных потоков или сервис выключается или выключен (shutdown). Несколько стандартных имплементаций находятся в классе ThreadPoolExecutor: CallerRunsPolicy — запускает задачу в вызывающем потоке; AbortPolicy — кидает эксцепшен; DiscardPolicy — игнорирует задачу; DiscardOldestPolicy — удаляет самую старую незапущенную задачу из очереди, затем пытается добавить новую задачу еще раз.

Fork Join

В java 1.7 появился новый Fork Join фреймворк для решения рекурсивных задач, работающих по алгоритмам разделяй и влавствуй или Map Reduce. Чтобы было более наглядней, можно привести визуальный пример алгоритма сортировки quicksort:


Так, за счет разбиения на части, можно добиться их параллельной обработки в разных потоках. Для решения этой задачи можно использовать и обычный ThreadPoolExecutor, но за счет частого переключения контекста и отслеживания контроля исполнения все это не очень эффективно работает. Тут то нам приходит на помощь Fork Join framework в основу которого используется work-stealing алгоритм. Наиболее хорошо раскрывает себя в системах с большим количеством процессоров. Подробнее можно ознакомиться в блоге тут или публикации Doug Lea. Про производительность и масштабируемость можно почитать тут.

ForkJoinPool — Представляет собой точку входа для запуска корневых (main) ForkJoinTask задач. Подзадачи запускаются через методы задачи, от которой нужно отстрелиться (fork). По умолчанию создается пул потоков с количеством потоков равным количеству доступных для JVM процессоров (cores).

ForkJoinTask — Базовый класс для всех Fork Join задач. Из ключевых методов можно отметить: fork() — добавляет задачу в очередь текущего потока ForkJoinWorkerThread для асинхронного выполнения; invoke() — запускает задачу в текущем потоке; join() — ожидает завершения подзадачи с возвращением результата; invokeAll(…) — объединяет все три предыдущие предыдущие операции, выполняя две или более задач за один заход; adapt(…) — создает новую задачу ForkJoinTask из Runnable или Callable объектов.

RecursiveTask — Абстрактный класс от ForkJoinTask, с объявлением метода compute, в котором должна производиться асинхронная операция в наследнике.

RecursiveAction — Отличается от RecursiveTask тем, не возвращает результат.

ForkJoinWorkerThread — Используется в качестве имплементации по умолчанию в ForkJoinPoll. При желании можно отнаследоваться и перегрузить методы инициализации и завершения worker потока.

Completion Service

CompletionService — Интерфейс сервиса с развязкой запуска асинхронных задач и получением результатов. Так, для добавления задач используются методы submit, а для вытаскивания результатов завершенных задач используются блокирующий метод take и неблокирующий poll.

ExecutorCompletionService — По сути является враппером над любым классом, реализующим интерфейс Executor, например ThreadPoolExecutor или ForkJoinPool. Используется преимущественно тогда, когда хочется абстрагироваться от способа запуска задач и контроля за их исполнением. Если есть завершенные задачи — вытаскиваем их, если нет — ждем в tak

Краткое руководство по JavaScript- шпаргалка по js

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

Шпаргалка выполнена в виде листа формата А4, который можно распечатать и держать перед собой на рабочем столе, что само по себе довольно удобно. Если вам не терпится, скорее скачайте ее и распечатайте, а для терпеливых я напишу описание каждого раздела.

Функции и методы

JavaScript позволяет использовать огромное количество методов и функций. Всех и не упомнишь сразу. Шпаргалку позволяет не запутаться в часто используемых функциях. Слева находится список простых методов в JavaScript. Справа DOM методы. Функции находятся в отдельном разделе в нижней части страницы.

Объект XMLHttpRequest

Объект XMLHttpRequest является относительно новой частью JavaScript. Объект используется для организации запросов без перезагрузки страницы. Данный объект получил широкое распространение с популяризацией технологии AJAX.

Регулярные выражения

JavaScript, как и многие языки программирования, поддерживает регулярные выражения. В данной шпаргалке имеется раздел с синтаксисом регулярных выражений в JavaScript.

Шпаргалка по Java: Глоссарий Java

Префикс

Постфикс

Как ни странно,

0 новые Правый новый, по JLS официально не оператор. Обычно это не считается приоритетным, поскольку
это может происходить только в одном контексте, за которым сразу следует имя класса. IIRC (если я правильно помню) он считался оператором в дни Java 1.0.
1 (префикс) ++
(префикс) —
(унарный) +
(унарный) —
(унарный) ~
(унарный)!
(литье)
Правый (префикс) ++ означает преинкремент (прибавление 1).
— префикс означает предварительное приращение (вычитание 1).
Преинкремент выполняет приращение перед выборкой значения для использования при оценке остальной части выражения. ! логично не для логических значений.
Практически всегда выражение нужно ставить после! в скобках. С таким же успехом вы можете выработать привычку делать это всегда.
Согласно JLS,
(приведение) и круглые скобки официально не являются операторами.
~ тильда побитовая, а не для целых чисел.
(отливка) имеет множество целей, объединенных под термином отливка
1 (постфикс) ++
(постфикс) —
Правый (постфикс) ++ означает постинкремент (прибавление 1).
— postfix означает постдекремент (вычитание 1).
Постинкремент увеличивается сразу после выборки значения для использования при оценке остальной части выражения.
Будьте очень осторожны при использовании переменных до / после увеличения / уменьшения в другом месте выражения. Вас может ждать сюрприз. например

int x = 2;
int y = x ++ * ++ x;


int x = 2;
int a = x ++;
int b = ++ x;
int y = a * b; 
2 *
/
%
Левый (инфикс) * — это целочисленное умножение для целых чисел и умножение с плавающей запятой для
удваивается.
% — это оператор остатка, неформально и неправильно называемый оператором модуля.
/ — целочисленное деление на целые числа и числа с плавающей запятой
разделение на парный разряд.
3 +
Левый (инфикс) + — обычное сложение, целое число или число с плавающей запятой.
.
— обычное вычитание, целое или с плавающей запятой.
.
a — b — c означает (a — b) —
c not a — (b — c), аддитивные операции выполняются слева направо. + также означает конкатенацию.
4 <<
>>
>>>
Левый (инфикс) Оператора <<< нет, потому что он был бы идентичен <<. Вы должны быть внимательны, когда делаете беззнаковые сдвиги, чтобы запомнить все правильные сдвиги должны выполняться с помощью >>> В Java версии 1.5 или новее встроены следующие методы, позволяющие
Избегайте большого количества мелочей на низком уровне: например, Integer.highestOneBit, lowOneBit, numberOfLeadingZeros, numberOfTrailingZeros, bitCount, rotateLeft, rotateRight, reverse, signum и reverseBytes..
5 <
>
<=
> =
экземпляр
Левый (инфикс) instanceof считается оператором, хотя он не может работать с выражениями.
6 ==
! =
Левый (инфикс) == для сравнения. ! = означает не равно. = для присваивания. Знак Паскаля <> не будет работать. == и! = работают и с логическими значениями, часто сохраняя лес if / elses.б)

9 | Левый (инфикс) побитовое ИЛИ в основном для целых чисел.

 int e = (a & b << 2) | (c & (d >>> 1));

int e = a & b << 2 | c & d >>> 1; 
10 && Левый (инфикс) закорачивает логическое И для логических значений.
11 || Левый (инфикс) закорачивает логическое ИЛИ для логических значений.Итак, когда вы говорите:

 if (((самый низкий <= a) && (a <= самый большой)) || notNeeded) 

: все эти скобки лишены смысла (компьютерный жаргон означает, что это не обязательно, но не повредит). Вы могли бы так же легко написать это, полагаясь на приоритет, как:

 если (наименьшее <= a && a <= наибольшее || notNeeded) 
12? : Правый (тройной)
13 =
* =
/ =
+ =
- =
<< =
>> =
>>> =
& =
^ =
| =
Правый (инфикс) a + = b означает a = a + b; а
* = b означает a = a * b; и т.п.Это упрощает вычитку
исключение двойного ввода имени переменной.

.Шпаргалка по

Java | OverAPI.com

Больше "

  • Git
  • СВН
  • MySQL
  • Регулярное выражение
  • Linux
  • HTML
  • HTML-DOM
  • mod_rewrite
  • Еще больше »

OverAPI.com

  • Python
  • jQuery
  • NodeJS
  • филиппинских песо

  • Java
  • Рубин
  • Javascript
  • ActionScript
  • CSS
  • Экспресс
  • Подробнее »

Загрузка...

Ресурс

Онлайн

  • Официальный сайт

Скачать

  • Краткий справочник по языку JAVA [.pdf]
  • Руководство по программированию JAVA - Краткое руководство [.pdf]

Связанные

  • BlazeDS
  • Затмение
  • EJB
  • GlassFish
  • Грааль
  • GWT
  • Спящий режим
  • IntelliJ IDEA
  • Java EE
  • JavaFX
  • JavaServer Faces
  • JBoss
  • JDBC
  • JSP
  • JUnit
  • Maven
  • NetBeans
  • RichFaces
  • Spring Framework
  • Spring Roo
  • Гобелен

Основы

Настройка

  • Настройка среды

Синтаксис

  • Базовый синтаксис
  • Объект и классы
  • Базовые типы данных
  • Типы переменных
  • Типы модификаторов
  • Основные операторы
  • Контроль контура
  • Создание решений
  • Методы
  • Исключения

Число

Номер Класс

  • Номер Класс

Числовые методы

  • xxxValue ()
  • compareTo ()
  • равно ()
  • valueOf ()
  • toString ()
  • parseInt ()
  • абс ()
  • ceil ()
  • этаж ()
  • ринт ()
  • круглый ()
  • мин. ()
  • макс. ()
  • эксп. ()
  • журнал ()
  • pow ()
  • sqrt ()
  • грех ()
  • cos ()
  • загар ()
  • asin ()
  • acos ()
  • атан ()
  • atan2 ()
  • в градусы ()
  • вРадианы ()
  • случайный ()

Персонаж

Класс символов

  • Класс символов

Методы символов

  • isLetter ()
  • isDigit ()
  • isWhitespace ()
  • isUpperCase ()
  • isLowerCase ()
  • в верхний корпус ()
  • в нижний корпус ()
  • toString ()

Строка

Класс струн

  • Класс строки

Строковые методы

  • char charAt (индекс int)
  • int compareTo (объект o)
  • int compareTo (строка другая строка)
  • интервал compareToIgnoreCase (строка строка)
  • Конкат. Строк (String str)
  • логическое значение contentEquals (StringBuffer sb)
  • статическая строка copyValueOf (char [] data)
  • статическая строка copyValueOf (char [] data, int offset, int count)
  • логическое завершение с (суффикс строки)
  • логическое равно (объект anObject)

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *