Java | Фишки и трюки
Ir al canal en Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
Mostrar más6 952
Suscriptores
+124 horas
-107 días
+1230 días
Archivo de publicaciones
6 951
⌨️ Неизменяемые коллекции
Для получения неизменяемого варианта коллекции, в классе Collections есть соответствующие методы:
unmodifiableCollection unmodifiableSequencedCollection unmodifiableSet unmodifiableSequencedSet unmodifiableSortedSet unmodifiableNavigableSet unmodifiableList unmodifiableMap unmodifiableSequencedMap unmodifiableSortedMap unmodifiableNavigableMapПоскольку неизменяемые коллекции нельзя изменить, разработчики могут быть уверены, что состояние коллекции не будет неожиданно изменено в других частях программы. В некоторых случаях неизменяемые коллекции могут повышать производительность, так как операции над такими коллекциями не требуют блокировок и синхронизации.
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
List<String> unmodifiableList = Collections.unmodifiableList(list);
// Попытка изменить unmodifiableList приведет к UnsupportedOperationException
// unmodifiableList.remove("B");
#java #collections #immutable #unmodifiable6 951
Привет! Рекомендую подписаться на канал Java: fill the gaps, полезно для разработчиков любого уровня🔥
Для продолжающих:
🔹 Как реализованы лямбда выражения внутри JVM
🔹 Библиотеки работы с данными: от JDBC до Spring Data
🔹 3 способа подружить Postgres и Kafka
Для начинающих:
🔸 5 ошибок при использовании Optional
🔸 Fluent API: что такое и зачем нужен
🔸 Как освоить многопоточку
Подписывайся👉 Java: fill the gaps
6 951
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Quest {
public static void main(String[] args) {
List<String> list = Stream.of("Pizza", "Sushi", "Pasta", "Sushi", "Pizza")
.sequential()
.filter(new TreeSet<>()::add)
.collect(Collectors.toList());
System.out.println(list);
}
}6 951
Открытый урок. Аллокаторы в C++: Что делать, если менеджер памяти вас разочаровывает?
C++ известен тем, что позволяет работать с памятью напрямую. Здесь вы точно знаете, где и как расположен каждый из ваших объектов, сколько памяти он занимает.
Но можете ли вы принимать решение, где и как будет размещен ваш объект? Часто стандартные методы выделения памяти не удовлетворяют узким требованиям конкретной логики.
Присоединяйтесь к открытому вебинару 8 августа в 20:00 мск! Поговорим, зачем в C++ существуют аллокаторы: https://clck.ru/3CCTpL
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 951
⌨️ Почему String неизменяемый класс?
Есть несколько преимуществ в неизменности строк:
✔️ Пул строк возможен только потому, что строка неизменяемая, таким образом виртуальная машина сохраняет больше свободного места в Heap, поскольку разные строковые переменные указывают на одну и ту же переменную в пуле. Если бы строка была изменяемой, то интернирование строк не было бы возможным, потому что изменение значения одной переменной отразилось бы также и на остальных переменных, ссылающихся на эту строку.
✔️ Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, её значение не может быть изменено, в противном случае злоумышленник может изменить значение ссылки и вызвать проблемы в безопасности приложения.
✔️ Неизменяемость позволяет избежать синхронизации: строки безопасны для многопоточности и один экземпляр строки может быть совместно использован различными потоками.
✔️ Строки используются classloader и неизменность обеспечивает правильность загрузки класса.
✔️ Поскольку строка неизменяемая, её hashCode() кэшируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в HashMap т.к. его обработка происходит быстрее.
#java #string #immutable
6 951
👩💻 Программирование теперь в телеграм!
Вот обширная база материалов, которая ежедневно обновляется, выбирай своё направление:
Обучение Java с нуля
Обучение Python с нуля
Обучение JavaScript с нуля
Обучение HTML/CSS с нуля
Обучение C/С++ с нуля
Обучение С# с нуля
Обучение SQL/GO/PHP с нуля
Обучение Kotlin/Swift с нуля
⛓ Курсы, книги, шпаргалки, статьи, видео, ресурсы — всё собрано в одном месте: @roadmap_ready
6 951
⌨️ Особенности класса String
✔️ Это неизменяемый (immutable) и финализированный тип данных;
✔️ Строки-литералы, интернированные объекты класса String JVM хранит в пуле строк;
✔️ Объект класса
String можно получить, используя двойные кавычки;
✔️ Можно использовать оператор + для конкатенации строк;
✔️ Начиная с Java 7 строки можно использовать в конструкции switch.
#java #string6 951
Для тех кто просил, наш канал с мемами для айтишников и программистов
👇🏻
https://t.me/+Lf7ASxaQwd5mNmYy
6 951
⌨️ PriorityQueue — это реализация структуры данных очередь с приоритетом, которая упорядочивает элементы по их естественному порядку или по заданному компаратору. Она представляет собой часть коллекции Java Collections Framework и находится в пакете java.util.
В отличие от Queue, элементы PriorityQueue не упорядочены по времени их добавления, а по приоритету.
Основные методы:
add(E e) - добавляет элемент в очередь.
remove() - удаляет и возвращает элемент с наивысшим приоритетом. Если очередь пуста, генерируется исключение
NoSuchElementException.
poll() - удаляет и возвращает элемент с наивысшим приоритетом. Если очередь пуста, возвращает null.
peek() - возвращает, но не удаляет элемент с наивысшим приоритетом. Если очередь пуста, возвращает null.
element() - возвращает, но не удаляет элемент с наивысшим приоритетом. Если очередь пуста, генерируется исключение NoSuchElementException.
Пример:
class Task implements Comparable<Task> {
String name;
Integer priority;
public Task(String name, Integer priority) {
this.name = name;
this.priority = priority;
}
@Override
public int compareTo(@NotNull Task o) {
return priority - o.priority;
}
}
public class Test {
public static void main(String[] args) {
PriorityQueue<Task> pq = new PriorityQueue<>();
pq.add(new Task("Task1", 1));
pq.add(new Task("Task5", 5));
pq.add(new Task("Task2", 2));
pq.add(new Task("Task4", 4));
pq.add(new Task("Task3", 3));
while (!pq.isEmpty()) {
System.out.println(pq.poll().name);
// Выведет: Task1, Task2, Task3, Task4, Task5
}
}
}
#java #PriorityQueue6 951
⌨️ PriorityQueue — это реализация структуры данных очередь с приоритетом, которая упорядочивает элементы по их естественному порядку или по заданному компаратору. Она представляет собой часть коллекции Java Collections Framework и находится в пакете java.util.
В отличие от Queue, элементы PriorityQueue не упорядочены по времени их добавления, а по приоритету.
Основные методы:
add(E e) - добавляет элемент в очередь.
remove() - удаляет и возвращает элемент с наивысшим приоритетом. Если очередь пуста, генерируется исключение
NoSuchElementException.
poll() - удаляет и возвращает элемент с наивысшим приоритетом. Если очередь пуста, возвращает null.
peek() - возвращает, но не удаляет элемент с наивысшим приоритетом. Если очередь пуста, возвращает null.
element() - возвращает, но не удаляет элемент с наивысшим приоритетом. Если очередь пуста, генерируется исключение NoSuchElementException.
Пример:
class Task implements Comparable<Task> {
String name;
Integer priority;
public Task(String name, Integer priority) {
this.name = name;
this.priority = priority;
}
@Override
public int compareTo(@NotNull Task o) {
return priority - o.priority;
}
}
public class Test {
public static void main(String[] args) {
PriorityQueue<Task> pq = new PriorityQueue<>();
pq.add(new Task("Task1", 1));
pq.add(new Task("Task5", 5));
pq.add(new Task("Task2", 2));
pq.add(new Task("Task4", 4));
pq.add(new Task("Task3", 3));
while (!pq.isEmpty()) {
System.out.println(pq.poll().name);
// Выведет: Task1, Task2, Task3, Task4, Task5
}
}
}
#java #PriorityQueue6 951
Знания, профессиональный английский и хороший юмор — набор любого айтишника🔥
А быть в тренде и качать необходимые скиллы помогут наши каналы:
⏩ Библиотека Кодера — книги, ресурсы, шпаргалки и статьи для разработчиков
⏩ CodeLang — английский язык в IT-сфере
⏩ JSON → Айти Memes — мемы для программистов и айтишников
6 951
🖥 Интересно про то как у нас в Java 23 должна была быть, но не будет, интерполяция строк (String Templates)
В большинстве современных языков программирования уже есть интерполяция строк. Вот и в нашем любимом языке это должно было быть, но к сожалению придется ещё немного подождать.
Это должно было выглядеть так:
String name = "Melissa";
System.out.println("Hello, \{name}!");
// Hello, Melissa!
Habr
#java #StringTemplates6 951
Что должен знать HR
1. Трудовое законодательство (тут вы улыбнетесь. Очевидно!)
2. Принципы поиска и отбора персонала (тут тоже смешно, кажется)
3. Кадровое делопроизводство (и тут нам есть, что сказать)
Подписывать документы за пару минут со смартфона удобно и реально. КЭДО + Госключ от Битрикс24 поможет быстро и бесплатно получить усиленную ЭП и даст возможность подписывать с сотрудниками документы от мат.ответственности до трудового договора в пару кликов.
А еще в Битрикс24 можно корпоративно чатиться в мессенджере, креативить с AI, синхронизироваться по видео до 100 человек, ставить задачи и продавать с CRM.
Качественно экономьте и работайте на полную мощность вашего бизнеса с Битрикс24
Узнать больше
#реклама
bitrix24.ru
О рекламодателе
6 951
⌨️ Какая основная разница между String, StringBuffer, StringBuilder?
Класс String является неизменяемым (immutable) - модифицировать объект такого класса нельзя, можно лишь заменить его созданием нового экземпляра.
Класс StringBuffer изменяемый - использовать StringBuffer следует тогда, когда необходимо часто модифицировать содержимое.
Класс StringBuilder был добавлен в Java 5 и он во всем идентичен классу StringBuffer за исключением того, что он не синхронизирован и поэтому его методы выполняются значительно быстрей.
#java #String #StringBuffer #StringBuilder
6 951
public class Quest {
public final int value = 4;
public void doIt() {
int value = 6;
Runnable r = new Runnable() {
public final int value = 8;
public void run() {
int value = 10;
System.out.println(this.value);
}
};
r.run();
}
public static void main(String[] args) {
new Quest().doIt();
}
}
#java #quest6 951
⌨️ Семафор (Semaphore) - класс из пакета
java.util.concurrent, предназначенный для управления доступом к общим ресурсам в многопоточных приложениях. Он позволяет ограничить количество потоков, которые могут одновременно использовать определенный ресурс.
Семафор управляет набором разрешений, и поток может запросить или освободить разрешение, тем самым контролируя доступ к общим ресурсам.
Конструктор:
Semaphore(int permits) - создает семафор с указанным числом разрешений.
Методы для получения разрешений:
void acquire() - запрашивает одно разрешение. Если разрешение недоступно, поток блокируется до тех пор, пока разрешение не станет доступным.
void acquire(int permits) - запрашивает указанное количество разрешений.
boolean tryAcquire() - запрашивает одно разрешение, если оно доступно, не блокируя поток. Возвращает true, если разрешение получено, и false в противном случае.
boolean tryAcquire(long timeout, TimeUnit unit) - запрашивает одно разрешение, если оно доступно в течение указанного времени. Возвращает true, если разрешение получено, и false в противном случае.
Методы для освобождения разрешений:
void release() - освобождает одно разрешение, увеличивая внутренний счетчик разрешений.
void release(int permits) - освобождает указанное количество разрешений.
Пример:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_CONCURRENT_THREADS = 3;
private static final Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS);
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new Worker(i)).start();
}
}
static class Worker implements Runnable {
private final int id;
Worker(int id) {
this.id = id;
}
@Override
public void run() {
try {
System.out.println("Thread " + id + " is waiting for a permit.");
semaphore.acquire();
System.out.println("Thread " + id + " acquired a permit.");
// Simulate some work with a sleep
Thread.sleep(2000);
System.out.println("Thread " + id + " releasing a permit.");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
В этом примере создается семафор, который позволяет одновременно работать трем потокам. Остальные потоки будут ждать, пока не освободится разрешение. Каждый поток выполняет работу (симулированную с помощью Thread.sleep(2000)), после чего освобождает разрешение, позволяя другому ожидающему потоку приступить к работе.
#java #semaphore6 951
⚡️ 3782ГБ платного контента по всем языкам программирования, фреймворкам и софту теперь доступны бесплатно.
Выбирай направление и обучайся:
— Java-разработка
— Web-разработка (Frontend, Backend)
— Мобильная разработка
— Десктопная разработка
— Тестирование ПО
— QA-инженер
— DevOps-инженер
— Разработка нейросетей
— Машинное обучение
— 1С-разработка
— Разработка игр
— Разработка ботов
— Хакинг и безопасность
— Админ баз данных
— Data Science
🔒 Ежедневно куча материалов сливается в канал Easy Dev
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
