Получение координат курсора
Чтобы фиксировать события мыши, вам необходимо реализовать интерфейс MouseMotionListener. Когда курсор попадает в определенную область, срабатывает обработчик события mouseMoved, из которого вы можете получить точные координаты (используя Swing для UI).
@java_geek
Чтобы фиксировать события мыши, вам необходимо реализовать интерфейс MouseMotionListener. Когда курсор попадает в определенную область, срабатывает обработчик события mouseMoved, из которого вы можете получить точные координаты (используя Swing для UI).
@java_geek
Встроенные исключения
Java определяет несколько классов исключений внутри стандартного пакета java.lang.
Наиболее общие из этих исключений являются подклассами стандартного типа RuntimeException. Поскольку java.lang неявно импортируется во все java-программы, то большинство исключений, полученных из RuntimeException, автоматические.
Java определяет несколько других типов исключений, которые относятся к его различным библиотекам класса. Ниже приведен список неконтролируемых исключений на этапе выполнения (Unchecked RuntimeException).
@java_geek
Java определяет несколько классов исключений внутри стандартного пакета java.lang.
Наиболее общие из этих исключений являются подклассами стандартного типа RuntimeException. Поскольку java.lang неявно импортируется во все java-программы, то большинство исключений, полученных из RuntimeException, автоматические.
Java определяет несколько других типов исключений, которые относятся к его различным библиотекам класса. Ниже приведен список неконтролируемых исключений на этапе выполнения (Unchecked RuntimeException).
@java_geek
Генерируем код и пароль
Часто мы забываем наши пароли и выбираем опцию «Забыть пароль», и в кратчайшие сроки мы получаем новый пароль на наш зарегистрированный адрес электронной почты или номер телефона для входа в нашу учетную запись.
Иногда мы получаем доступ к нашим банковским счетам во время покупок в интернет-магазине и чтобы подтвердить наш переход с банковского счета, нам отправляют нам OTP (одноразовый пароль) на наш зарегистрированный номер телефона или адрес электронной почты.
Следующий код объясняет, как быстро генерировать такие пароли и OTP.
@java_geek
Часто мы забываем наши пароли и выбираем опцию «Забыть пароль», и в кратчайшие сроки мы получаем новый пароль на наш зарегистрированный адрес электронной почты или номер телефона для входа в нашу учетную запись.
Иногда мы получаем доступ к нашим банковским счетам во время покупок в интернет-магазине и чтобы подтвердить наш переход с банковского счета, нам отправляют нам OTP (одноразовый пароль) на наш зарегистрированный номер телефона или адрес электронной почты.
Следующий код объясняет, как быстро генерировать такие пароли и OTP.
@java_geek
Чем похожи класс и интерфейс?
☕️ Интерфейс может содержать любое количество методов;
☕️ Интерфейс записан в файле с расширением .java, и имя интерфейса совпадает с именем файла;
☕️ Байт-код интерфейса находится в .class файле;
☕️ Интерфейсы появляются в пакетах, и их соответствующий файл байт-кода должен быть в структуре каталогов, которая совпадает с именем пакета.
@java_geek
☕️ Интерфейс может содержать любое количество методов;
☕️ Интерфейс записан в файле с расширением .java, и имя интерфейса совпадает с именем файла;
☕️ Байт-код интерфейса находится в .class файле;
☕️ Интерфейсы появляются в пакетах, и их соответствующий файл байт-кода должен быть в структуре каталогов, которая совпадает с именем пакета.
@java_geek
Каким образом из вложенного класса получить доступ к полю внешнего класса?
Статический вложенный класс имеет прямой доступ только к статическим полям обрамляющего класса.
Простой внутренний класс, может обратиться к любому полю внешнего класса напрямую. В случае, если у вложенного класса уже существует поле с таким же литералом, то обращаться к такому полю следует через ссылку на его экземпляр. Например: Outer.this.field.
@java_geek
Статический вложенный класс имеет прямой доступ только к статическим полям обрамляющего класса.
Простой внутренний класс, может обратиться к любому полю внешнего класса напрямую. В случае, если у вложенного класса уже существует поле с таким же литералом, то обращаться к такому полю следует через ссылку на его экземпляр. Например: Outer.this.field.
@java_geek
Guava
Guava — это сборник множества библиотек от Google. Он включает в себя:
☕️ несколько новых типов коллекций, неизменяемые коллекции;
☕️ библиотеку, реализующую работу с графами;
☕️ работу с вводом\выводом, хешированием, кэшированием, строками и многим другим.
Например, часто в коде можно встретить повторяющиеся блоки, реализующие низкоуровневую конкатенацию строк (см. пример кода). Согласитесь, код с Guava выглядит лаконичнее, понятнее, а главное, выполняет эту операцию самым оптимальным образом.
На эту библиотеку определённо стоит обратить внимание как минимум по причинам. Во-первых, она разработана спецами из Google. Во-вторых, эти же спецы из Google сами её используют. Репозиторий с документацией и инструкцией к установке тут.
@java_geek
Guava — это сборник множества библиотек от Google. Он включает в себя:
☕️ несколько новых типов коллекций, неизменяемые коллекции;
☕️ библиотеку, реализующую работу с графами;
☕️ работу с вводом\выводом, хешированием, кэшированием, строками и многим другим.
Например, часто в коде можно встретить повторяющиеся блоки, реализующие низкоуровневую конкатенацию строк (см. пример кода). Согласитесь, код с Guava выглядит лаконичнее, понятнее, а главное, выполняет эту операцию самым оптимальным образом.
На эту библиотеку определённо стоит обратить внимание как минимум по причинам. Во-первых, она разработана спецами из Google. Во-вторых, эти же спецы из Google сами её используют. Репозиторий с документацией и инструкцией к установке тут.
@java_geek
Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а экземпляры ссылочных типов данных в куче?
Ответ:
Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё, что явно или неявно создаётся при помощи оператора new) хранится в куче.
@java_geek
Ответ:
Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё, что явно или неявно создаётся при помощи оператора new) хранится в куче.
@java_geek
Разница дат в Java
Иногда Вам может понадобиться рассчитать разницу между датами, измерить точку во времени в миллисекундах.
Результат выполнения кода будет похож на это:
Fri Jan 07 17:11:18 GMT 2022
Fri Jan 07 17:11:28 GMT 2022
Разница между датами: 10069 миллисекунд
@java_geek
Иногда Вам может понадобиться рассчитать разницу между датами, измерить точку во времени в миллисекундах.
Результат выполнения кода будет похож на это:
Fri Jan 07 17:11:18 GMT 2022
Fri Jan 07 17:11:28 GMT 2022
Разница между датами: 10069 миллисекунд
@java_geek
Побитовые операции
• ~ : Побитовый унарный оператор NOT;
• & : Побитовый AND;
• &= : Побитовый AND с присваиванием;
• | : Побитовый OR;
• |= : Побитовый OR с присваиванием;
• ^ : Побитовый исключающее XOR;
• ^= : Побитовый исключающее XOR с присваиванием;
• >> : Сдвиг вправо (деление на 2 в степени сдвига);
• >>= : Сдвиг вправо с присваиванием;
• >>> : Сдвиг вправо без учёта знака;
• >>>= : Сдвиг вправо без учёта знака с присваиванием;
• << : Сдвиг влево (умножение на 2 в степени сдвига);
• <<= : Сдвиг влево с присваиванием.
@java_geek
• ~ : Побитовый унарный оператор NOT;
• & : Побитовый AND;
• &= : Побитовый AND с присваиванием;
• | : Побитовый OR;
• |= : Побитовый OR с присваиванием;
• ^ : Побитовый исключающее XOR;
• ^= : Побитовый исключающее XOR с присваиванием;
• >> : Сдвиг вправо (деление на 2 в степени сдвига);
• >>= : Сдвиг вправо с присваиванием;
• >>> : Сдвиг вправо без учёта знака;
• >>>= : Сдвиг вправо без учёта знака с присваиванием;
• << : Сдвиг влево (умножение на 2 в степени сдвига);
• <<= : Сдвиг влево с присваиванием.
@java_geek
Приведите пример, когда какая-либо коллекция выбрасывает UnsupportedOperationException.
Ответ:
В примере возникает ошибка, потому что Collections.emptyList() возвращает пустой список без возможности добавления элементов.
@java_geek
Ответ:
В примере возникает ошибка, потому что Collections.emptyList() возвращает пустой список без возможности добавления элементов.
@java_geek
NullPointer Exception
Исключение нулевого указателя возникает в Java довольно часто при попытке вызова метода несуществующего объекта.
Рассмотрим строчку кода из примера 1 на картинке. Если объект school окажется равен null или его метод listStudents вернет null, вы получите исключение NullPointerException.
Хорошей практикой разработки на Java является предварительная проверка на null в методах (как в примере 2).
@java_geek
Исключение нулевого указателя возникает в Java довольно часто при попытке вызова метода несуществующего объекта.
Рассмотрим строчку кода из примера 1 на картинке. Если объект school окажется равен null или его метод listStudents вернет null, вы получите исключение NullPointerException.
Хорошей практикой разработки на Java является предварительная проверка на null в методах (как в примере 2).
@java_geek
Проверка на нечетность
Можно ли использовать этот код с примера 1 на картинке для точного определения нечетного числа?
Надеюсь, вы заметили хитрость. Если мы решим таким образом проверить отрицательное нечетное число (например, -5), остаток от деления не будет равен единице, поэтому воспользуйтесь более точным методом (пример 2).
Он не только решает проблему отрицательных чисел, но и работает более производительно, чем предыдущий метод. Арифметические и логические операции выполняются намного быстрее, чем умножение и деление.
@java_geek
Можно ли использовать этот код с примера 1 на картинке для точного определения нечетного числа?
Надеюсь, вы заметили хитрость. Если мы решим таким образом проверить отрицательное нечетное число (например, -5), остаток от деления не будет равен единице, поэтому воспользуйтесь более точным методом (пример 2).
Он не только решает проблему отрицательных чисел, но и работает более производительно, чем предыдущий метод. Арифметические и логические операции выполняются намного быстрее, чем умножение и деление.
@java_geek
Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode()?
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например, такие как id, uuid. При этом нужно следовать правилу, если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().
@java_geek
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например, такие как id, uuid. При этом нужно следовать правилу, если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().
@java_geek
Класс FileWriter
Наследуется от класса OutputStreamWriter, используется для записи потоков символов. Код на картинке создает файл с разрешением .txt и записывает в него текст, а после с помощью FileReader читает его из файла.
Класс имеет несколько конструкторов, а также список вспомогательных методов, которые можно использовать для управления файлами.
@java_geek
Наследуется от класса OutputStreamWriter, используется для записи потоков символов. Код на картинке создает файл с разрешением .txt и записывает в него текст, а после с помощью FileReader читает его из файла.
Класс имеет несколько конструкторов, а также список вспомогательных методов, которые можно использовать для управления файлами.
@java_geek
Поддерживает ли язык Java множественное наследование?
Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?
Ответ несколько более сложен, чем может показаться на первый взгляд, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
@java_geek
Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?
Ответ несколько более сложен, чем может показаться на первый взгляд, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
@java_geek
new vs valueOf
Старайтесь всегда использовать метод valueOf вместо конструктора в стандартных классах-оболочках примитивных типов, кроме тех случаев, когда вам нужно конкретно выделить память под новое значение. Сейчас объясню, почему.
Все оболочки, кроме чисел с плавающей точкой, от Byte до Long, имеют кэш. По умолчанию этот кэш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кэша. Значение из кэша достается в 3.5 раза быстрее, чем при использовании конструктора, плюс идёт экономия памяти.
Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной.
@java_geek
Старайтесь всегда использовать метод valueOf вместо конструктора в стандартных классах-оболочках примитивных типов, кроме тех случаев, когда вам нужно конкретно выделить память под новое значение. Сейчас объясню, почему.
Все оболочки, кроме чисел с плавающей точкой, от Byte до Long, имеют кэш. По умолчанию этот кэш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кэша. Значение из кэша достается в 3.5 раза быстрее, чем при использовании конструктора, плюс идёт экономия памяти.
Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной.
@java_geek
Зачем добавили ArrayList, если уже был Vector?
• Методы класса Vector синхронизированы, а ArrayList - нет;
• По умолчанию, Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
@java_geek
• Методы класса Vector синхронизированы, а ArrayList - нет;
• По умолчанию, Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
@java_geek
JIT-оптимизация
Java-код обрабатывается с помощью JIT-компиляции: сначала транслируется в платформонезависимый байт-код, а уже после этого в машинный код. При этом оптимизируется все, что возможно, и разработчик может помочь компилятору создать максимально эффективную программу.
В качестве примера взглянем на две простые операции:
// 1
n += 2 * i * i;
// 2
n += 2 * (i * i);
Измерим время выполнения каждой из них. Запустив код с картинки несколько раз, получим подобные цифры, отображающие время выполнения:
2 * (i * i) | 2 * i * i
0.5183738 | 0.6246434
0.5298337 | 0.6049722
0.5308647 | 0.6603363
0.5133458 | 0.6243328
0.5003011 | 0.6541802
Закономерность очевидна: группировка переменных с помощью скобок ускоряет работу программы. Это происходит из-за генерации более эффективного байт-кода при умножении одинаковых значений.
@java_geek
Java-код обрабатывается с помощью JIT-компиляции: сначала транслируется в платформонезависимый байт-код, а уже после этого в машинный код. При этом оптимизируется все, что возможно, и разработчик может помочь компилятору создать максимально эффективную программу.
В качестве примера взглянем на две простые операции:
// 1
n += 2 * i * i;
// 2
n += 2 * (i * i);
Измерим время выполнения каждой из них. Запустив код с картинки несколько раз, получим подобные цифры, отображающие время выполнения:
2 * (i * i) | 2 * i * i
0.5183738 | 0.6246434
0.5298337 | 0.6049722
0.5308647 | 0.6603363
0.5133458 | 0.6243328
0.5003011 | 0.6541802
Закономерность очевидна: группировка переменных с помощью скобок ускоряет работу программы. Это происходит из-за генерации более эффективного байт-кода при умножении одинаковых значений.
@java_geek
Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?
При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость, capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой trimToSize().
@java_geek
При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость, capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой trimToSize().
@java_geek
Как написать собственное («пользовательское») исключение?
Необходимо унаследоваться от базового класса требуемого типа исключений (например, от Exception или RuntimeException).
@java_geek
Необходимо унаследоваться от базового класса требуемого типа исключений (например, от Exception или RuntimeException).
@java_geek
Опишите работу блока try-catch-finally.
try — это ключевое слово используется для отметки начала блока кода, который потенциально может выдать ошибку. catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения. finally — слово для отметки начала необязательного блока кода. Этот блок помещается после последнего блока catch. Управление передаётся в блок finally вне зависимости от того, было выброшено исключение или нет.
Общий вид конструкции показан на картинке.
@java_geek
try — это ключевое слово используется для отметки начала блока кода, который потенциально может выдать ошибку. catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения. finally — слово для отметки начала необязательного блока кода. Этот блок помещается после последнего блока catch. Управление передаётся в блок finally вне зависимости от того, было выброшено исключение или нет.
Общий вид конструкции показан на картинке.
@java_geek