"Игра должна быть простой, чтобы стать вечной."
Алексей Пажитнов, создатель Tetris, сказал это в 1984 году в интервью о разработке игры в Москве. Цитата отражает философию гейм-дизайна.
Биография
хххАбр
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
РУВИКИ
Пажитнов Алексей Леонидович — Рувики: Интернет-энциклопедия
Пажитнов Алексей Леонидович — изучайте подробную и систематизированную информацию в интернет-энциклопедии РУВИКИ
👍1
Ссылочные типы в Java — строки (String)
Строки (String) в Java — это особый ссылочный тип данных, играющий ключевую роль практически в любом приложении. Несмотря на кажущуюся простоту, строки обладают рядом особенностей, таких как неизменяемость, пул строк, перегрузка операций и поведение ссылок. Глубокое понимание строк необходимо для написания безопасного, производительного и корректного Java-кода.
Создание строк
В Java строки можно создавать несколькими способами:
В первом случае строка создаётся в пуле строк — специальной области памяти, где хранятся уникальные строковые литералы.
Во втором случае используется оператор new, что приводит к созданию нового объекта строки в куче, независимо от содержимого.
Также строки можно строить из массивов символов или байтов:
Ключевые особенности:
Строки в Java являются объектами класса java.lang.String.
Объекты String неизменяемы: после создания их содержимое нельзя изменить.
Неизменяемость позволяет безопасно использовать строки в многопоточном окружении и в качестве ключей в Map.
Существование и удаление строк
Как и любые объекты, строки существуют до тех пор, пока на них имеются активные ссылки. Когда все ссылки теряются, строка становится кандидатом на сборку мусора.
Однако строки, созданные как литералы (например, "Hello"), хранятся в строковом пуле, и удаление таких строк происходит только при завершении работы JVM или при агрессивной сборке мусора в редких случаях.
В случае создания строки через new, строки не участвуют в пуле по умолчанию:
Метод intern() позволяет вручную добавить строку в пул:
Использование строк
Строки активно используются при:
работе с вводом/выводом,
хранении текстовых данных,
построении логических выражений,
работе с шаблонами, логами и URL.
Java предоставляет множество удобных методов для работы со строками:
Важно помнить, что методы класса String возвращают новые строки, поскольку String неизменяем:
Сравнение строк:
#Java #для_новичков #beginner #reference_types #String
Строки (String) в Java — это особый ссылочный тип данных, играющий ключевую роль практически в любом приложении. Несмотря на кажущуюся простоту, строки обладают рядом особенностей, таких как неизменяемость, пул строк, перегрузка операций и поведение ссылок. Глубокое понимание строк необходимо для написания безопасного, производительного и корректного Java-кода.
Создание строк
В Java строки можно создавать несколькими способами:
String s1 = "Hello";
String s2 = new String("Hello");
В первом случае строка создаётся в пуле строк — специальной области памяти, где хранятся уникальные строковые литералы.
Во втором случае используется оператор new, что приводит к созданию нового объекта строки в куче, независимо от содержимого.
Также строки можно строить из массивов символов или байтов:
char[] chars = {'J', 'a', 'v', 'a'};
String s3 = new String(chars);
Ключевые особенности:
Строки в Java являются объектами класса java.lang.String.
Объекты String неизменяемы: после создания их содержимое нельзя изменить.
Неизменяемость позволяет безопасно использовать строки в многопоточном окружении и в качестве ключей в Map.
Существование и удаление строк
Как и любые объекты, строки существуют до тех пор, пока на них имеются активные ссылки. Когда все ссылки теряются, строка становится кандидатом на сборку мусора.
Однако строки, созданные как литералы (например, "Hello"), хранятся в строковом пуле, и удаление таких строк происходит только при завершении работы JVM или при агрессивной сборке мусора в редких случаях.
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true — обе ссылаются на одну строку из пула
В случае создания строки через new, строки не участвуют в пуле по умолчанию:
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); // false
Метод intern() позволяет вручную добавить строку в пул:
String s1 = new String("abc").intern();
String s2 = "abc";
System.out.println(s1 == s2); // true
Использование строк
Строки активно используются при:
работе с вводом/выводом,
хранении текстовых данных,
построении логических выражений,
работе с шаблонами, логами и URL.
Java предоставляет множество удобных методов для работы со строками:
String s = "Hello, World!";
int length = s.length();
char ch = s.charAt(0);
String lower = s.toLowerCase();
boolean contains = s.contains("World");
Важно помнить, что методы класса String возвращают новые строки, поскольку String неизменяем:
String original = "Java";
String modified = original.replace("J", "K");
System.out.println(original); // Java
System.out.println(modified); // Kava
Сравнение строк:
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // false — разные объекты
System.out.println(a.equals(b)); // true — одинаковое содержимое
Оператор == сравнивает ссылки, а метод equals() — содержимое.
#Java #для_новичков #beginner #reference_types #String
👍1
Трудности и подводные камни
1. Неизменяемость
Изменение строки всегда приводит к созданию нового объекта. Это важно учитывать при работе в циклах:
Лучше использовать StringBuilder:
2. Сравнение с null
Обращение к методам строки без проверки может привести к NullPointerException:
Правильнее писать:
3. Пул строк и производительность
Пул строк позволяет уменьшить использование памяти, но злоупотребление вручную созданными строками через new String(...) может привести к увеличению нагрузки на сборщик мусора.
4. Конкатенация и производительность
Строки, объединённые с помощью + в цикле, могут ухудшать производительность. Лучше использовать StringBuilder или StringBuffer (если требуется потокобезопасность).
5. Использование в Map и Set
Поскольку строки неизменяемы, их можно безопасно использовать в качестве ключей в HashMap, HashSet и других коллекциях. Однако важно корректно переопределять equals() и hashCode() для классов, в которых строки используются в качестве полей для сравнения.
Дополнительные нюансы
1. String vs StringBuilder vs StringBuffer
String — неизменяемый, потокобезопасный.
StringBuilder — изменяемый, не потокобезопасный, но самый быстрый.
StringBuffer — изменяемый, потокобезопасный, но медленнее.
2. Методы класса String
Строки обладают большим набором методов:
substring()
trim()
split()
replace()
matches() (регулярные выражения)
format() и другие
3. Регулярные выражения
Методы matches(), replaceAll() и split() поддерживают регулярные выражения, что делает String мощным инструментом для разбора и обработки текста.
4. Юникод и кодировка
Java строки используют UTF-16, где каждый символ — это один или два 16-битных элемента. Это важно при работе с Unicode-символами, особенно при подсчёте длины строки или извлечении символов.
5. Объекты String в коллекциях
Если строка используется как ключ в Map, важно помнить, что разные ссылки на строки с одинаковым содержимым будут считаться одинаковыми, если equals() и hashCode() совпадают — что работает корректно для String.
#Java #для_новичков #beginner #reference_types #String
1. Неизменяемость
Изменение строки всегда приводит к созданию нового объекта. Это важно учитывать при работе в циклах:
String result = "";
for (int i = 0; i < 1000; i++) {
result += "a"; // создается 1000 новых строк
}
Лучше использовать StringBuilder:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append("a");
}
String result = sb.toString();
2. Сравнение с null
Обращение к методам строки без проверки может привести к NullPointerException:
String name = null;
if (name.equals("admin")) { // ошибка
}
Правильнее писать:
if ("admin".equals(name)) { // безопасно
}
3. Пул строк и производительность
Пул строк позволяет уменьшить использование памяти, но злоупотребление вручную созданными строками через new String(...) может привести к увеличению нагрузки на сборщик мусора.
4. Конкатенация и производительность
Строки, объединённые с помощью + в цикле, могут ухудшать производительность. Лучше использовать StringBuilder или StringBuffer (если требуется потокобезопасность).
5. Использование в Map и Set
Поскольку строки неизменяемы, их можно безопасно использовать в качестве ключей в HashMap, HashSet и других коллекциях. Однако важно корректно переопределять equals() и hashCode() для классов, в которых строки используются в качестве полей для сравнения.
Дополнительные нюансы
1. String vs StringBuilder vs StringBuffer
String — неизменяемый, потокобезопасный.
StringBuilder — изменяемый, не потокобезопасный, но самый быстрый.
StringBuffer — изменяемый, потокобезопасный, но медленнее.
2. Методы класса String
Строки обладают большим набором методов:
substring()
trim()
split()
replace()
matches() (регулярные выражения)
format() и другие
3. Регулярные выражения
Методы matches(), replaceAll() и split() поддерживают регулярные выражения, что делает String мощным инструментом для разбора и обработки текста.
4. Юникод и кодировка
Java строки используют UTF-16, где каждый символ — это один или два 16-битных элемента. Это важно при работе с Unicode-символами, особенно при подсчёте длины строки или извлечении символов.
5. Объекты String в коллекциях
Если строка используется как ключ в Map, важно помнить, что разные ссылки на строки с одинаковым содержимым будут считаться одинаковыми, если equals() и hashCode() совпадают — что работает корректно для String.
#Java #для_новичков #beginner #reference_types #String
👍2
Что выведет код?
#Tasks
public class Task130625 {
public static void main(String[] args) {
String s1 = "Java";
String s2 = new String("Java").intern();
String s3 = new StringBuilder("Ja").append("va").toString();
String s4 = s3.intern();
System.out.println((s1 == s2) + " " + (s1 == s3) + " " + (s1 == s4));
}
}
#Tasks
👍1
Варианты ответа:
Anonymous Quiz
13%
"true true false"
29%
"false true false"
13%
"true true true"
46%
"true false true"
👍1
Что такое Map.Entry в Java? 🤓
Ответ:
Map.Entry — это интерфейс, представляющий пару ключ-значение в Map.
Используется для итерации по элементам HashMap или других реализаций Map.
Пример:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Методы getKey() и getValue() позволяют получить ключ и значение.
#собеседование
Ответ:
Используется для итерации по элементам HashMap или других реализаций Map.
Пример:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Методы getKey() и getValue() позволяют получить ключ и значение.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤓1
С 07.06 по 13.06
Предыдущий пост(с 31.05 по 06.06)
Следующая неделя
Воскресный мотивационный пост:
«Обучение Java — марафон, а не прыжок с трамплина»
Выбранная голосованием тема:
JavaMailSender в Spring Boot
Запись встреч:
Многопоточка во всей красе. Часть 2.
Обучающие статьи:
Объекты в Java
Ссылочные типы в Java — массивы
Ссылочные типы в Java — строки (String)
Введение в Flyway
Настройка и базовые команды Flyway
Пост о воспоминаниях:
Как мы писали крестики - нолики
Полезные статьи и видео:
Библиотека для кэширования Caffeine: анализ кода
Spring Data JPA и Hibernate: ориентируемся на производительность. Часть 1
Часть 1: Как я создал идеальный REST API — микросервис инцидентов на Java и Spring
Для тех кто знает английский - посмеяться
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Предыдущий пост(с 31.05 по 06.06)
Следующая неделя
Воскресный мотивационный пост:
«Обучение Java — марафон, а не прыжок с трамплина»
Выбранная голосованием тема:
JavaMailSender в Spring Boot
Запись встреч:
Многопоточка во всей красе. Часть 2.
Обучающие статьи:
Объекты в Java
Ссылочные типы в Java — массивы
Ссылочные типы в Java — строки (String)
Введение в Flyway
Настройка и базовые команды Flyway
Пост о воспоминаниях:
Как мы писали крестики - нолики
Полезные статьи и видео:
Библиотека для кэширования Caffeine: анализ кода
Spring Data JPA и Hibernate: ориентируемся на производительность. Часть 1
Часть 1: Как я создал идеальный REST API — микросервис инцидентов на Java и Spring
Для тех кто знает английский - посмеяться
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
🔥2
После проведенного голосования, определилась тема для рассмотрения в выходные - Stream Api
Но поскольку принято решение показать это все на видео, в рамках встречи, то перейдем к второму финалисту - Maven.
Тем более он давно напрашивается на цикл статей😏
Ну читаем'с затравочную статейку
Введение в Apache Maven: автоматизация сборки и управления проектами
Apache Maven — это мощный инструмент для автоматизации сборки, управления зависимостями и проектной документации, широко используемый в экосистеме Java. Эта статья предназначена для тех, кто только начинает знакомство с Maven и хочет понять, зачем он нужен, как работает и какую роль может играть в разработке программного обеспечения.
Что такое Maven
Maven был создан как ответ на потребность в стандартизированной, предсказуемой и удобной системе сборки Java-проектов. Его название происходит от идишского слова «знаток» — и это хорошо отражает его назначение. Maven берет на себя множество задач, связанных с управлением проектом: от загрузки библиотек до сборки артефактов и генерации документации.
По сути, Maven — это система сборки, основанная на декларативном описании проекта в файле pom.xml (Project Object Model). Вместо написания множества сценариев разработчик указывает, что именно нужно сделать, а Maven сам знает, как это реализовать.
Зачем нужен Maven
В проектах на Java быстро возникает необходимость управлять зависимостями, компиляцией, тестами и выпуском новых версий. Раньше всё это приходилось настраивать вручную — с помощью антипаттернов вроде «анархичной сборки» на Ant, bash-скриптах и слабо задокументированных процедурах.
Maven решает эти проблемы:
Централизованное управление зависимостями: подключение внешних библиотек через репозитории.
Повторяемая сборка: независимо от среды результат будет одинаков.
Стандартизация структуры проекта.
Интеграция с инструментами тестирования, анализа качества кода и CI/CD.
Простота подключения плагинов и расширение функциональности без переписывания логики сборки.
Как работает Maven
Maven использует модель жизненного цикла сборки, разбитую на фазы: compile, test, package, install, deploy и другие. Когда вы вызываете mvn install, Maven проходит через все фазы от начала до указанной, автоматически выполняя нужные действия. Плагины реализуют конкретные шаги на каждой фазе.
Файл pom.xml описывает проект: его артефакт, координаты, зависимости, плагины и профили. Maven загружает зависимости из центрального репозитория, при необходимости кешируя их в локальном.
Репозитории делятся на:
Локальный (на вашей машине)
Центральный (официальный репозиторий Maven)
Удалённые (частные, корпоративные и т. д.)
Преимущества Maven
Одно из главных достоинств Maven — подход «конвенция важнее конфигурации». Он предполагает стандартную структуру каталогов и поведения, которую можно переопределить, но в большинстве случаев она устраивает по умолчанию. Это упрощает вхождение в проект новым разработчикам и снижает объем ручной настройки.
Maven обеспечивает:
Унифицированный подход к сборке.
Возможность многомодульной организации.
Расширяемость за счёт системы плагинов.
Широкую поддержку со стороны экосистемы (IDE, CI-систем, репозиториев).
Когда Maven может не подойти
Несмотря на свои преимущества, Maven не универсален. В проектах с сильно нестандартной логикой сборки или с большим количеством нестандартных шагов может потребоваться более гибкий инструмент, такой как Gradle. Также Maven изначально ориентирован на Java, и для других языков (например, JavaScript или Python) он не является естественным выбором.
#Java #middle #on_request #Maven
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!
Тема будет: StreamApi и функциональные интерфейсы
Тема будет: StreamApi и функциональные интерфейсы
Anonymous Poll
52%
Да, интересно я приду! 👌
20%
Блииин, хочу, но не могу 😭
24%
Посмотрю в записи ☺️
4%
Не, фигню рассматриваете, я ее знаю, не приду 🤫
👍2
Всем привет! 👋
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз мы рассмотрим такую нетривиальную тему как Stream API и функциональное программирование в целом.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы🧑💻
Как всегда жду всех! 🫡
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз мы рассмотрим такую нетривиальную тему как Stream API и функциональное программирование в целом.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы
Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
"Как я притворяюсь программистом"
Вот представьте, 40-летний, вполне состоявшийся человек, однажды решает поменять свою жизнь и идет в IT😨
Начинает учиться, и что-то даже писать на Java.🤓
Проходит некоторое время и волею судеб, этот мужик получает оффер и выходит на работу.🥳
Уже войдя в команду и выполняя поначалу простые, но тем не менее продуктовые задачи, он в тайне думает, что все это не взаправду.
Ведь:
❌ Вся команда может завтра узнать, что он новичок, и писать то не умеет.
❌ А код он берет с Stack Overflow и чатаЖПТ и скоро это выплывет наружу.
❌ Завтра он напишет код с багами и в него начнут тыкать пальцами.
❌ И зарплату ему платят зря, ведь он вообще ничего не знает и от него нет пользы.
❌ И вообще он занял место того, кто явно умнее, но менее удачлив.
Но проходит время и всего этого не происходит.
Наоборот, его периодически хвалят за хорошую работу, и неплохой код.
Его приложения давно крутятся на PROD-е, но данные мысли не уходят...
И если у тебя тоже так - добро пожаловать в клуб людей с «Синдромом Самозванца»
И ты спросишь - а что делать, то?
Самое важное - ПЕРЕСТАНЬ ПАРИТЬСЯ🙃
Эффективно бороться с «синдромом самозванца» можно только его же методами:
1. Понять и принять, что эти ощущения никуда не денутся долгое время😭
Ведь - «Программирование — это вечное незнание».
Еще очень долго будет казаться, что ты просто глуп для занимаемого тобою места и только признание команды, и осознание того, что ты справляешься, постепенно притупит эти ощущения.
2. Понять, что ты в этом не одинок.🤝
В сфере программирования даже у мидлов, отработавших уже далеко не один год, есть ощущение, что они "на грани провала".
Это нормально.
Одна из причин возникновения этого синдрома - сравнение себя с более опытными разработчиками. Видя, как они за день выдают в мердж реквест целую систему, кажется, что ты так никогда не сможешь и вообще бестолочь😉
Но, ты не видишь, как тот же сеньор загуглил вчера “what is hashmap in java” и сломал клавиатуру в попытках сделать зеленым тест, при написании это системы.
Все познается в сравнении.🙂
3. Понять, что чувство фальши значит - ты не врёшь себе. ☝️
Важно осознать свое место.
Понять, что ты хоть и новичок, но раз ты получил оффер, значит ты достоин. Если у тимлида к тебе нет претензий - значит ты справляешься.
Пойми, настоящие фейковые программисты никогда не страдают синдромом самозванца.
Сомнения — признак того, что тебе не всё равно, что ты понимаешь уровень своей компетенции. А это уже преимущество. Потому что только такие не стоят на месте.
ПОЭТОМУ
Не сомневайся
Пиши код. Ошибайся. Двигайся.
Даже прочитав это, ты уже не там, где был до этого.
Это и есть прогресс.
И мы с тобой✈️
😎
Понравилась статья - поделись с другом и, будет тебе моя благодарность 👏
#motivation
Вот представьте, 40-летний, вполне состоявшийся человек, однажды решает поменять свою жизнь и идет в IT
Начинает учиться, и что-то даже писать на Java.
Проходит некоторое время и волею судеб, этот мужик получает оффер и выходит на работу.
Уже войдя в команду и выполняя поначалу простые, но тем не менее продуктовые задачи, он в тайне думает, что все это не взаправду.
Ведь:
Но проходит время и всего этого не происходит.
Наоборот, его периодически хвалят за хорошую работу, и неплохой код.
Его приложения давно крутятся на PROD-е, но данные мысли не уходят...
И если у тебя тоже так - добро пожаловать в клуб людей с «Синдромом Самозванца»
«Синдром самозванца» (на англ. impostor syndrome) — это психологическое явление, впервые описанное в 1978 году американскими психологами Полин Кланс и Сюзанн Аймс. Оно не является официальным психиатрическим диагнозом, но признано как психологический феномен, с которым сталкиваются миллионы людей, особенно в сферах с высоким уровнем интеллектуальной нагрузки — таких как программирование, наука, медицина, искусство.
Что это такое с научной точки зрения:
Синдром самозванца — это устойчивое внутреннее ощущение, что твои достижения не заслужены, что ты — "обманщик", и скоро все это "раскроется".
Люди с этим синдромом часто приписывают успех:
случайности,
везению,
внешним факторам ("мне просто помогли", "повезло с задачей"),
а не своим способностям или труду.
И это НЕ болезнь, но:
Может сопровождаться тревожностью, депрессией, перфекционизмом и прокрастинацией.
Чаще возникает у людей с высоким уровнем самокритики и требовательности к себе.
Не имеет четких диагностических критериев в МКБ-11 или DSM-5 (официальные классификаторы заболеваний), но изучается в клинической психологии.
И ты спросишь - а что делать, то?
Самое важное - ПЕРЕСТАНЬ ПАРИТЬСЯ
Эффективно бороться с «синдромом самозванца» можно только его же методами:
1. Понять и принять, что эти ощущения никуда не денутся долгое время
Ведь - «Программирование — это вечное незнание».
Еще очень долго будет казаться, что ты просто глуп для занимаемого тобою места и только признание команды, и осознание того, что ты справляешься, постепенно притупит эти ощущения.
2. Понять, что ты в этом не одинок.
В сфере программирования даже у мидлов, отработавших уже далеко не один год, есть ощущение, что они "на грани провала".
Это нормально.
Одна из причин возникновения этого синдрома - сравнение себя с более опытными разработчиками. Видя, как они за день выдают в мердж реквест целую систему, кажется, что ты так никогда не сможешь и вообще бестолочь
Но, ты не видишь, как тот же сеньор загуглил вчера “what is hashmap in java” и сломал клавиатуру в попытках сделать зеленым тест, при написании это системы.
Все познается в сравнении.
3. Понять, что чувство фальши значит - ты не врёшь себе. ☝️
Важно осознать свое место.
Понять, что ты хоть и новичок, но раз ты получил оффер, значит ты достоин. Если у тимлида к тебе нет претензий - значит ты справляешься.
Пойми, настоящие фейковые программисты никогда не страдают синдромом самозванца.
Сомнения — признак того, что тебе не всё равно, что ты понимаешь уровень своей компетенции. А это уже преимущество. Потому что только такие не стоят на месте.
ПОЭТОМУ
Не сомневайся
Пиши код. Ошибайся. Двигайся.
Даже прочитав это, ты уже не там, где был до этого.
Это и есть прогресс.
Интересный факт:
Исследования показывают, что 70–80% людей испытывали синдром самозванца хотя бы раз в жизни.
Особенно часто:
женщины в STEM-профессиях,
начинающие специалисты,
талантливые подростки и студенты.
И мы с тобой
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12 2👍1
Предлагаем темы для разбора и публикации! 📖
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 Один человек - одна тема.
🟢 Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!
Жду Ваших предложений!👏
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
Жду Ваших предложений!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
31%
Optional
23%
AOP
31%
JSON
14%
IO/NIO
👍1
А вы знали, что первый "цифровой переводчик" был создан в 1954 году?
Georgetown-IBM Experiment в 1954 году продемонстрировал автоматический перевод 60 предложений с русского на английский. Это был первый шаг к современным системам, таким как Google Translate.
#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
"Безопасность в интернете — это как замок на двери: он не спасет, если ключ в руках у всех."
Евгений Касперский, основатель Kaspersky Lab, сказал это в 2005 году на конференции по кибербезопасности в Москве.
Биография
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Касперский, Евгений Валентинович
Евге́ний Валенти́нович Каспе́рский (род. 4 октября 1965 (1965-10-04), Новороссийск, Краснодарский край) — российский программист, один из ведущих мировых специалистов в сфере информационной безопасности и предприниматель. Один из основателей, основной владелец…
👍1
Типы миграций и версионирование в Flyway
1. Структура SQL-миграций
Flyway классифицирует SQL-миграции по префиксам в именах файлов, определяя их поведение при выполнении.
1.1. Именование файлов
Версионные миграции (Versioned)
Префикс V + версия + описание:
Пример:
Повторяемые миграции (Repeatable)
Префикс R + описание:
Пример:
2. Java-миграции
Позволяют описывать миграции на Java для сложной логики, недоступной в SQL.
2.1. Реализация интерфейсов
JdbcMigration (устаревший):
JavaMigration (рекомендуемый):
2.2. Правила
Классы должны находиться в classpath (обычно src/main/java/db/migration).
Имя класса соответствует имени файла SQL-миграции (например, V2__InsertTestData.java).
3. Правила версионирования
3.1. Семантическое версионирование
Рекомендуемый формат версии:
Пример:
Преимущества:
Понятная история изменений.
Совместимость с Semantic Versioning.
3.2. Откат изменений
Flyway не поддерживает автоматический откат. Альтернативы:
Новая миграция для отмены изменений:
Callbacks (SQL-хуки):
Скрипты beforeMigrate/afterMigrate для резервного копирования.
Важно: Не изменяйте уже примененные миграции — это нарушит целостность flyway_schema_history.
4. Примеры
4.1. SQL-миграции
4.2. Java-миграция
#Java #middle #Flyway
1. Структура SQL-миграций
Flyway классифицирует SQL-миграции по префиксам в именах файлов, определяя их поведение при выполнении.
1.1. Именование файлов
Версионные миграции (Versioned)
Префикс V + версия + описание:
V<Версия>__<Описание>.sql
Пример:
-- V1__Create_users_table.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
Повторяемые миграции (Repeatable)
Префикс R + описание:
R__<Описание>.sql
Пример:
-- R__Update_user_view.sql
CREATE OR REPLACE VIEW user_view AS
SELECT id, username FROM users;
2. Java-миграции
Позволяют описывать миграции на Java для сложной логики, недоступной в SQL.
2.1. Реализация интерфейсов
JdbcMigration (устаревший):
public class V2__InsertTestData implements JdbcMigration {
@Override
public void migrate(Connection connection) throws Exception {
try (Statement stmt = connection.createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('admin')");
}
}
}
JavaMigration (рекомендуемый):
public class V3__AddAdminUser implements JavaMigration {
@Override
public void migrate(Context context) throws Exception {
try (Statement stmt = context.getConnection().createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('superuser')");
}
}
}
2.2. Правила
Классы должны находиться в classpath (обычно src/main/java/db/migration).
Имя класса соответствует имени файла SQL-миграции (например, V2__InsertTestData.java).
3. Правила версионирования
3.1. Семантическое версионирование
Рекомендуемый формат версии:
V<Мажор>.<Минор>.<Патч>__<Описание>.sql
Пример:
-- V1.2.3__Fix_email_constraint.sql
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
Преимущества:
Понятная история изменений.
Совместимость с Semantic Versioning.
3.2. Откат изменений
Flyway не поддерживает автоматический откат. Альтернативы:
Новая миграция для отмены изменений:
-- V3__Drop_users_table.sql
DROP TABLE users;
Callbacks (SQL-хуки):
Скрипты beforeMigrate/afterMigrate для резервного копирования.
Важно: Не изменяйте уже примененные миграции — это нарушит целостность flyway_schema_history.
4. Примеры
4.1. SQL-миграции
-- V1__Initial_schema.sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- R__Update_view.sql
CREATE OR REPLACE VIEW active_users AS
SELECT * FROM users WHERE deleted_at IS NULL;
4.2. Java-миграция
public class V4__EncryptPasswords implements JavaMigration {
@Override
public void migrate(Context context) throws Exception {
try (PreparedStatement ps = context.getConnection()
.prepareStatement("UPDATE users SET password = encrypt(password)")) {
ps.executeUpdate();
}
}
}
#Java #middle #Flyway
👍3
Что выведет код?
#Tasks
import java.util.stream.IntStream;
public class Task160625 {
public static void main(String[] args) {
IntStream.rangeClosed(1, 5)
.filter(i -> i % 2 == 0)
.peek(System.out::print)
.forEachOrdered(i -> {});
}
}
#Tasks
👍2
👍1
Чем отличается ConcurrentHashMap от HashMap? 🤓
Ответ:
ConcurrentHashMap — потокобезопасная версия HashMap, предназначенная для многопоточных приложений.
Она использует сегментированную блокировку (lock striping), чтобы минимизировать конфликты. HashMap не потокобезопасна, и одновременный доступ из нескольких потоков может привести к ошибкам.
Пример:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1); // Потокобезопасно
ConcurrentHashMap не блокирует всю структуру, а только отдельные сегменты.
#собеседование
Ответ:
Она использует сегментированную блокировку (lock striping), чтобы минимизировать конфликты. HashMap не потокобезопасна, и одновременный доступ из нескольких потоков может привести к ошибкам.
Пример:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1); // Потокобезопасно
ConcurrentHashMap не блокирует всю структуру, а только отдельные сегменты.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4