#Вопросы_с_собеседования
Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
- Метод должен удовлетворять условиям транзитивности, рефлексивности и симметричности.
- Метод должен быть согласованным - многократные вызовы с неизменными объектами должны возвращать один и тот же результат.
- Если x.equals(y) вернёт true, то x.hashCode() должен быть равен y.hashCode().
- Метод не должен выбрасывать исключения при сравнении допустимых значений.
Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
- Метод должен быть согласованным - многократные вызовы с неизменными объектами должны возвращать один и тот же результат.
- Если x.equals(y) вернёт true, то x.hashCode() должен быть равен y.hashCode().
- Метод не должен выбрасывать исключения при сравнении допустимых значений.
👍27
PreferencesFactory
Интерфейс
Он предоставляет два метода:
Поставщики новых реализаций
#для_продвинутых
Интерфейс
PreferencesFactory используется для создания объектов Preferences. Он предоставляет два метода:
systemRoot(): Возвращает корневой узел предпочтений системы.userRoot(): Возвращает корневой узел предпочтений пользователя, вызвавшего метод.Поставщики новых реализаций
Preferences должны предоставлять соответствующие реализации PreferencesFactory, чтобы их можно было установить вместо реализации по умолчанию, зависящей от платформы.#для_продвинутых
👍9
AtomicStampedReference
Что такое атомарный доступ?
Атомарный доступ означает, что операции чтения и записи выполняются целиком, без промежуточных состояний. Это гарантирует, что другие потоки не смогут увидеть частично обновленное значение.
#для_продвинутых
AtomicStampedReference — это класс в Java, который используется для обеспечения атомарного доступа к ссылке на объект и целочисленному «штампу».Что такое атомарный доступ?
Атомарный доступ означает, что операции чтения и записи выполняются целиком, без промежуточных состояний. Это гарантирует, что другие потоки не смогут увидеть частично обновленное значение.
#для_продвинутых
👍12
therapi-runtime-javadoc - небольшая библиотека, позволяющая читать Javadoc из Java-кода во время выполнения.
https://github.com/dnault/therapi-runtime-javadoc
https://github.com/dnault/therapi-runtime-javadoc
👍10
😱6👍4😢3
unmodifiableMap
UnmodifiableMap используется для создания неизменяемого представления отображения, это позволяет предоставить доступ к отображению, не давая возможности изменить его.
Как видно из примера, при попытке изменить неизменяемое отображение
UnmodifiableMap используется для создания неизменяемого представления отображения, это позволяет предоставить доступ к отображению, не давая возможности изменить его.
Как видно из примера, при попытке изменить неизменяемое отображение
unmodifiableMap выбрасывается исключение UnsupportedOperationException. Это гарантирует, что исходное отображение не будет случайно изменено.👍11
charBuffer
Метод charBuffer() используется для получения буфера символов из строки. Он принадлежит классу
Этот метод возвращает объект
В этом примере создается строка "Hello". Затем из этой строки получаем буфер символов методом
В цикле посимвольно читаем из буфера символы и выводим их на экран.
Метод charBuffer() используется для получения буфера символов из строки. Он принадлежит классу
String.Этот метод возвращает объект
CharBuffer, который представляет последовательность символов строки.CharBuffer позволяет эффективно читать и манипулировать символами строки без создания копий.В этом примере создается строка "Hello". Затем из этой строки получаем буфер символов методом
charBuffer().В цикле посимвольно читаем из буфера символы и выводим их на экран.
👍14❤3
Зачем нужны и какие бывают блоки инициализации?
Блоки инициализации представляют собой код, заключенный в фигурные скобки и размещаемый внутри класса вне объявления методов или конструкторов.
• Существуют статические и нестатические блоки инициализации.
• Блок инициализации выполняется перед инициализацией класса загрузчиком классов или созданием объекта класса с помощью конструктора.
• Несколько блоков инициализации выполняются в порядке следования в коде класса.
• Блок инициализации способен генерировать исключения, если их объявления перечислены в
• Блок инициализации возможно создать и в анонимном классе.
Блоки инициализации представляют собой код, заключенный в фигурные скобки и размещаемый внутри класса вне объявления методов или конструкторов.
• Существуют статические и нестатические блоки инициализации.
• Блок инициализации выполняется перед инициализацией класса загрузчиком классов или созданием объекта класса с помощью конструктора.
• Несколько блоков инициализации выполняются в порядке следования в коде класса.
• Блок инициализации способен генерировать исключения, если их объявления перечислены в
throws всех конструкторов класса.• Блок инициализации возможно создать и в анонимном классе.
👍19
Класс java.util.Date
Класс java.util.Date представляет дату и время.
Конструкторы
Методы
Методы как
Методы
Класс java.util.Date представляет дату и время.
Date хранит дату и время в миллисекундах с 1 января 1970 года 00:00:00 по UTC.Конструкторы
Date() и Date(long date) позволяют создать объект Date с текущей датой/временем или указанной датой/временем в миллисекундах.Методы
getTime() и setTime(long time) позволяют получить и установить время в миллисекундах.Методы как
getDay(), getMonth() и т. д. позволяют получить отдельные компоненты даты/времени.Методы
before() и after() позволяют сравнивать даты.👍8🤔2
Чем полезны неизменяемые объекты?
Неизменяемость (
Неизменяемость (
immutability) помогает облегчить написание многопоточного кода. Неизменяемый объект может быть использован без какой-либо синхронизации. К сожалению, в Java нет аннотации @Immutable, которая делает объект неизменяемым, для этого разработчикам нужно самим создавать класс с необходимыми характеристиками. Для этого необходимо следовать некоторым общим принципам: инициализация всех полей только в конструкторе, отсутствие методов setX() вносящих изменения в поля класса, отсутствие утечек ссылки, организация отдельного хранилища копий изменяемых объектов и т.д.👍18
Для чего нужен метод hashCode()?
Метод
• если хэш коды разные, то и объекты гарантированно разные;
• если хэш коды равны, то объекты могут не обязательно равны.
Метод
hashCode() необходим для вычисления хэш кода переданного в качестве входного параметра объекта. В Java это целое число, в более широком смысле - битовая строка фиксированной длины, полученная из массива произвольной длины. Этот метод реализован таким образом, что для одного и того же входного объекта, хэш код всегда будет одинаковым. Следует понимать, что в Java множество возможных хэш кодов ограничено типом int, а множество объектов ничем не ограничено. Из-за этого, вполне возможна ситуация, что хэш коды разных объектов могут совпасть:• если хэш коды разные, то и объекты гарантированно разные;
• если хэш коды равны, то объекты могут не обязательно равны.
👍13
Что такое тернарный оператор выбора?
Тернарный условный оператор ?: - оператор, которым можно заменить некоторые конструкции операторов if-then-else.
Выражение записывается в следующей форме:
Тернарный условный оператор ?: - оператор, которым можно заменить некоторые конструкции операторов if-then-else.
Выражение записывается в следующей форме:
условие ? выражение1 : выражение2Если условие выполняется, то вычисляется выражение1 и его результат становится результатом выполнения всего оператора. Если же условие равно false, то вычисляется выражение2 и его значение становится результатом работы оператора. Оба операнда выражение1 и выражение2 должны возвращать значение одинакового (или совместимого) типа.
👍23
Collections.emptyList()
Collections.emptyList() возвращает пустой неизменяемый список.
Это статический фабричный метод из класса
Основные моменты:
— Возвращает пустой список, а не
— Список неизменяемый (
— Работает быстрее, чем создание нового списка через
— Может использоваться как значение по умолчанию или стартовое значение для списка.
Collections.emptyList() возвращает пустой неизменяемый список.
Это статический фабричный метод из класса
Collections, который возвращает пустой список типа List<Object>.Основные моменты:
— Возвращает пустой список, а не
null. Это полезно, чтобы избежать проверок на null.— Список неизменяемый (
immutable). Нельзя добавлять или удалять элементы из него.— Работает быстрее, чем создание нового списка через
new ArrayList().— Может использоваться как значение по умолчанию или стартовое значение для списка.
👍22
unmodifiableList
unmodifiableList используется для создания неизменяемого списка на основе другого списка.
Это позволяет вернуть неизменяемую обертку вокруг модифицируемого списка, чтобы предотвратить случайные изменения этого списка.
Созданный список нельзя изменить: нельзя добавлять/удалять элементы, изменять их, иначе будет выброшено исключение.
В примере на основе
unmodifiableList используется для создания неизменяемого списка на основе другого списка.
Это позволяет вернуть неизменяемую обертку вокруг модифицируемого списка, чтобы предотвратить случайные изменения этого списка.
Созданный список нельзя изменить: нельзя добавлять/удалять элементы, изменять их, иначе будет выброшено исключение.
В примере на основе
mutableList создан неизменяемый список. Попытка изменить его выбросит исключение, но изменения в mutableList отразятся в immutableList.👍15
#вопросы_с_собеседований
Что такое Executor?
Executor — это интерфейс, который позволяет запускать задачи асинхронно. Используется вместе с интерфейсами Callable и Future для асинхронного выполнения задач.
Он определяет единственный метод execute(), который принимает объект Runnable с задачей для выполнения.
Интерфейс позволяет отделить логику создания и запуска потоков от самих задач.
Потоки создаются заранее и хранятся в пуле, а задачи просто отправляются на выполнение через execute().
Это дает выигрыш в производительности, т. к. исключает накладные расходы на создание новых потоков.
Что такое Executor?
Он определяет единственный метод execute(), который принимает объект Runnable с задачей для выполнения.
Интерфейс позволяет отделить логику создания и запуска потоков от самих задач.
Потоки создаются заранее и хранятся в пуле, а задачи просто отправляются на выполнение через execute().
Это дает выигрыш в производительности, т. к. исключает накладные расходы на создание новых потоков.
👍14