Что такое «зелёные потоки» и есть ли они в Java?
Виртуальная машина
Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем
Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один
Начиная с версии
Зелёные (легковесные) потоки(green threads) - потоки эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.Виртуальная машина
Java берёт на себя заботу о переключении между разными green threads, а сама машина работает как один поток ОС. Это даёт несколько преимуществ. Потоки ОС относительно дороги в большинстве POSIX-систем. Кроме того, переключение между native threads гораздо медленнее, чем между green threads.Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем
native threads. Система может поддерживать гораздо большее количество green threads, чем потоков OС. Например, гораздо практичнее запускать новый green thread для нового HTTP-соединения к веб-серверу, вместо создания нового native thread.Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один
native thread, только он и вызывается планировщиком ОС. Даже если у вас несколько процессоров и несколько green threads, только один процессор может вызывать green thread. И всё потому, что с точки зрения планировщика заданий ОС всё это выглядит одним потоком.Начиная с версии
1.2 Java поддерживает native threads, и с тех пор они используются по умолчанию.👍13
#вопросы_с_собеседований
Можно ли так реализовать метод equals?
Нельзя, так как метод hashCode() не гарантирует уникальность значения для каждого объекта.
Но для сравнения экземпляров объекта
Можно ли так реализовать метод equals?
Нельзя, так как метод hashCode() не гарантирует уникальность значения для каждого объекта.
Но для сравнения экземпляров объекта
Object такой метод допустим, так как там хешкод вычисляется на основании использовании адреса объекта в памяти, поэтому он уникален для разных объектов.👍15🔥2
Какой результат выдаст следующая программа?
Anonymous Quiz
4%
Hello
33%
Hello world
13%
Программа уйдет в бесконечный цикл
45%
Программа не скомпилируется
5%
Узнать ответ
👍30😢7
В чём заключается различие между методами submit() и execute() у пула потоков?
Оба метода являются способами подачи задачи в пул потоков, но между ними есть небольшая разница.
Оба метода являются способами подачи задачи в пул потоков, но между ними есть небольшая разница.
execute(Runnable command) определён в интерфейсе Executor и выполняет поданную задачу и ничего не возвращает.submit() – перегруженный метод, определённый в интерфейсе ExecutorService. Способен принимать задачи типов Runnable и Callable и возвращать объект Future, который можно использовать для контроля и управления процессом выполнения, получения его результата.👍18
new vs valueOf
Старайтесь всегда использовать метод
Все оболочки, кроме чисел с плавающей точкой, от Byte до Long, имеют кэш. По умолчанию этот кэш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кэша. Значение из кэша достается в 3.5 раза быстрее, чем при использовании конструктора, плюс идёт экономия памяти.
Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной.
Старайтесь всегда использовать метод
valueOf вместо конструктора в стандартных классах-оболочках примитивных типов, кроме тех случаев, когда вам нужно конкретно выделить память под новое значение. Сейчас объясню, почему.Все оболочки, кроме чисел с плавающей точкой, от Byte до Long, имеют кэш. По умолчанию этот кэш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кэша. Значение из кэша достается в 3.5 раза быстрее, чем при использовании конструктора, плюс идёт экономия памяти.
Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной.
👍44❤2
Сборщик мусора (Garbage Collector) должен делать всего две вещи:
☕️ Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
☕️ Освобождать память от мусора.
Существуют два подхода к обнаружению мусора:
☕️ Reference counting;
☕️ Tracing.
Reference counting (подсчёт ссылок). Суть этого подхода состоит в том, что каждый объект имеет счетчик. Счетчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счетчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором. Главным минусом такого подхода является сложность обеспечения точности счетчика. Также при таком подходе сложно выявлять циклические зависимости (когда два объекта указывают друг на друга, но ни один живой объект на них не ссылается), что приводит к утечкам памяти.
Главная идея подхода Tracing (трассировка) состоит в утверждении, что живыми могут считаться только те объекты, до которых мы можем добраться из корневых точек (GC Root) и те объекты, которые доступны с живого объекта. Всё остальное - мусор.
Существует 4 типа корневых точки:
☕️ Локальные переменные и параметры методов;
☕️ Потоки;
☕️ Статические переменные;
☕️ Ссылки из JNI.
Самое простое java приложение будет иметь корневые точки:
☕️ Локальные переменные внутри main() метода и параметры main() метода;
☕️ Поток, который выполняет main();
☕️ Статические переменные класса, внутри которого находится main() метод.
Таким образом, если мы представим все объекты и ссылки между ними как дерево, то нам нужно будет пройти с корневых узлов (точек) по всем рёбрам. При этом узлы, до которых мы сможем добраться - не мусор, все остальные - мусор. При таком подходе циклические зависимости легко выявляются. HotSpot VM использует именно такой подход.
☕️ Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
☕️ Освобождать память от мусора.
Существуют два подхода к обнаружению мусора:
☕️ Reference counting;
☕️ Tracing.
Reference counting (подсчёт ссылок). Суть этого подхода состоит в том, что каждый объект имеет счетчик. Счетчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счетчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором. Главным минусом такого подхода является сложность обеспечения точности счетчика. Также при таком подходе сложно выявлять циклические зависимости (когда два объекта указывают друг на друга, но ни один живой объект на них не ссылается), что приводит к утечкам памяти.
Главная идея подхода Tracing (трассировка) состоит в утверждении, что живыми могут считаться только те объекты, до которых мы можем добраться из корневых точек (GC Root) и те объекты, которые доступны с живого объекта. Всё остальное - мусор.
Существует 4 типа корневых точки:
☕️ Локальные переменные и параметры методов;
☕️ Потоки;
☕️ Статические переменные;
☕️ Ссылки из JNI.
Самое простое java приложение будет иметь корневые точки:
☕️ Локальные переменные внутри main() метода и параметры main() метода;
☕️ Поток, который выполняет main();
☕️ Статические переменные класса, внутри которого находится main() метод.
Таким образом, если мы представим все объекты и ссылки между ними как дерево, то нам нужно будет пройти с корневых узлов (точек) по всем рёбрам. При этом узлы, до которых мы сможем добраться - не мусор, все остальные - мусор. При таком подходе циклические зависимости легко выявляются. HotSpot VM использует именно такой подход.
👍19🔥2❤1
#вопросы_с_собеседований Spring
Что подразумевается под конфигурацией контейнера на основе аннотаций?
Вместо использования XML для описания связывания компонента разработчик перемещает конфигурацию в сам класс компонента, используя аннотации в соответствующем объявлении класса, метода или поля. Это работает как альтернатива настройкам XML. Пример на картинке.
Что подразумевается под конфигурацией контейнера на основе аннотаций?
Вместо использования XML для описания связывания компонента разработчик перемещает конфигурацию в сам класс компонента, используя аннотации в соответствующем объявлении класса, метода или поля. Это работает как альтернатива настройкам XML. Пример на картинке.
👍19😢1
Существует ли возможность перенаправить потоки стандартного ввода/вывода?
Класс System позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:
•
•
•
Класс System позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:
•
setIn(InputStream) - для ввода;•
setOut(PrintStream) - для вывода;•
setErr(PrintStream) - для вывода ошибок.👍14
#Вопросы_с_собеседования
❓Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?
Ответ:
Да, будет, но в этом случае HashMap вырождается в связный список и теряет свои преимущества.
❓Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?
Ответ:
👍29
Назовите основные классы потоков ввода/вывода.
Разделяют два вида потоков ввода/вывода:
• байтовые -
• символьные -
Разделяют два вида потоков ввода/вывода:
• байтовые -
java.io.InputStream, java.io.OutputStream;• символьные -
java.io.Reader, java.io.Writer.👍18❤1
Язык программирования Java - зачем его учить и что на нем пишут
0:00 Вступление
0:10 Какие из этих программ написаны на Java?
0:33 История создания Java
1:34 Как применяется Java
3:10 Популярные фреймворки
4:37 Архитектура приложений - виртуальная машина, управление памятью
6:40 Типизация в Java
7:30 Другие особенности Java
8:05 Зарплаты разработчиков на Java
9:01 Мой опыт работы с Java
12:05 Как начать писать на Java
12:40 Ответы на вопрос из начала видео
Смотреть видео
0:00 Вступление
0:10 Какие из этих программ написаны на Java?
0:33 История создания Java
1:34 Как применяется Java
3:10 Популярные фреймворки
4:37 Архитектура приложений - виртуальная машина, управление памятью
6:40 Типизация в Java
7:30 Другие особенности Java
8:05 Зарплаты разработчиков на Java
9:01 Мой опыт работы с Java
12:05 Как начать писать на Java
12:40 Ответы на вопрос из начала видео
Смотреть видео
YouTube
Язык программирования Java - зачем его учить и что на нем пишут
0:00 Вступление
0:10 Какие из этих программ написаны на Java?
0:33 История создания Java
1:34 Как применяется Java
3:10 Популярные фреймворки
4:37 Архитектура приложений - виртуальная машина, управление памятью
6:40 Типизация в Java
7:30 Другие особенности…
0:10 Какие из этих программ написаны на Java?
0:33 История создания Java
1:34 Как применяется Java
3:10 Популярные фреймворки
4:37 Архитектура приложений - виртуальная машина, управление памятью
6:40 Типизация в Java
7:30 Другие особенности…
👍7❤2😱1😢1
Вложенный класс имеет доступ к статическим методам и свойствам класса, в котором он объявлен?
Anonymous Quiz
50%
Да
37%
Да, если вложенный класс тоже статический
9%
Нет
4%
Узнать ответ
👍10🔥3
Какие подклассы класса Writer вы знаете, для чего они предназначены?
•
•
•
•
•
•
•
•
•
•
Writer - абстрактный класс, описывающий символьный вывод;•
BufferedWriter - буферизованный выходной символьный поток;•
CharArrayWriter - выходной поток, который пишет в символьный массив;•
FileWriter - выходной поток, пишущий в файл;•
FilterWriter - абстрактный класс, предоставляющий интерфейс для классов-надстроек;•
OutputStreamWriter - выходной поток, транслирующий байты в символы;•
PipedWriter - выходной канал;•
PrintWriter - выходной поток символов, включающий методы print() и println();•
StringWriter - выходной поток, пишущий в строку;👍18
Узнаем размер каталога с помощью Java
Размер файлов в Java можно получить с помощью класса File. Встроенная функция 'fileName.length()' используется для определения размера файла в байтах.
Каталог может содержать N файлов, для расчета размера каталога требуется суммирование размеров всех файлов.
Подробнее можно посмотреть здесь.
Размер файлов в Java можно получить с помощью класса File. Встроенная функция 'fileName.length()' используется для определения размера файла в байтах.
Каталог может содержать N файлов, для расчета размера каталога требуется суммирование размеров всех файлов.
Подробнее можно посмотреть здесь.
👍16🤔2❤1
Как пройти собеседование на позицию Java-разработчика
В статье автор разбирает вопросы и задачи, которые могут попасться на интервью.
Смотреть статью
В статье автор разбирает вопросы и задачи, которые могут попасться на интервью.
Смотреть статью
Tproger
Как пройти собеседование на позицию Java-разработчика
Расскажем, как проходит собеседование у Java-разработчика, что ищут работодатели. И разберём вопросы и задачи, которые могут попасться.
👍7😱3❤1😢1
Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
ArrayList:
• доступ к произвольному элементу по индексу за константное время
• доступ к элементам по значению за линейное время
• вставка в конец в среднем производится за константное время
• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (
• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.
LinkedList:
• на получение элемента по индексу или значению потребуется линейное время
• на добавление и удаление в начало или конец списка потребуется константное
• вставка или удаление в/из произвольного место константное
• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
В целом,
ArrayList это список, реализованный на основе массива, а LinkedList — это классический двусвязный список, основанный на объектах с ссылками между ними.ArrayList:
• доступ к произвольному элементу по индексу за константное время
O(1);• доступ к элементам по значению за линейное время
O(N);• вставка в конец в среднем производится за константное время
O(1);• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (
capacity) не изменяется);• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.
LinkedList:
• на получение элемента по индексу или значению потребуется линейное время
O(N);• на добавление и удаление в начало или конец списка потребуется константное
O(1);• вставка или удаление в/из произвольного место константное
O(1);• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
В целом,
LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти, и по скорости выполнения операций. LinkedList предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.👍22❤3
Классы HashSet и TreeSet реализуют интерфейс Set и представляют наборы отдельных элементов. Кроме того, TreeSet реализует интерфейс NavigableSet. Этот интерфейс определяет методы, использующие порядок элементов.
HashSet внутренне основан на HashMap, а TreeSet поддерживается экземпляром TreeMap, который определяет их свойства: HashSet не хранит элементы в каком-либо определенном порядке. Итерация по элементам в HashSet проиcходит в перемешанном порядке. TreeSet, с другой стороны, создает элементы по порядку в соответствии с некоторым предопределенным Компаратором.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔2
Google-json (GSON)
Google-json — библиотека прямиком из Google. Она реализует механизмы работы с форматом JSON, а именно приведение Java-объектов в этот формат и обратно.
Как видно на картинке, перевод объекта проходит с помощью минимального количества легко читаемого кода. Особенно эта библиотека пригодится при работе с RESTful приложениями, которые общаются преимущественно с помощью json.
Google-json — библиотека прямиком из Google. Она реализует механизмы работы с форматом JSON, а именно приведение Java-объектов в этот формат и обратно.
Как видно на картинке, перевод объекта проходит с помощью минимального количества легко читаемого кода. Особенно эта библиотека пригодится при работе с RESTful приложениями, которые общаются преимущественно с помощью json.
👍14❤3