Практические работы по java

Содержание:

  • Подборки, 23 февраля 2016 в 12:41
  • Пётр Соковых

Java — язык программирования, который очень строго соответствует принципам объектно-ориентированного программирования. В этой статье вы найдете несколько полезных материалов, с которых стоит начать знакомство с языком.

Для начинающих

  • Отличная статья, в которой описано, как стоит подходить к изучению Java. После прочтения стоит заглянуть и в другие разделы сайта Skipy.ru, это уже будет полезно не только начинающим.
  • Study-Java — сайт, полностью состоящий из туториалов по Java, которые подскажут вам, в каком направлении стоит идти и какие навыки нужно вырабатывать в первую очередь.
  • Курс по основам языка Java.
  • Обширное руководство по многим темам с примерами кода.
  • Базовый курс по Java на ресурсе Stepik.
  • Более 350 вопросов с ответами для подготовки к интервью на позицию Junior Java Developer.
  • Наша подборка материалов для изучения языка Java.
  • Подборка полезных советов от Наньянского технологического университета — там есть аналогичные материалы и по другим темам.

Форумы, на которых вы можете задать возникшие вопросы:

Для продвинутых

  • Раздел Java на developer.com собрал в себе руководства как по целым пластам языка, вроде Enterprise Edition, так и разъяснения отдельных нюансов, вроде новомодных лямбда-выражений. Вот, например, статья, прочитав которую, вы разберётесь с тем, что такое аннотации, зачем они нужны и как правильно их использовать.
  • На сайте Tutorials Point есть раздел с исчерпывающим количеством туториалов по Java. Также там есть отдельный раздел для Java 8.
  • Java2S — коллекция примеров на все случаи жизни. Примечательно, что здесь есть не только чистая Java, но и работа с разными библиотеками, например JUnit. Хорошо описаны и нововведения Java 8 — Date-Time API, лямбды, потоки (streams).
  • Oskar Veerhoek — канал на YouTube, посвящённый OpenGL. Если вы собираетесь связать свою жизнь с программированием, маловероятно, что вам никогда не придётся работать с графикой. В течение курса из 41 видео автор расскажет вам, как работать с OpenGL в Java. Курс начинается с самых основ и написания 2D Minecraft’а, а заканчивается шейдерами, освещением и созданием 3D комнаты.

Для всех

  • Java-Tips — сборник готовых рецептов, шпаргалок, туториалов и полезных библиотек… Сайт будет незаменим для любого Java-программиста, особенно если вы только начинаете изучать язык. Отдельное спасибо стоит сказать тому, кто сортировал это всё — вам не составит труда найти здесь то, что вам нужно. Присутствуют материалы как по Java SE, так и по Enterprise и Micro версиям.
  • Регулярно обновляемый список вопросов и ответов.
  • Примеры решённых практических задач.
  • Структурированный справочник по языку.
  • Подробное руководство с примерами по каждой теме.
  • Обучающий материал от w3resource.
  • Подборка различных материалов для изучения языка.
  • Учебное пособие от Oracle, создателей языка.
  • Помните, что официальная документация — это источник самой достоверной и качественной информации.
  • Напоминаем, что на нашем сайте тоже есть порядочное количество статей по этому языку.

Практика

  • Бесплатные задачи, отсортированные по категориям на Codingbat;
  • Cписок задач от автора блога eax.me;
  • Олимпиадные задачи с ACMP;
  • Олимпиадные задачи с Codeforces;
  • Задачи с ответами на Codewars.

Полезные библиотеки

  • JUnit
    Любой код должен сопровождаться тестированием. Многие очень напрасно об этом забывают. Эта библиотека предназначена для автоматизации модульного тестирования. Еще несколько инструментов для тестирования в Java, вы найдете в нашей подборке.
  • HttpClient
    Библиотека для работы с HTTP ресурсами.
  • CommonsLang
    То, что «забыли» включить в JDK.
  • CommonsMath
    Отличное дополнение к java.math .
  • CommonsLogging
    Если вы используете для логирования System.out.println() , то вам стоит отрубить себе рук лучше воспользуйтесь этой библиотекой, так будет правильнее.
  • CommonsNet
    Логическое продолжение java.net , множество классов для работы с сетевыми протоколами.
  • CommonsVFS
    Библиотека, которая поможет вам абстрагироваться от способа хранения файлов — вы сможете достаточно обобщённо иметь к ним доступ по FTP, SFTP, WEBDAV, (G)ZIP и т.д.
  • CommonsIO
    С ней работать с вводом-выводом станет значительно проще.
Читайте также:  Certutil exe windows xp

Java 9

О том, какие изменения появились в Java 9, читайте в нашем обзоре с примерами.

Статьи

  • Подробный гайд по Java 9;
  • Знакомство с Project Jigsaw;
  • Java 9 Stream API: введение и материал по коллекторам;
  • Java 9 Process API;
  • Улучшения в Java Time (JSR-310);
  • Конкурентность;
  • Новое в Optional;
  • Разбираемся с Stack-Walking API;
  • Коллекции;
  • «Applying @Deprecated Enhancements»;
  • Используем sun.misc.Unsafe ;
  • Variable Handles;
  • Рефлексия vs Инкапсуляция;
  • Создание multi-release JAR-файлов при помощи Maven: о формате JAR, и о формате JAR с использованием Maven;
  • Ограничения памяти и Docker;
  • Введение в JShell.

Больше статей можно найти на этом сайте.

Блоги

  • Oracle (нет тега Java 9);
  • SitePoint;
  • Voxxed (выделим отличный цикл);
  • Baeldung;
  • Iteratr Learning (нет тега Java 9);
  • CodeFX;
  • Joda.

Книги и курсы

  • Курс «Java 9 Modularity: First Look»;
  • Книга «Java 9 Modularity»;
  • Книга «Mastering Java 9»;
  • Книга «Modular Programming in Java 9»;
  • Книга «Java 9 with JShell»;
  • Книга «Java 9 Module System».

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

Практические задачи по Java — для курсов и прочих занятий

Несколько вводных слов

Последние несколько лет я читаю курс по программированию на Java. Со временем он менялся — то добавлялись, то выкидывались разные части, менялась последовательность тем, менялся подход к построению плана самих занятий, и так далее. То есть, курс совершенствовался. Одной из основных проблем, возникших при подготовке курса — это задачи. О них и пойдёт речь.

Дело в том, что каждое моё занятие состоит из двух частей. На первой я выступаю в роли лектора — рассказываю с примерами кода о какой-то новой теме (классы, наследование, дженерики и так далее). Вторая часть — практическая. Очевидно, что нет смысла просто рассуждать о программировании, надо программировать. Приоритет на занятиях — решение задач, то есть программирование чего-то как-то. Программирование на занятиях отличается от программирования дома, так как на занятиях можно задать вопрос, показать код, получить быструю оценку кода, комментарии по улучшению, исправлению написанного. Очень легко было найти задачи для самых первых занятий. Задачи на циклы, условные операторы, и ООП (к примеру, написать класс «Собака» или класс «Вектор»). Сервисы вроде leetcode позволяют даже проверить правильность решения таких задач сразу, онлайн. Но какие задачи дать студентам на занятии, которое было посвящено коллекциям? Потокам? А аннотациям? За несколько лет я придумал, или переработал несколько таких задач, и эта статья, по сути, является сборником этих задач (к некоторым задачам прилагается решение).

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

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

Подборка лучших практик программирования на Java для экономии времени, оптимизации и улучшения качества кода.

На Java работают более 3 миллиардов устройств и кодят больше 9 миллионов разработчиков. Подсчитать количество приложений просто невозможно. Это мощный и надежный язык, но иногда программирование на Java может быть трудоемким.

Читайте также:  Hamachi не создает сетевой адаптер

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

В этой статье мы подобрали небольшую коллекцию таких практик, трюков и советов, которые сэкономят вам время.

Если вы начинающий Java-программист, то скачать Java можно на официальном сайте.

Организация работы

Чистый код

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

  • правило 10-50-500. В одном пакете не может быть больше 10 классов. Каждый метод должен быть короче 50 строк кода, а каждый класс – короче 500 строк;
  • дизайн-принципы SOLID;
  • использование паттернов проектирования.

Работа с ошибками

Трассировка стека

Отлов багов – это, возможно, самая трудоемкая составляющая процесса разработки на Java. Трассировка стека позволяет отследить, в каком именно месте проекта было выброшено исключение.

NullPointer Exception

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

Возьмем для примера следующую строчку кода:

Если объект school окажется равен Null или его метод listStudents вернет Null , вы получите исключение NullPointerException .

Хорошей практикой разработки на Java является предварительная проверка на Null в методах:

Дата и время

System.currentTimeMillis vs System.nanoTime

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

Метод System.currentTimeMillis возвращает текущее количество миллисекунд от начала эпохи Unix в формате Long . Его точность составляет от 1 до 15 тысячных долей секунды в зависимости от системы.

Метод System.nanoTime имеет точность до одной миллионной доли секунды (наносекунды) и возвращает текущее значение наиболее точного доступного системного таймера.

Таким образом, System.currentTimeMillis отлично подходит для отображения абсолютного времени и синхронизации с ним, а System.nanoTime – для измерения относительных интервалов.

Валидность строки с датой

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

Строки

Оптимизация строк

При конкатенации строк на Java с помощью оператора + , например, в цикле for , каждый раз создается новый объект String , что приводит к потере памяти и увеличению времени работы программы.

Также следует избегать создания Java строки с помощью конструктора класса:

Одинарные и двойные кавычки

Что вы ожидаете получить от этого кода?

Казалось бы, должна вернуться строка HaHa , но на деле будет Ha169 .

Двойные кавычки обрабатывают символы как строки, но одинарные ведут себя иначе. Они преобразуют символьные операнды ( ‘H’ и ‘a’ ) к целочисленным значениям через расширение примитивных типов – получается 169 .

Математика

Float vs Double

Программисты часто не могут выбрать необходимую им точность для чисел с плавающей точкой. Float требует всего 4 байта, но и значащих цифр у него только 7, в то время как Double в два раза точнее (15 цифр), но и в два раза расточительнее.

На самом деле большинство процессоров способны работать с Float и Double одинаково эффективно, поэтому воспользуйтесь рекомендацией Бьёрна Страуструпа:

"Выбор нужной точности в реальных задачах требует хорошего понимания природы машинных вычислений. Если у вас его нет, либо проконсультируйтесь с кем-нибудь, либо изучите проблему сами, либо используйте double и надейтесь на лучшее."

Проверка нечетности

Можно ли использовать этот код для точного определения нечетности числа?

Надеюсь, вы заметили подвох. Если мы решим проверить таким образом отрицательное нечетное число (-5, к примеру), остаток от деления не будет равен единице (а чему он равен?). Поэтому используйте более точный метод:

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

Вычисление степени

Возвести число в степень можно двумя способами:

  • простым умножением;
  • с помощью функции Math.pow(double base, double exponent) .

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

Простое умножение на Java работает в 300-600 раз эффективнее, к тому же его можно дополнительно оптимизировать:

Читайте также:  Daor13mb6e1 rev e схема

JIT-оптимизация

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

В качестве примера взглянем на две простые операции:

Измерим время выполнения каждой из них:

Запустив этот код несколько раз, получим что-то подобное:

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

Подробнее об этом эксперименте вы можете почитать здесь. А провести собственное испытание можно с помощью онлайн-компилятора Java.

Структуры данных

Объединение хеш-таблиц

Объединять два хеша, итерируя их значения вручную, весьма неэффективно. Вот альтернативное решение этой задачи, которое точно вам понравится:

Array vs ArrayList

Выбор между Array и ArrayList зависит от специфики задачи на Java, которую требуется решить. Помните о следующих особенностях этих типов:

  • Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayLists может динамически изменяться.
  • Массивы Java работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы.
  • При работе с Array велика вероятность получить ошибку ArrayIndexOutOfBoundsException .
  • У ArrayList только одно измерение, а вот массивы Java могут быть многомерными.

Сериализация и десериализация

JSON – невероятно удобный и полезный синтаксис для хранения и обмена данными. Java полностью поддерживает его.

Сериализовать данные можно так:

Получится вот такая JSON-строка:

Десериализация на Java выглядит примерно так:

JSON-файл, использованный в примере (jsonDemoFile.json):

Ввод-вывод

FileOutputStream vs. FileWriter

Запись файлов на Java осуществляется двумя способами: FileOutputStream и FileWriter . Какой именно метод выбрать, зависит от конкретной задачи.

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

У FileWriter другое призвание: работа с потоками символов. Так что если вы пишете текстовые файлы, выбирайте этот метод.

Производительность и лучшие практики

Пустая коллекция вместо Null

Если ваша программа может возвращать коллекцию, которая не содержит ни одного значения, убедитесь, что возвращена именно пустая коллекция, а не Null . Это сэкономит вам время на различные проверки.

Создание объектов только при необходимости

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

Взаимоблокировки (deadlocks)

Взаимные блокировки потоков могут возникать по многим причинам, и полностью защититься от них в Java 8 очень сложно. Чаще всего это происходит, когда один синхронизированный объект ожидает ресурсов, которые заблокированы другим синхронизированным объектом.

Вот пример такой взаимоблокировки потоков:

Вывод этой программы:

Взаимоблокировки можно избежать, если изменить порядок вызова потоков:

Резервирование памяти

Некоторые Java-приложения очень требовательны к ресурсам и могут работать медленно. Для повышения производительности можно выделять Java-машине больше оперативной памяти.

  • Xms – минимальный пул выделения памяти;
  • Xmx – максимальный пул выделения памяти;
  • XX:PermSize – начальный размер, который будет выделен при запуске JVM;
  • XX:MaxPermSize – максимальный размер, который может быть выделен при запуске JVM.

Решение распространенных задач

Содержимое директории

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

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

Java позволяет выполнять консольные команды прямо из кода с помощью класса Runtime . При этом очень важно не забывать об обработке исключений.

Для примера попробуем открыть PDF-файл через терминал на Java:

Воспроизведение звука

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

Отправка email

Отправка электронной почты на Java очень проста. Нужно лишь установить Java Mail и указать путь к нему в classpath проекта.

Захват координат курсора

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