В чем отличия между TreeSet и HashSet?
Основное отличие между
👉 @java_geek
Основное отличие между
TreeSet
и HashSet
заключается в том, что TreeSet
хранит элементы в отсортированном порядке, в то время как порядок хранения элементов в HashSet
не определен. TreeSet
также обеспечивает быстрый поиск и извлечение элементов в отсортированном порядке.👉 @java_geek
Apache Commons CLI
Apache Commons CLI (Commons Command Line Interface) — это библиотека для обработки аргументов командной строки в Java. Она предоставляет удобный способ определения и обработки аргументов командной строки для ваших Java-приложений. Библиотека Apache Commons CLI упрощает работу с аргументами командной строки, включая разбор аргументов, создание справки и обработку различных опций командной строки.
👉 @java_geek
Apache Commons CLI (Commons Command Line Interface) — это библиотека для обработки аргументов командной строки в Java. Она предоставляет удобный способ определения и обработки аргументов командной строки для ваших Java-приложений. Библиотека Apache Commons CLI упрощает работу с аргументами командной строки, включая разбор аргументов, создание справки и обработку различных опций командной строки.
👉 @java_geek
Реверс массива
Реверс массива в Java означает изменение порядка элементов массива на противоположный. То есть, элементы, которые изначально были в начале массива, становятся в конце, и наоборот.
Реверс массива может быть полезным во многих ситуациях программирования. Например, это может потребоваться для изменения порядка элементов перед их обработкой или выводом, или для выполнения действий, которые требуют доступа к элементам массива в обратном порядке.
👉 @java_geek
Реверс массива в Java означает изменение порядка элементов массива на противоположный. То есть, элементы, которые изначально были в начале массива, становятся в конце, и наоборот.
Реверс массива может быть полезным во многих ситуациях программирования. Например, это может потребоваться для изменения порядка элементов перед их обработкой или выводом, или для выполнения действий, которые требуют доступа к элементам массива в обратном порядке.
👉 @java_geek
Какие классы поддерживают чтение и запись потоков в компрессированном формате?
В Java для работы с потоками в сжатом формате используются классы из пакета
ZipInputStream и ZipOutputStream — для чтения и записи архивов в формате ZIP.
GZIPInputStream и GZIPOutputStream — для чтения и записи файлов в формате GZIP.
InflaterInputStream и DeflaterOutputStream — для чтения и записи данных в формате ZLIB.
Эти классы являются обертками потоков ввода/вывода и позволяют прозрачно читать и записывать сжатые данные, как если бы речь шла о обычных потоках.
👉 @java_geek
В Java для работы с потоками в сжатом формате используются классы из пакета
java.util.zip
:ZipInputStream и ZipOutputStream — для чтения и записи архивов в формате ZIP.
GZIPInputStream и GZIPOutputStream — для чтения и записи файлов в формате GZIP.
InflaterInputStream и DeflaterOutputStream — для чтения и записи данных в формате ZLIB.
Эти классы являются обертками потоков ввода/вывода и позволяют прозрачно читать и записывать сжатые данные, как если бы речь шла о обычных потоках.
👉 @java_geek
charBuffer
Метод
Этот метод возвращает объект
В этом примере создается строка «Hello». Затем из этой строки получаем буфер символов методом
В цикле посимвольно читаем из буфера символы и выводим их на экран.
👉 @java_geek
Метод
charBuffer()
используется для получения буфера символов из строки. Он принадлежит классу String.Этот метод возвращает объект
CharBuffer
, который представляет последовательность символов строки.CharBuffer
позволяет эффективно читать и манипулировать символами строки без создания копий.В этом примере создается строка «Hello». Затем из этой строки получаем буфер символов методом
charBuffer()
.В цикле посимвольно читаем из буфера символы и выводим их на экран.
👉 @java_geek
Что выведет код сверху?
Ответ: Not equal. Переменная real не равна самой себе. Арифметика с плавающей запятой реализована в соответствии со стандартом IEEE 754, который требует возвращения специального значения «NaN» (от английского «Not a Number» — не число), когда ноль делится на ноль. В спецификации также указано, что NaN не равно никакому значению с плавающей запятой, включая само себя.
👉 @java_geek
Ответ: Not equal. Переменная real не равна самой себе. Арифметика с плавающей запятой реализована в соответствии со стандартом IEEE 754, который требует возвращения специального значения «NaN» (от английского «Not a Number» — не число), когда ноль делится на ноль. В спецификации также указано, что NaN не равно никакому значению с плавающей запятой, включая само себя.
👉 @java_geek
Почему метод clone() объявлен в классе Object, а не в интерфейсе Cloneable?
Метод
👉 @java_geek
Метод
clone()
объявлен в классе Object
с указанием модификатора native
, чтобы обеспечить доступ к стандартному механизму поверхностного копирования объектов. Одновременно он объявлен и как protected
, чтобы нельзя было вызвать этот метод у не переопределивших его объектов. Непосредственно интерфейс Cloneable
является маркерным (не содержит объявлений методов) и нужен только для обозначения самого факта, что данный объект готов к тому, чтобы быть клонированным. Вызов переопределённого метода clone()
у не Cloneable
объекта вызовет выбрасывание CloneNotSupportedException
.👉 @java_geek
Что такое абстрактные классы?
Абстрактные классы — это классы, которые не могут быть инстанциированы напрямую, то есть нельзя создать объект абстрактного класса при помощи оператора new. Они предназначены для обеспечения базовой структуры и функциональности для других классов, которые наследуются от них. Абстрактные классы представляют собой в некотором роде «заготовки» для подклассов, указывая на общие атрибуты и методы, которые они должны реализовать.
👉 @java_geek
Абстрактные классы — это классы, которые не могут быть инстанциированы напрямую, то есть нельзя создать объект абстрактного класса при помощи оператора new. Они предназначены для обеспечения базовой структуры и функциональности для других классов, которые наследуются от них. Абстрактные классы представляют собой в некотором роде «заготовки» для подклассов, указывая на общие атрибуты и методы, которые они должны реализовать.
👉 @java_geek
Что такое «абстракция»?
Абстрагирование — это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция — это набор всех таких характеристик.
Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерёнок в коробке передач или влияния формы кузова на скорость (разве что, автомобиль стоит в глухой пробке и водителю абсолютно нечем заняться). Однако, руль, педали, указатель поворота он будет использовать регулярно.
👉 @java_geek
Абстрагирование — это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция — это набор всех таких характеристик.
Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерёнок в коробке передач или влияния формы кузова на скорость (разве что, автомобиль стоит в глухой пробке и водителю абсолютно нечем заняться). Однако, руль, педали, указатель поворота он будет использовать регулярно.
👉 @java_geek
Что такое ключевое слово final и где его использовать?
Ключевое слово final можно использовать для переменных, методов и классов.
1. final переменную нельзя переназначить на другой объект.
2. final класс бесплоден, у него не может быть наследников.
3. final метод не может быть переопределен у предка.
Пробежали по верхам, теперь обсудим более подробно final переменные. Java даёт нам два способа создать переменную и присвоить ей некоторое значение:
1. Можно объявить переменную и инициализировать ее позже.
2. Можно объявить переменную и сразу же назначить ее.
Пример с использованием final переменной для этих случаев приведен выше на картинке.
👉 @java_geek
Ключевое слово final можно использовать для переменных, методов и классов.
1. final переменную нельзя переназначить на другой объект.
2. final класс бесплоден, у него не может быть наследников.
3. final метод не может быть переопределен у предка.
Пробежали по верхам, теперь обсудим более подробно final переменные. Java даёт нам два способа создать переменную и присвоить ей некоторое значение:
1. Можно объявить переменную и инициализировать ее позже.
2. Можно объявить переменную и сразу же назначить ее.
Пример с использованием final переменной для этих случаев приведен выше на картинке.
👉 @java_geek
ConcurrentSkipListSet
ConcurrentSkipListSet — это thread-safe реализация отсортированного множества на основе skip list.
Элементы в нем хранятся в сбалансированной иерархии, похожей на связный список и дубликаты не допускаются, также поддерживает unicity элементов.
Автоматически сортирует элементы по естественному порядку или компаратору. Все основные методы потокобезопасны из коробки.
Подходит для частого добавления/удаления/поиска элементов из разных потоков. Масштабируется лучше чем synchronized Set при увеличении количества потоков.
ConcurrentSkipListSet используется в многопоточных приложениях для хранения уникальных элементов в отсортированном порядке, выполнения быстрых операций поиска, добавления, удаления за время O(log n), избежания проблем синхронизации.
👉 @java_geek
ConcurrentSkipListSet — это thread-safe реализация отсортированного множества на основе skip list.
Элементы в нем хранятся в сбалансированной иерархии, похожей на связный список и дубликаты не допускаются, также поддерживает unicity элементов.
Автоматически сортирует элементы по естественному порядку или компаратору. Все основные методы потокобезопасны из коробки.
Подходит для частого добавления/удаления/поиска элементов из разных потоков. Масштабируется лучше чем synchronized Set при увеличении количества потоков.
ConcurrentSkipListSet используется в многопоточных приложениях для хранения уникальных элементов в отсортированном порядке, выполнения быстрых операций поиска, добавления, удаления за время O(log n), избежания проблем синхронизации.
👉 @java_geek
Существуют ли ситуации, когда блок finally не будет выполнен?
Ответ:
Например, когда JVM «умирает» - в такой ситуации finally недостижим и не будет выполнен, так как происходит принудительный системный выход из программы.
👉 @java_geek
Ответ:
Например, когда JVM «умирает» - в такой ситуации finally недостижим и не будет выполнен, так как происходит принудительный системный выход из программы.
👉 @java_geek
ForkJoinPool
Это класс, введенный в JDK 7, который представляет собой специализированный пул потоков, предназначенный для параллельного выполнения рекурсивных задач.
ForkJoinPool автоматически управляет созданием и использованием потоков для выполнения подзадач и обеспечивает эффективное распределение работы между ними.
Принцип работы основан на делении большой задачи на более мелкие подзадачи и их последующем объединении для получения результата. Каждая подзадача может быть выполнена независимо друг от друга, что позволяет эффективно использовать доступные ресурсы процессора.
👉 @java_geek
Это класс, введенный в JDK 7, который представляет собой специализированный пул потоков, предназначенный для параллельного выполнения рекурсивных задач.
ForkJoinPool автоматически управляет созданием и использованием потоков для выполнения подзадач и обеспечивает эффективное распределение работы между ними.
Принцип работы основан на делении большой задачи на более мелкие подзадачи и их последующем объединении для получения результата. Каждая подзадача может быть выполнена независимо друг от друга, что позволяет эффективно использовать доступные ресурсы процессора.
👉 @java_geek
Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)?
Для этого в LinkedList есть обратный итератор, который можно получить, вызвав метод
👉 @java_geek
Для этого в LinkedList есть обратный итератор, который можно получить, вызвав метод
descendingIterator()
.👉 @java_geek
Как устроен HashMap?
HashMap состоит из «корзин» (bucket). С технической точки зрения «корзины» — это элементы массива, которые хранят ссылки на списки элементов. При добавлении новой пары «ключ-значение» вычисляет хэш-код ключа, на основании которого вычисляется номер корзины (номер ячейки массива), в которую попадет новый элемент. Если корзина пустая, то в нее сохраняется ссылка на вновь добавляемый элемент, если же там уже есть элемент, то происходит последовательный переход по ссылкам между элементами в цепочке, в поисках последнего элемента, от которого и ставится ссылка на вновь добавленный элемент. Если в списке был найден элемент с таким же ключом, то он заменяется.
👉 @java_geek
HashMap состоит из «корзин» (bucket). С технической точки зрения «корзины» — это элементы массива, которые хранят ссылки на списки элементов. При добавлении новой пары «ключ-значение» вычисляет хэш-код ключа, на основании которого вычисляется номер корзины (номер ячейки массива), в которую попадет новый элемент. Если корзина пустая, то в нее сохраняется ссылка на вновь добавляемый элемент, если же там уже есть элемент, то происходит последовательный переход по ссылкам между элементами в цепочке, в поисках последнего элемента, от которого и ставится ссылка на вновь добавленный элемент. Если в списке был найден элемент с таким же ключом, то он заменяется.
👉 @java_geek
Что значит «усыпить» поток?
Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод
👉 @java_geek
Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод
Thread.sleep()
передав в качестве параметра необходимое количество времени в миллисекундах. До истечения этого времени поток может быть выведен из состояния ожидания вызовом interrupt()
с выбрасыванием InterruptedException
.👉 @java_geek
Что такое класс Object? Какие в нем есть методы?
👉 @java_geek
Object
— это базовый класс для всех остальных объектов в Java. Любой класс наследуется от Object и, соответственно, наследуют его методы:public boolean equals(Object obj)
— служит для сравнения объектов по значению;int hashCode()
— возвращает hash код для объекта;String toString()
— возвращает строковое представление объекта;Class getClass()
— возвращает класс объекта во время выполнения;protected Object clone()
— создает и возвращает копию объекта;void notify()
— возобновляет поток, ожидающий монитор;void notifyAll()
— возобновляет все потоки, ожидающие монитор;void wait()
— остановка вызвавшего метод потока до момента пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;void wait(long timeout)
— остановка вызвавшего метод потока на определённое время или пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;void wait(long timeout, int nanos)
— остановка вызвавшего метод потока на определённое время или пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;protected void finalize()
— может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.👉 @java_geek
Может ли статический метод быть переопределён или перегружен?
Перегружен — да. Всё работает точно так же, как и с обычными методами — 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён — нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода — это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.
👉 @java_geek
Перегружен — да. Всё работает точно так же, как и с обычными методами — 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён — нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода — это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.
👉 @java_geek
Что такое сигнатура метода?
Сигнатура метода — это уникальная комбинация имени метода и списка его параметров. Сигнатура метода определяет, какие аргументы должны быть переданы методу при его вызове.
Сигнатура метода используется для определения перегрузки методов. Два или более метода считаются перегруженными, если они имеют одинаковое имя, но разные сигнатуры. То есть они принимают разные наборы параметров.
Важно отметить, что сигнатура метода не включает в себя возвращаемый тип и модификаторы доступа.
👉 @java_geek
Сигнатура метода — это уникальная комбинация имени метода и списка его параметров. Сигнатура метода определяет, какие аргументы должны быть переданы методу при его вызове.
Сигнатура метода используется для определения перегрузки методов. Два или более метода считаются перегруженными, если они имеют одинаковое имя, но разные сигнатуры. То есть они принимают разные наборы параметров.
Важно отметить, что сигнатура метода не включает в себя возвращаемый тип и модификаторы доступа.
👉 @java_geek
Может ли имя класса не совпадать с именем файла?
Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.
Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.
Так что ответ — может.
👉 @java_geek
Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.
Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.
Так что ответ — может.
👉 @java_geek
Что такое Java Virtual Machine (JVM)? Как она работает?
Java Virtual Machine (JVM) — это среда выполнения, которая позволяет выполнять Java-приложения на любой платформе, где установлена JVM. Она является ключевым компонентом технологии Java, так как обеспечивает портативность и независимость Java-кода от конкретной операционной системы.
JVM принимает скомпилированный Java-код (байт-код) и интерпретирует его в машинный код на конкретной платформе. Он выполняет множество задач, включая загрузку классов, управление памятью, выполнение потоков, оптимизацию кода и т. д.
Когда Java-приложение выполняется на JVM, оно получает доступ к богатому набору библиотек Java, которые предоставляют множество готовых классов и методов для решения различных задач. Благодаря JVM Java считается одним из самых надежных и масштабируемых языков программирования.
👉 @java_geek
Java Virtual Machine (JVM) — это среда выполнения, которая позволяет выполнять Java-приложения на любой платформе, где установлена JVM. Она является ключевым компонентом технологии Java, так как обеспечивает портативность и независимость Java-кода от конкретной операционной системы.
JVM принимает скомпилированный Java-код (байт-код) и интерпретирует его в машинный код на конкретной платформе. Он выполняет множество задач, включая загрузку классов, управление памятью, выполнение потоков, оптимизацию кода и т. д.
Когда Java-приложение выполняется на JVM, оно получает доступ к богатому набору библиотек Java, которые предоставляют множество готовых классов и методов для решения различных задач. Благодаря JVM Java считается одним из самых надежных и масштабируемых языков программирования.
👉 @java_geek