Java Learning
18.8K subscribers
1.61K photos
1 video
3 files
986 links
№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.iss.one/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Download Telegram
Методы start и end

Выше представлен пример, в котором производится подсчет количества раз, когда в строке ввода встречается слово "кот".

Как видим, в данном примере используются границы слов с целью удостоверения в том, что буквы "c" "a" "t" не являются частью другого слова. Также отображаются определенные полезные сведения касательно нахождения совпадения в вводимой строке.

Метод start производит возврат начального индекса в последовательности, захваченной в данной группе в ходе предыдущей операции поиска совпадений, а end производит возврат индекса к последнему совпавшему символу, плюс один.
👍16
Преобразование массива в строку

Да да да, я знаю, что есть такие методы как Arrays.toString() и String.join() в Java. Но давайте все-таки рассмотрим еще один метод преобразования массива в строку

В этом примере мы используем Stream API, представленный в JDK 8. Arrays.strеam() принимает массив. Метод collect() возвращает результат после выполнения указанной операции над каждым элементом массива.

Здесь мы выполняем операцию Collectors.joining() над элементами массива, которая собирает элементы и объединяет их для возврата в виде целой строки.
👍18😢3
Конструктор по умолчанию в Java

Как и C++, Java автоматически создает конструктор по умолчанию, если нет конструктора по умолчанию или параметризованного конструктора, написанного программистом. А также как и в C++ конструктор по умолчанию автоматически вызывает родительский конструктор по умолчанию.

Но, в отличие от C++, конструктор по умолчанию в Java инициализирует члены класса значениями по умолчанию (числовые значения инициализируются как 0, логические значения инициализируются как false, а ссылки инициализируются как null).
👍27🔥1
Что такое ThreadLocal-переменная?

ThreadLocal - класс, позволяющий имея одну переменную, иметь различное её значение для каждого из потоков.

У каждого потока - т.е. экземпляра класса Thread - есть ассоциированная с ним таблица ThreadLocal-переменных. Ключами таблицы являются cсылки на объекты класса ThreadLocal, а значениями - ссылки на объекты, «захваченные» ThreadLocal-переменными, т.е. ThreadLocal-переменные отличаются от обычных переменных тем, что у каждого потока свой собственный, индивидуально инициализируемый экземпляр переменной. Доступ к значению можно получить через методы get() или set().

Например, если мы объявим ThreadLocal-переменную: ThreadLocal<Object> locals = new ThreadLocal<Object>();. А затем, в потоке, сделаем locals.set(myObject), то ключом таблицы будет ссылка на объект locals, а значением - ссылка на объект myObject. При этом для другого потока существует возможность «положить» внутрь locals другое значение.

Следует обратить внимание, что ThreadLocal изолирует именно ссылки на объекты, а не сами объекты. Если изолированные внутри потоков ссылки ведут на один и тот же объект, то возможны коллизии.

Так же важно отметить, что т.к. ThreadLocal-переменные изолированы в потоках, то инициализация такой переменной должна происходить в том же потоке, в котором она будет использоваться. Ошибкой является инициализация такой переменной (вызов метода set()) в главном потоке приложения, потому как в данном случае значение, переданное в методе set(), будет «захвачено» для главного потока, и при вызове метода get() в целевом потоке будет возвращен null.
👍14
#Вопросы_с_собеседования

Сколько времени займет получение элемента из связного списка? Из бинарного дерева поиска? Или из хэш-таблицы? А если в этих структурах будет миллион записей?

Из хэш-таблицы можно получить элемент за константное время, из бинарного дерева — за логарифмическое, из связного списка — за линейное. Количество элементов не влияет на асимптотику структуры данных, если всё идет как надо: в хэш-таблице либо нет, либо очень мало коллизий, а бинарное дерево сбалансировано. Иначе с ростом количества элементов производительность будет только уменьшаться.
👍12
#Вопросы_с_собеседования

Для чего нужен Component Scan?

Если вы понимаете как работает Component Scan, то вы понимаете Spring

Первый шаг для описания Spring Beans это добавление аннотации — @Component, или @Service, или @Repository.

Однако, Spring ничего не знает об этих бинах, если он не знает где искать их. То, что скажет Spring где искать эти бины и называется Component Scan. В @ComponentScan вы указываете пакеты, которые должны сканироваться.

Spring будет искать бины не только в пакетах для сканирования, но и в их подпакетах.
👍26
Что будет выведено в консоль в первую очередь?
Anonymous Quiz
24%
Ошибка компиляции
16%
Grandpa went fishing
15%
Daddy went to the garage
16%
I went school
29%
Ничего
👍14😢2
#Вопросы_с_собеседования

Почему в некоторых интерфейсах вообще не определяют методов?

Это так называемые маркерные интерфейсы. Они просто указывают что класс относится к определенному типу.

Примером может послужить интерфейс Clonable, который указывает на то, что класс поддерживает механизм клонирования.
👍17🤔3😱2
😱2🤔1
Что выведет программа?
Anonymous Quiz
62%
Hello (бесконечно)
19%
Compiler Error
11%
Hello (5 раз)
8%
Hi
👍20🤔7🔥3
#Вопросы_с_собеседования

Почему char[] предпочтительнее String для хранения пароля?

С момента создания строка остаётся в пуле, до тех пор, пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста. В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.
👍52😱3
#Вопросы_с_собеседования

Что обозначает ключевое слово transient?

Поля класса, помеченные модификатором transient, не сериализуются.

Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.
👍15
#вопросы_с_собеседований
Что такое трассировка стека (stacktrace) и как она связана с исключением?

Трассировка стека предоставляет имена классов и методов, которые были вызваны, от запуска приложения до момента возникновения исключения.

Это очень полезный инструмент отладки, поскольку он позволяет нам точно определить, где именно в приложении было сгенерировано исключение, и первоначальные причины, которые привели к нему.
👍18
#Вопросы_с_собеседования

Как одной строчкой скопировать элементы любой collection в массив?

Ответ на картинке.
👍23
JEP-400 или UTF-8 РєРѕРґРёСЂРѕРІРєР° РїРѕ умолчанию

Не прошло и пяти лет, как в Java 18 докатилось небольшое, но очень ожидаемое и обсуждаемое изменение. Теперь во всех стандартных API используется UTF-8 кодировка по умолчанию. Это изменение, которое сделает выражение «Write once, run anywhere» действительно правдой, так как теперь поведение приложения будет еще меньше зависеть от системы, где оно запущено.

Смотреть статью
👍12😱4
Метод trim()

Возвращает копию данной строки, в которой удаляются начальные и конечные пробелы, или данную строку, если она не имеет начальных или конечных пробелов.
👍30😱51
Проверяем наличие дубликатов в массиве в Java

Мы можем работать лучше, используя Хеширование. Идея состоит в том, чтобы пройти по заданному массиву и вставить каждый встреченный элемент в HashSet. Теперь, если встреченный элемент уже присутствовал в наборе, он является дубликатом. Временная сложность этого решения O(n) но вспомогательное пространство используется O(n).

Мы знаем это HashSet не допускает дублирования значений в нем. Мы можем использовать это свойство для проверки дубликатов в массиве. Идея состоит в том, чтобы вставить все элементы массива в HashSet. Теперь массив содержит дубликат, если длина массива не равна размеру набора.

Другие способы проверить массив на дубликаты можно найти здесь.
👍172🔥1😱1
Перегрузка в Java

Рассмотрим работу перегрузки методов в Java. Что, если передавать в функцию аргумент, который не вполне соответствует определенным нами аргументам по типу? На этом этапе возможны два исхода.
1. Произойдет преобразование типа, но в более высокий тип (с точки зрения диапазона) в том же семействе.
2. Произойдет преобразование типа в следующее более старшее семейство (предположим, что если нет типа данных long, доступного для типа данных int, тогда будет поиск типа данных с плавающей запятой).
👍172