Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?
Если возникшее исключение - наследник RuntimeException:
• для статических блоков инициализации будет выброшено java.lang.ExceptionInInitializerError;
• для нестатических будет проброшено исключение-источник.
Если возникшее исключение - наследник Error, то в обоих случаях будет выброшено java.lang.Error. Исключение: java.lang.ThreadDeath - смерть потока. В этом случае никакое исключение выброшено не будет.
@java_geek
Если возникшее исключение - наследник RuntimeException:
• для статических блоков инициализации будет выброшено java.lang.ExceptionInInitializerError;
• для нестатических будет проброшено исключение-источник.
Если возникшее исключение - наследник Error, то в обоих случаях будет выброшено java.lang.Error. Исключение: java.lang.ThreadDeath - смерть потока. В этом случае никакое исключение выброшено не будет.
@java_geek
Оцените количество памяти на хранение одного примитива типа byte в ArrayList?
ArrayList основан на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому 16 байт тратится на хранение упакованного объекта и 4 байта (8 для x64) - на хранение ссылки на этот объект в самой структуре данных.
Таким образом, в x32 JVM 4 байта используются на хранение одного элемента и 16 байт - на хранение упакованного объекта типа Byte. Для x64 - 8 байт и 24 байта соответственно.
@java_geek
ArrayList основан на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому 16 байт тратится на хранение упакованного объекта и 4 байта (8 для x64) - на хранение ссылки на этот объект в самой структуре данных.
Таким образом, в x32 JVM 4 байта используются на хранение одного элемента и 16 байт - на хранение упакованного объекта типа Byte. Для x64 - 8 байт и 24 байта соответственно.
@java_geek
Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
• OutputStreamWriter — «мост» между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.
• InputStreamReader — аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.
@java_geek
• OutputStreamWriter — «мост» между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.
• InputStreamReader — аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.
@java_geek
Enum vs String
Используйте Enum для предопределенных состояний модели там, где это возможно. Это не только упрощает понимание кода, но и ускоряет процесс сравнения этих состояний. Сравнение по ссылке, определенно, на порядок быстрее стравнения строк или других обьектов.
Правда, в этом случае есть один большой минус — стоимость поддержки приложения увеличивается, особенно это становится заметным, когда нужно добавить, удалить или изменить одно из существующих состояний.
Но в случае если это неизменные свойства, как месяц года, то смело используйте перечисление.
@java_geek
Используйте Enum для предопределенных состояний модели там, где это возможно. Это не только упрощает понимание кода, но и ускоряет процесс сравнения этих состояний. Сравнение по ссылке, определенно, на порядок быстрее стравнения строк или других обьектов.
Правда, в этом случае есть один большой минус — стоимость поддержки приложения увеличивается, особенно это становится заметным, когда нужно добавить, удалить или изменить одно из существующих состояний.
Но в случае если это неизменные свойства, как месяц года, то смело используйте перечисление.
@java_geek
Дайте определение понятию «конструктор»
Конструктор — это специальный метод, у которого отсутствует возвращаемый тип и который имеет то же имя, что и класс, в котором он используется. Конструктор вызывается при создании нового объекта класса и определяет действия необходимые для его инициализации.
@java_geek
Конструктор — это специальный метод, у которого отсутствует возвращаемый тип и который имеет то же имя, что и класс, в котором он используется. Конструктор вызывается при создании нового объекта класса и определяет действия необходимые для его инициализации.
@java_geek
Воспроизведение звуков
Звук — важный компонент многих десктопных приложений и игр. Язык программирования Java предоставляет средства для работы с ним.
@java_geek
Звук — важный компонент многих десктопных приложений и игр. Язык программирования Java предоставляет средства для работы с ним.
@java_geek
Что значит «усыпить» поток?
Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод Thread.sleep() передав в качестве параметра необходимое количество времени в миллисекундах. До истечения этого времени поток может быть выведен из состояния ожидания вызовом interrupt() с выбрасыванием InterruptedException.
@java_geek
Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод Thread.sleep() передав в качестве параметра необходимое количество времени в миллисекундах. До истечения этого времени поток может быть выведен из состояния ожидания вызовом interrupt() с выбрасыванием InterruptedException.
@java_geek
Какие типы классов бывают в Java?
☕️ Top level class (Обычный класс):
✔️ Abstract class (Абстрактный класс);
✔️ Final class (Финализированный класс).
☕️ Interfaces (Интерфейс).
☕️ Enum (Перечисление).
☕️ Nested class (Вложенный класс):
✔️ Static nested class (Статический вложенный класс);
✔️ Member inner class (Простой внутренний класс);
✔️ Local inner class (Локальный класс);
✔️ Anonymous inner class (Анонимный класс).
@java_geek
☕️ Top level class (Обычный класс):
✔️ Abstract class (Абстрактный класс);
✔️ Final class (Финализированный класс).
☕️ Interfaces (Интерфейс).
☕️ Enum (Перечисление).
☕️ Nested class (Вложенный класс):
✔️ Static nested class (Статический вложенный класс);
✔️ Member inner class (Простой внутренний класс);
✔️ Local inner class (Локальный класс);
✔️ Anonymous inner class (Анонимный класс).
@java_geek
Возведение в степень
Возвести число в степень можно двумя способами:
1)простое умножение;
2)используя метод Math.pow() (двойное основание, двойной показатель степени).
Использование библиотечной функции рекомендуется только в случае крайней необходимости, например, в случае дробной или отрицательной степени.
Простое умножение в Java работает в 300-600 раз эффективнее, кроме того, его можно дополнительно оптимизировать.
@java_geek
Возвести число в степень можно двумя способами:
1)простое умножение;
2)используя метод Math.pow() (двойное основание, двойной показатель степени).
Использование библиотечной функции рекомендуется только в случае крайней необходимости, например, в случае дробной или отрицательной степени.
Простое умножение в Java работает в 300-600 раз эффективнее, кроме того, его можно дополнительно оптимизировать.
@java_geek
Что не так с кодом?
Он не скомпилируется. Это вопрос на знание иерархии исключений: FileNotFoundException унаследован от IOException, первый catch будет перехватывать все исключения, а в следующий блок catch управление передано не будет. Поэтому возникнет ошибка: exception FileNotFoundException has already been caught.
@java_geek
Он не скомпилируется. Это вопрос на знание иерархии исключений: FileNotFoundException унаследован от IOException, первый catch будет перехватывать все исключения, а в следующий блок catch управление передано не будет. Поэтому возникнет ошибка: exception FileNotFoundException has already been caught.
@java_geek
Какие преимущества есть у многопоточности?
1) Многопоточность позволяет приложению / программе всегда реагировать на ввод, даже если она уже выполняется с некоторыми фоновыми задачами;
2) Многопоточность позволяет быстрее выполнять задачи, поскольку потоки выполняются независимо;
3) Многопоточность обеспечивает лучшее использование кэш-памяти, поскольку потоки разделяют общие ресурсы памяти;
4) Многопоточность уменьшает количество требуемого сервера, поскольку один сервер может одновременно выполнять несколько потоков.
@java_geek
1) Многопоточность позволяет приложению / программе всегда реагировать на ввод, даже если она уже выполняется с некоторыми фоновыми задачами;
2) Многопоточность позволяет быстрее выполнять задачи, поскольку потоки выполняются независимо;
3) Многопоточность обеспечивает лучшее использование кэш-памяти, поскольку потоки разделяют общие ресурсы памяти;
4) Многопоточность уменьшает количество требуемого сервера, поскольку один сервер может одновременно выполнять несколько потоков.
@java_geek
Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?
Метод
@java_geek
Метод
File.listFiles()
возвращает массив объектов File, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего FileFilter. Это позволяет включить в список только те элементы, для которых метод accept возвращает true
(критерием может быть длина имени файла или его расширение).@java_geek
Что такое «ссылка на метод»?
Если существующий в классе метод уже делает все, что необходимо, то можно воспользоваться механизмом method reference (ссылка на метод) для непосредственной передачи этого метода. Такая ссылка передается в виде:
•
•
•
Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод.
Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более качественную информацию о типе и при возможности выбора между использованием ссылки на существующий метод и использованием лямбда-выражения, следует всегда предпочитать использование ссылки на метод.
@java_geek
Если существующий в классе метод уже делает все, что необходимо, то можно воспользоваться механизмом method reference (ссылка на метод) для непосредственной передачи этого метода. Такая ссылка передается в виде:
•
имя_класса::имя_статического_метода
для статического метода;•
объект_класса::имя_метода
для метода экземпляра;•
название_класса::new
для конструктора.Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод.
Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более качественную информацию о типе и при возможности выбора между использованием ссылки на существующий метод и использованием лямбда-выражения, следует всегда предпочитать использование ссылки на метод.
@java_geek
Какой способ клонирования предпочтительней?
Наиболее безопасным и, следовательно, предпочтительным способом клонирования является использование специализированного конструктора копирования:
• Отсутствие ошибок наследования (не нужно беспокоиться, что у наследников появятся новые поля, которые не будут склонированы через метод
• Поля для клонирования указываются явно;
• Возможность клонировать даже
@java_geek
Наиболее безопасным и, следовательно, предпочтительным способом клонирования является использование специализированного конструктора копирования:
• Отсутствие ошибок наследования (не нужно беспокоиться, что у наследников появятся новые поля, которые не будут склонированы через метод
clone())
;• Поля для клонирования указываются явно;
• Возможность клонировать даже
final
поля.@java_geek
Адаптер
Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он позволяет «преобразовать» интерфейс одного класса в интерфейс другого класса таким образом, чтобы они могли взаимодействовать без изменения существующего кода.
Паттерн Адаптер включает в себя два вида адаптеров:
☕ Классовый адаптер: использует наследование для адаптации интерфейса исходного класса к целевому интерфейсу. То есть, он наследует исходный класс и реализует целевой интерфейс.
☕ Объектный адаптер: использует композицию, чтобы включить объект исходного адаптер и реализует целевой интерфейс.
👉@java_geek
Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он позволяет «преобразовать» интерфейс одного класса в интерфейс другого класса таким образом, чтобы они могли взаимодействовать без изменения существующего кода.
Паттерн Адаптер включает в себя два вида адаптеров:
☕ Классовый адаптер: использует наследование для адаптации интерфейса исходного класса к целевому интерфейсу. То есть, он наследует исходный класс и реализует целевой интерфейс.
☕ Объектный адаптер: использует композицию, чтобы включить объект исходного адаптер и реализует целевой интерфейс.
👉@java_geek
При помощи чего формируются запросы к базе данных?
Для выполнения запросов к базе данных в Java используются три интерфейса:
☕️ java.sql.Statement - для операторов SQL без параметров;
☕️ java.sql.PreparedStatement - для операторов SQL с параметрами и часто выполняемых операторов;
☕️ java.sql.CallableStatement - для исполнения хранимых в базе процедур.
Объекты-носители интерфейсов создаются при помощи методов объекта java.sql.Connection:
☕️ java.sql.createStatement() возвращает объект Statement;
☕️ java.sql.prepareStatement() возвращает объект PreparedStatement;
☕️ java.sql.prepareCall() возвращает объект CallableStatement;
👉@java_geek
Для выполнения запросов к базе данных в Java используются три интерфейса:
☕️ java.sql.Statement - для операторов SQL без параметров;
☕️ java.sql.PreparedStatement - для операторов SQL с параметрами и часто выполняемых операторов;
☕️ java.sql.CallableStatement - для исполнения хранимых в базе процедур.
Объекты-носители интерфейсов создаются при помощи методов объекта java.sql.Connection:
☕️ java.sql.createStatement() возвращает объект Statement;
☕️ java.sql.prepareStatement() возвращает объект PreparedStatement;
☕️ java.sql.prepareCall() возвращает объект CallableStatement;
👉@java_geek
Узнаем IP-адрес своего компьютера
👉@java_geek
InetAddress.getLocalHost()
используется для поиска частных IP - адресов, используемых в локальной сети или любой другой локальной сети.👉@java_geek
Динамический массив
В Java динамический массив представляет собой структуру данных, которая позволяет хранить и управлять коллекцией элементов переменного размера.
Он реализуется с помощью класса
👉@java_geek
В Java динамический массив представляет собой структуру данных, которая позволяет хранить и управлять коллекцией элементов переменного размера.
Он реализуется с помощью класса
ArrayList. ArrayList
представляет собой реализацию списка, который может изменять свой размер по мере необходимости.👉@java_geek
Отложенная инициализация
Отложенная инициализация — это паттерн проектирования, который позволяет отложить создание объекта до момента его реального использования. Он полезен, когда создание объекта требует значительных ресурсов или происходит в условиях, когда объект может не понадобиться.
В Java есть несколько способов реализации отложенной инициализации. Два наиболее распространенных подхода — это использование двойной проверки и использование внутреннего класса. На картинке мы рассмотрели использование двойной проверки (Double-Checked Locking).
@java_geek
Отложенная инициализация — это паттерн проектирования, который позволяет отложить создание объекта до момента его реального использования. Он полезен, когда создание объекта требует значительных ресурсов или происходит в условиях, когда объект может не понадобиться.
В Java есть несколько способов реализации отложенной инициализации. Два наиболее распространенных подхода — это использование двойной проверки и использование внутреннего класса. На картинке мы рассмотрели использование двойной проверки (Double-Checked Locking).
@java_geek