Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а экземпляры ссылочных типов данных в куче?
Ответ:
Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё, что явно или неявно создаётся при помощи оператора 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
Что такое литералы?
Литералы — это явно заданные значения в коде программы, константы определенного типа, которые находятся в коде в момент запуска.
В классе на картинке “Hello world!” — литерал, переменная a — тоже.
Литералы бывают разных типов, которые определяются их назначением и способом написания.
@java_geek
Литералы — это явно заданные значения в коде программы, константы определенного типа, которые находятся в коде в момент запуска.
В классе на картинке “Hello world!” — литерал, переменная a — тоже.
Литералы бывают разных типов, которые определяются их назначением и способом написания.
@java_geek
Как написать собственное («пользовательское») исключение?
Необходимо унаследоваться от базового класса требуемого типа исключений (например, от
@java_geek
Необходимо унаследоваться от базового класса требуемого типа исключений (например, от
Exception
или RuntimeException
).@java_geek
Guava
Guava — это сборник множества библиотек от Google. Он включает в себя:
☕️ несколько новых типов коллекций, неизменяемые коллекции;
☕️ библиотеку, реализующую работу с графами;
☕️ работу с вводом\выводом, хешированием, кэшированием, строками и многим другим.
Например, часто в коде можно встретить повторяющиеся блоки, реализующие низкоуровневую конкатенацию строк (см. пример кода). Согласитесь, код с Guava выглядит лаконичнее, понятнее, а главное, выполняет эту операцию самым оптимальным образом.
На эту библиотеку определённо стоит обратить внимание как минимум по причинам. Во-первых, она разработана спецами из Google. Во-вторых, эти же спецы из Google сами её используют. Репозиторий с документацией и инструкцией к установке тут.
@java_geek
Guava — это сборник множества библиотек от Google. Он включает в себя:
☕️ несколько новых типов коллекций, неизменяемые коллекции;
☕️ библиотеку, реализующую работу с графами;
☕️ работу с вводом\выводом, хешированием, кэшированием, строками и многим другим.
Например, часто в коде можно встретить повторяющиеся блоки, реализующие низкоуровневую конкатенацию строк (см. пример кода). Согласитесь, код с Guava выглядит лаконичнее, понятнее, а главное, выполняет эту операцию самым оптимальным образом.
На эту библиотеку определённо стоит обратить внимание как минимум по причинам. Во-первых, она разработана спецами из Google. Во-вторых, эти же спецы из Google сами её используют. Репозиторий с документацией и инструкцией к установке тут.
@java_geek
Можно ли из конструктора бросить исключение?
С исключениями конструкторы работают точно так же, как и методы.
И если методы позволяют нам пробрасывать исключения, прописывая в заголовке метода throws <ТипИсключения>, то и конструктор позволяет нам это делать, и так же при наследовании и определении конструктора наследника мы можем расширять тип исключения. Например, IOException -> Exception (но не наоборот).
В качестве примера для пробрасывания конструктором исключения возьмем класс Cat. Допустим, при его создании мы хотим вводить имя и возраст с консоли(см картинку).
Так как reader.readLine() бросает исключение IOException, в заголовке мы его прописываем как возможное выбрасываемое исключение.
@java_geek
С исключениями конструкторы работают точно так же, как и методы.
И если методы позволяют нам пробрасывать исключения, прописывая в заголовке метода throws <ТипИсключения>, то и конструктор позволяет нам это делать, и так же при наследовании и определении конструктора наследника мы можем расширять тип исключения. Например, IOException -> Exception (но не наоборот).
В качестве примера для пробрасывания конструктором исключения возьмем класс Cat. Допустим, при его создании мы хотим вводить имя и возраст с консоли(см картинку).
Так как reader.readLine() бросает исключение IOException, в заголовке мы его прописываем как возможное выбрасываемое исключение.
@java_geek
Что такое пакет? Перечислите различные преимущества пакетов.
Пакеты – это набор связанных классов и интерфейсов, которые связаны вместе. Используя пакеты, разработчики могут легко модулировать код и оптимизировать его повторное использование. Кроме того, код внутри пакетов может быть импортирован другими классами и использован повторно. Несколько его преимуществ:
• Пакеты на Java помогают избежать конфликтов имен.
• Они обеспечивают более легкий контроль доступа к коду.
• Пакеты также могут содержать скрытые классы, которые не видны внешним классам и используются только внутри пакета..
• Создает правильную иерархическую структуру, которая упрощает поиск связанных классов.
@java_geek
Пакеты – это набор связанных классов и интерфейсов, которые связаны вместе. Используя пакеты, разработчики могут легко модулировать код и оптимизировать его повторное использование. Кроме того, код внутри пакетов может быть импортирован другими классами и использован повторно. Несколько его преимуществ:
• Пакеты на Java помогают избежать конфликтов имен.
• Они обеспечивают более легкий контроль доступа к коду.
• Пакеты также могут содержать скрытые классы, которые не видны внешним классам и используются только внутри пакета..
• Создает правильную иерархическую структуру, которая упрощает поиск связанных классов.
@java_geek
Примитивные типы
Компьютеры работают в основном с числами, поэтому были придуманы несколько ключевых слов, которые обозначают разные типы данных, по-другому их называют примитивные типы данных. Так как компьютеры развивались постепенно, то на разных этапах своей жизни они могли хранить число, которое не выше разряда процессора, на котором они работают. Поэтому появилась такая битовая таблица различных чисел.
@java_geek
Компьютеры работают в основном с числами, поэтому были придуманы несколько ключевых слов, которые обозначают разные типы данных, по-другому их называют примитивные типы данных. Так как компьютеры развивались постепенно, то на разных этапах своей жизни они могли хранить число, которое не выше разряда процессора, на котором они работают. Поэтому появилась такая битовая таблица различных чисел.
@java_geek