Пример 3: Счетчик посещений веб-сайта
Представим, что у нас есть веб-сайт, который обрабатывает множество запросов в секунду. Нам нужно вести подсчет посещений сайта, причем из разных потоков одновременно. В этом случае синхронизированные коллекции помогут избежать некорректного подсчета.
Мы можем использовать Collections.synchronizedMap() для создания потокобезопасной карты, где ключом будет страница, а значением — счетчик посещений.
Пример 4: Синхронизированный доступ к общему ресурсу
Рассмотрим задачу, в которой несколько потоков должны безопасно добавлять элементы в общий список и извлекать их для обработки. Важно, чтобы все операции были синхронизированы, чтобы избежать потери данных.
Задача: Создать потокобезопасную очередь задач.
#Java #Training #Medium #SynchronizedCollections
Представим, что у нас есть веб-сайт, который обрабатывает множество запросов в секунду. Нам нужно вести подсчет посещений сайта, причем из разных потоков одновременно. В этом случае синхронизированные коллекции помогут избежать некорректного подсчета.
Мы можем использовать Collections.synchronizedMap() для создания потокобезопасной карты, где ключом будет страница, а значением — счетчик посещений.
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class VisitCounter {
private final Map<String, Integer> visitCounts = Collections.synchronizedMap(new HashMap<>());
public void recordVisit(String page) {
visitCounts.merge(page, 1, Integer::sum);
}
public int getVisitCount(String page) {
return visitCounts.getOrDefault(page, 0);
}
}
// Пример использования
VisitCounter visitCounter = new VisitCounter();
// Моделируем посещения страниц
Runnable visitSimulator = () -> {
for (int i = 0; i < 1000; i++) {
visitCounter.recordVisit("/index.html");
visitCounter.recordVisit("/contact.html");
}
};
Thread thread1 = new Thread(visitSimulator);
Thread thread2 = new Thread(visitSimulator);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Index Page Visits: " + visitCounter.getVisitCount("/index.html"));
System.out.println("Contact Page Visits: " + visitCounter.getVisitCount("/contact.html"));
В этом примере мы используем synchronizedMap для подсчета посещений страниц. Метод merge() безопасен для использования в многопоточной среде, что позволяет корректно увеличивать счетчики.
Пример 4: Синхронизированный доступ к общему ресурсу
Рассмотрим задачу, в которой несколько потоков должны безопасно добавлять элементы в общий список и извлекать их для обработки. Важно, чтобы все операции были синхронизированы, чтобы избежать потери данных.
Задача: Создать потокобезопасную очередь задач.
import java.util.Queue;
import java.util.LinkedList;
import java.util.Collections;
public class SynchronizedTaskQueue {
private final Queue<String> taskQueue = Collections.synchronizedList(new LinkedList<>());
public void addTask(String task) {
synchronized (taskQueue) {
taskQueue.add(task);
taskQueue.notify(); // Уведомляем ждущий поток о новой задаче
}
}
public String getTask() throws InterruptedException {
synchronized (taskQueue) {
while (taskQueue.isEmpty()) {
taskQueue.wait(); // Ждем, пока появится новая задача
}
return taskQueue.poll();
}
}
}
// Пример использования
SynchronizedTaskQueue queue = new SynchronizedTaskQueue();
// Поток для добавления задач
Thread producer = new Thread(() -> {
for (int i = 0; i < 5; i++) {
queue.addTask("Task " + i);
}
});
// Поток для обработки задач
Thread consumer = new Thread(() -> {
try {
for (int i = 0; i < 5; i++) {
String task = queue.getTask();
System.out.println("Processing " + task);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
producer.start();
consumer.start();
В этом примере мы используем синхронизированную очередь задач, где метод addTask() добавляет задачи в очередь и уведомляет ждущие потоки, а метод getTask() ждет появления новой задачи, если очередь пуста. Таким образом, обеспечивается безопасный доступ к общему ресурсу в многопоточной среде.
#Java #Training #Medium #SynchronizedCollections
Properties, особенности и внутреннее устройство
Properties — это подкласс Hashtable, который используется для хранения ключей и значений в виде строк. Этот класс особенно полезен для хранения конфигурационных данных, таких как настройки приложений, пути к файлам, параметры базы данных и другие подобные параметры.
Основные характеристики Properties:
Наследование от Hashtable: Properties наследуется от класса Hashtable, что позволяет ему использовать все методы и возможности, предоставляемые Hashtable, такие как вставка, удаление, поиск и итерация по элементам.
Хранение только строк: В отличие от Hashtable, Properties хранит только строки в качестве ключей и значений. Это делает его удобным для работы с текстовыми конфигурациями.
Поддержка файлов: Properties предоставляет методы для загрузки и сохранения данных из/в файлы в формате .properties, что делает его идеальным для хранения конфигурационных файлов.
Внутреннее устройство класса Properties
Класс Properties реализован на основе хеш-таблицы, что позволяет эффективно хранить и извлекать данные. Однако, чтобы глубже понять, как работает Properties, давайте рассмотрим его внутреннее устройство.
Основные компоненты:
Наследование от Hashtable: Класс Properties наследует функциональность от Hashtable, что позволяет ему использовать хеширование для быстрого доступа к элементам.
Поля defaults: Поле defaults позволяет определить другой объект Properties, который будет использоваться для предоставления значений по умолчанию, если ключ не найден в текущем объекте.
Методы getProperty() и setProperty(): Эти методы являются основными для работы с парами "ключ-значение" и обеспечивают удобный интерфейс для получения и установки свойств.
Методы load() и store(): Эти методы используются для загрузки свойств из файла и сохранения их обратно в файл. Формат файла .properties поддерживает простую структуру текста, где каждая строка представляет собой пару "ключ=значение".
Формат файлов .properties
Файлы с расширением .properties содержат конфигурационные данные в текстовом формате. Эти файлы широко используются для хранения настроек приложений, переводов и других данных, которые могут изменяться без необходимости изменения исходного кода.
Пример файла config.properties:
#Java #Training #Medium #Properties
Properties — это подкласс Hashtable, который используется для хранения ключей и значений в виде строк. Этот класс особенно полезен для хранения конфигурационных данных, таких как настройки приложений, пути к файлам, параметры базы данных и другие подобные параметры.
Основные характеристики Properties:
Наследование от Hashtable: Properties наследуется от класса Hashtable, что позволяет ему использовать все методы и возможности, предоставляемые Hashtable, такие как вставка, удаление, поиск и итерация по элементам.
Хранение только строк: В отличие от Hashtable, Properties хранит только строки в качестве ключей и значений. Это делает его удобным для работы с текстовыми конфигурациями.
Поддержка файлов: Properties предоставляет методы для загрузки и сохранения данных из/в файлы в формате .properties, что делает его идеальным для хранения конфигурационных файлов.
Внутреннее устройство класса Properties
Класс Properties реализован на основе хеш-таблицы, что позволяет эффективно хранить и извлекать данные. Однако, чтобы глубже понять, как работает Properties, давайте рассмотрим его внутреннее устройство.
public class Properties extends Hashtable<Object, Object> {
// Хранение значений по умолчанию
protected Properties defaults;
// Конструкторы
public Properties() {
this(null);
}
public Properties(Properties defaults) {
this.defaults = defaults;
}
// Основные методы
public String getProperty(String key) {
Object oval = super.get(key);
String sval = (oval instanceof String) ? (String)oval : null;
return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}
public String getProperty(String key, String defaultValue) {
String val = getProperty(key);
return (val == null) ? defaultValue : val;
}
public Object setProperty(String key, String value) {
return put(key, value);
}
// Методы для работы с файлами
public void load(InputStream inStream) throws IOException {
// ...
}
public void store(OutputStream out, String comments) throws IOException {
// ...
}
}
Основные компоненты:
Наследование от Hashtable: Класс Properties наследует функциональность от Hashtable, что позволяет ему использовать хеширование для быстрого доступа к элементам.
Поля defaults: Поле defaults позволяет определить другой объект Properties, который будет использоваться для предоставления значений по умолчанию, если ключ не найден в текущем объекте.
Методы getProperty() и setProperty(): Эти методы являются основными для работы с парами "ключ-значение" и обеспечивают удобный интерфейс для получения и установки свойств.
Методы load() и store(): Эти методы используются для загрузки свойств из файла и сохранения их обратно в файл. Формат файла .properties поддерживает простую структуру текста, где каждая строка представляет собой пару "ключ=значение".
Формат файлов .properties
Файлы с расширением .properties содержат конфигурационные данные в текстовом формате. Эти файлы широко используются для хранения настроек приложений, переводов и других данных, которые могут изменяться без необходимости изменения исходного кода.
Пример файла config.properties:
database.url=jdbc:mysql://localhost:3306/mydb
database.username=root
database.password=12345
Файл .properties имеет простой формат: каждая строка представляет собой пару "ключ=значение". Комментарии могут быть добавлены с помощью символов # или ! в начале строки.
#Java #Training #Medium #Properties
Особенности работы с Properties
Преемственность значений по умолчанию:
Одной из интересных возможностей Properties является возможность указания значений по умолчанию. Например, вы можете создать объект Properties, который будет содержать значения по умолчанию, и передать его в другой объект Properties.
Работа с файлами:
Одним из ключевых преимуществ Properties является его возможность загружать и сохранять свойства в файлы. Это особенно полезно для создания конфигурационных файлов, которые могут быть изменены без перекомпиляции приложения.
Обработка строковых значений:
Properties работают исключительно с строками, поэтому любые данные, которые необходимо хранить, должны быть преобразованы в строки. Это накладывает определенные ограничения, но также упрощает сериализацию и десериализацию данных.
Управление локализацией:
Properties часто используются в связке с ResourceBundle для управления переводами и локализацией в приложениях. Это позволяет легко поддерживать несколько языков в приложении, используя различные файлы .properties для каждого языка.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-properties
https://www.geeksforgeeks.org/java-util-properties-class-java/
#Java #Training #Medium #Properties
Преемственность значений по умолчанию:
Одной из интересных возможностей Properties является возможность указания значений по умолчанию. Например, вы можете создать объект Properties, который будет содержать значения по умолчанию, и передать его в другой объект Properties.
Properties defaults = new Properties();
defaults.setProperty("language", "English");
Properties config = new Properties(defaults);
config.setProperty("database.url", "jdbc:mysql://localhost:3306/mydb");
System.out.println(config.getProperty("language")); // Выведет: English
В данном примере, если запрашиваемое свойство не найдено в объекте config, оно будет искаться в объекте defaults.
Работа с файлами:
Одним из ключевых преимуществ Properties является его возможность загружать и сохранять свойства в файлы. Это особенно полезно для создания конфигурационных файлов, которые могут быть изменены без перекомпиляции приложения.
try (FileInputStream input = new FileInputStream("config.properties")) {
Properties config = new Properties();
config.load(input);
System.out.println(config.getProperty("database.url"));
} catch (IOException e) {
e.printStackTrace();
}
В этом примере Properties загружаются из файла config.properties, и после этого можно получить доступ к его значениям.
Обработка строковых значений:
Properties работают исключительно с строками, поэтому любые данные, которые необходимо хранить, должны быть преобразованы в строки. Это накладывает определенные ограничения, но также упрощает сериализацию и десериализацию данных.
Управление локализацией:
Properties часто используются в связке с ResourceBundle для управления переводами и локализацией в приложениях. Это позволяет легко поддерживать несколько языков в приложении, используя различные файлы .properties для каждого языка.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-properties
https://www.geeksforgeeks.org/java-util-properties-class-java/
#Java #Training #Medium #Properties
Baeldung
Getting Started with Java Properties | Baeldung
Learn how to work with key-value pairs in Java using the java.util.Properties class.
Что выведет код?
#Tasks
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 10;
int c = a;
a = b;
b = c;
System.out.println(a + " " + b + " " + c);
}
}
#Tasks
❗️ ВНИМАНИЕ ❗️
Уважаемые подписчики, для разработки тестовой мини игры на языке JAVA, мы ищем 5-6 новичков в тестовую команду.
Что предстоит тем, кто примет участие:
- погружение в проектирование кода, совместное обдумывание и поиск оптимальных решений при помощи Miro.
- написание кода на Java Core.
- получение задач в JIRA (само собой обучение взаимодействию).
- реализация основных действия на GitHub: clone, pull, push и т.д. (и обучение всему этому).
- работа в команде.
Зачем нам все это?
Основная цель как не странно, это не готовый продукт, а прокачка софт-скилов, таких как командное взаимодействие, понимание процессов разработки, работы в Git и JIRA (которые требуются в каждой второй вакансии на HH), укрепить и улучшить работу с JAVA Core.
Требования:
- 2-3 часа свободно времени в день (в промежутке от 16 до 22 по МСК для общения с командой).
- Начальное знание JAVA Core. (Рассмотрим варианты)
- Неконфликтность и желание учиться))).
Пишите Ваши предложения в комментариях!
Всем лучей добра😉🔆
Уважаемые подписчики, для разработки тестовой мини игры на языке JAVA, мы ищем 5-6 новичков в тестовую команду.
Что предстоит тем, кто примет участие:
- погружение в проектирование кода, совместное обдумывание и поиск оптимальных решений при помощи Miro.
- написание кода на Java Core.
- получение задач в JIRA (само собой обучение взаимодействию).
- реализация основных действия на GitHub: clone, pull, push и т.д. (и обучение всему этому).
- работа в команде.
Зачем нам все это?
Основная цель как не странно, это не готовый продукт, а прокачка софт-скилов, таких как командное взаимодействие, понимание процессов разработки, работы в Git и JIRA (которые требуются в каждой второй вакансии на HH), укрепить и улучшить работу с JAVA Core.
Требования:
- 2-3 часа свободно времени в день (в промежутке от 16 до 22 по МСК для общения с командой).
- Начальное знание JAVA Core. (Рассмотрим варианты)
- Неконфликтность и желание учиться))).
Пишите Ваши предложения в комментариях!
Всем лучей добра😉🔆
Основные методы Properties и примеры использования
setProperty(String key, String value):
Этот метод используется для добавления или обновления пары "ключ-значение" в объекте Properties.
getProperty(String key):
Метод getProperty() позволяет получить значение свойства по его ключу. Если ключ не найден, метод вернет null.
getProperty(String key, String defaultValue):
Этот метод позволяет указать значение по умолчанию, которое будет возвращено в случае, если ключ не найден в объекте Properties.
load(InputStream inStream):
Метод load() загружает свойства из потока ввода (например, из файла).
store(OutputStream out, String comments):
Метод store() сохраняет свойства в выходной поток (например, в файл). Метод также позволяет добавить комментарии, которые будут записаны в начале файла.
propertyNames():
Метод propertyNames() возвращает перечисление всех ключей, содержащихся в объекте Properties.
stringPropertyNames():
Этот метод возвращает набор всех ключей, которые представлены строками.
remove(String key):
Метод remove() удаляет свойство по указанному ключу.
clear():
Метод clear() очищает все свойства из объекта Properties.
#Java #Training #Medium #Properties
setProperty(String key, String value):
Этот метод используется для добавления или обновления пары "ключ-значение" в объекте Properties.
Properties config = new Properties();
config.setProperty("database.url", "jdbc:mysql://localhost:3306/mydb");
config.setProperty("database.username", "root");
config.setProperty("database.password", "12345");
В этом примере мы создаем объект Properties и устанавливаем три свойства: URL базы данных, имя пользователя и пароль.
getProperty(String key):
Метод getProperty() позволяет получить значение свойства по его ключу. Если ключ не найден, метод вернет null.
String url = config.getProperty("database.url");
System.out.println("Database URL: " + url);
В этом примере значение свойства database.url извлекается и выводится на консоль.
getProperty(String key, String defaultValue):
Этот метод позволяет указать значение по умолчанию, которое будет возвращено в случае, если ключ не найден в объекте Properties.
String timeout = config.getProperty("connection.timeout", "30");
System.out.println("Connection timeout: " + timeout);
Если свойство connection.timeout не будет найдено, метод вернет значение "30".
load(InputStream inStream):
Метод load() загружает свойства из потока ввода (например, из файла).
try (FileInputStream input = new FileInputStream("config.properties")) {
Properties config = new Properties();
config.load(input);
} catch (IOException e) {
e.printStackTrace();
}
В этом примере свойства загружаются из файла config.properties.
store(OutputStream out, String comments):
Метод store() сохраняет свойства в выходной поток (например, в файл). Метод также позволяет добавить комментарии, которые будут записаны в начале файла.
try (FileOutputStream output = new FileOutputStream("config.properties")) {
config.store(output, "Database Configuration");
} catch (IOException e) {
e.printStackTrace();
}
В этом примере свойства сохраняются в файл config.properties, и в файл добавляется комментарий "Database Configuration".
propertyNames():
Метод propertyNames() возвращает перечисление всех ключей, содержащихся в объекте Properties.
Enumeration<?> propertyNames = config.propertyNames();
while (propertyNames.hasMoreElements()) {
String key = (String) propertyNames.nextElement();
System.out.println("Key: " + key + ", Value: " + config.getProperty(key));
}
В этом примере мы перебираем все ключи и выводим их вместе с соответствующими значениями.
stringPropertyNames():
Этот метод возвращает набор всех ключей, которые представлены строками.
Set<String> keys = config.stringPropertyNames();
for (String key : keys) {
System.out.println("Key: " + key + ", Value: " + config.getProperty(key));
}
stringPropertyNames() полезен, когда нужно работать с Set, а не с Enumeration.
remove(String key):
Метод remove() удаляет свойство по указанному ключу.
config.remove("database.password");
В этом примере удаляется свойство database.password.
clear():
Метод clear() очищает все свойства из объекта Properties.
config.clear();
После вызова этого метода все свойства будут удалены из объекта Properties.
#Java #Training #Medium #Properties
Примеры использования класса Properties
Пример 1: Загрузка и сохранение конфигурации приложения
Часто приложения требуют загрузки конфигурационных параметров из файла при старте и их сохранения при завершении.
Пример 2: Локализация с использованием ResourceBundle
Класс Properties может использоваться совместно с ResourceBundle для реализации локализации приложения. Например, хранение сообщений на разных языках в отдельных файлах .properties.
Пример 3: Автозаполнение настроек по умолчанию
Иногда нужно использовать настройки по умолчанию, если они не указаны в конфигурационном файле.
#Java #Training #Medium #Properties
Пример 1: Загрузка и сохранение конфигурации приложения
Часто приложения требуют загрузки конфигурационных параметров из файла при старте и их сохранения при завершении.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class AppConfig {
private Properties config = new Properties();
private String configFilePath;
public AppConfig(String configFilePath) {
this.configFilePath = configFilePath;
loadConfig();
}
public void loadConfig() {
try (FileInputStream input = new FileInputStream(configFilePath)) {
config.load(input);
} catch (IOException e) {
e.printStackTrace();
}
}
public void saveConfig() {
try (FileOutputStream output = new FileOutputStream(configFilePath)) {
config.store(output, "Application Configuration");
} catch (IOException e) {
e.printStackTrace();
}
}
public String getSetting(String key, String defaultValue) {
return config.getProperty(key, defaultValue);
}
public void setSetting(String key, String value) {
config.setProperty(key, value);
}
public static void main(String[] args) {
AppConfig appConfig = new AppConfig("app.properties");
// Получение настроек
String url = appConfig.getSetting("database.url", "jdbc:mysql://localhost:3306/defaultdb");
System.out.println("Database URL: " + url);
// Установка и сохранение настроек
appConfig.setSetting("app.theme", "dark");
appConfig.saveConfig();
}
}
В этом примере класс AppConfig управляет загрузкой и сохранением конфигурации приложения, хранящейся в файле app.properties.
Пример 2: Локализация с использованием ResourceBundle
Класс Properties может использоваться совместно с ResourceBundle для реализации локализации приложения. Например, хранение сообщений на разных языках в отдельных файлах .properties.
import java.util.Locale;
import java.util.ResourceBundle;
public class LocalizationExample {
public static void main(String[] args) {
Locale currentLocale = new Locale("en", "US");
ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greeting"));
}
}
Предположим, у нас есть два файла:
MessagesBundle_en_US.properties:
makefile
Копировать код
greeting=Hello!
MessagesBundle_fr_FR.properties:
makefile
Копировать код
greeting=Bonjour!
В зависимости от выбранной локали, приложение будет загружать соответствующий файл и использовать правильные сообщения.
Пример 3: Автозаполнение настроек по умолчанию
Иногда нужно использовать настройки по умолчанию, если они не указаны в конфигурационном файле.
import java.util.Properties;
public class DefaultSettingsExample {
public static void main(String[] args) {
Properties defaults = new Properties();
defaults.setProperty("app.theme", "light");
defaults.setProperty("app.language", "en");
Properties config = new Properties(defaults);
config.setProperty("app.theme", "dark");
System.out.println("Theme: " + config.getProperty("app.theme")); // Вывод: dark
System.out.println("Language: " + config.getProperty("app.language")); // Вывод: en
}
}
Здесь Properties использует значения по умолчанию, если они не были переопределены в основном конфигурационном объекте.
#Java #Training #Medium #Properties
Пример 4: Хранение пользовательских настроек
Предположим, у нас есть приложение, которое позволяет пользователям изменять настройки интерфейса, такие как тема или язык. Эти настройки можно сохранять в файл Properties, чтобы при следующем запуске приложения они автоматически подгружались.
#Java #Training #Medium #Properties
Предположим, у нас есть приложение, которое позволяет пользователям изменять настройки интерфейса, такие как тема или язык. Эти настройки можно сохранять в файл Properties, чтобы при следующем запуске приложения они автоматически подгружались.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class UserSettings {
private Properties settings = new Properties();
private String settingsFilePath;
public UserSettings(String settingsFilePath) {
this.settingsFilePath = settingsFilePath;
loadSettings();
}
private void loadSettings() {
try (FileInputStream input = new FileInputStream(settingsFilePath)) {
settings.load(input);
} catch (IOException e) {
System.out.println("Using default settings.");
}
}
public void saveSettings() {
try (FileOutputStream output = new FileOutputStream(settingsFilePath)) {
settings.store(output, "User Settings");
} catch (IOException e) {
e.printStackTrace();
}
}
public String getTheme() {
return settings.getProperty("theme", "light");
}
public void setTheme(String theme) {
settings.setProperty("theme", theme);
}
public String getLanguage() {
return settings.getProperty("language", "en");
}
public void setLanguage(String language) {
settings.setProperty("language", language);
}
public static void main(String[] args) {
UserSettings userSettings = new UserSettings("user.properties");
System.out.println("Current theme: " + userSettings.getTheme());
System.out.println("Current language: " + userSettings.getLanguage());
userSettings.setTheme("dark");
userSettings.setLanguage("fr");
userSettings.saveSettings();
}
}
В этом примере пользовательские настройки хранятся в файле user.properties и загружаются при запуске приложения. Пользователь может изменить тему и язык, и эти изменения сохраняются для последующего использования.
#Java #Training #Medium #Properties
Всем доброго субботнего утра!☀️
Надеюсь у всех была продуктивная неделя, все цели достигнуты и все желания выполнены!
У кого какие планы? Давайте уже, выкладывайте ваши пет-проекты, будем учиться друг у друга)))
====================================================
А я, если честно, еще не определился с темой которую будем рассматривать на встрече завтра🤷♂️, но думаю что-то придумаю)))
Есть мысли рассмотреть Docker или создание своей кастомной @аннотации))
Если у Вас есть идеи - предлагайте, рассмотрим)))😉
Надеюсь у всех была продуктивная неделя, все цели достигнуты и все желания выполнены!
У кого какие планы? Давайте уже, выкладывайте ваши пет-проекты, будем учиться друг у друга)))
====================================================
А я, если честно, еще не определился с темой которую будем рассматривать на встрече завтра🤷♂️, но думаю что-то придумаю)))
Есть мысли рассмотреть Docker или создание своей кастомной @аннотации))
Если у Вас есть идеи - предлагайте, рассмотрим)))😉
Всем привет!🖐
Сегодня, впрочем как и во все воскресения последних нескольких месяцев, в 16:00 по МСК, будет создана онлайн-встреча.
На ней я расскажу что такое Docker, как его установить и запустить. Рассмотрим что такое Dokerfile, docker-compose.yaml, тестово их напишем и запустим Postgresql, поработаем с ней через IntelliJ IDEA.
План амбициозный, но постараемся все сделать))))
Приходите будет интересно)
Сегодня, впрочем как и во все воскресения последних нескольких месяцев, в 16:00 по МСК, будет создана онлайн-встреча.
На ней я расскажу что такое Docker, как его установить и запустить. Рассмотрим что такое Dokerfile, docker-compose.yaml, тестово их напишем и запустим Postgresql, поработаем с ней через IntelliJ IDEA.
План амбициозный, но постараемся все сделать))))
Приходите будет интересно)
Все, или почти все о Docker. Встреча от 01.09.2024
Запись нашей сегодняшней встречи -
YOUTUBE
RUTUBE
Спасибо тем кто смог прийти, за участие и вопросы!
На сегодняшней встрече, мы рассмотрели на примерах основные тезисы о Docker, его установке, настройке, и запуске.
Основное о Dockerfile, docker-compose.yaml.
Запустили Postgresql в контейнере, посмотрели его в работе.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем теплого вечера и хорошего настроения! 🫡✌️
Запись нашей сегодняшней встречи -
YOUTUBE
RUTUBE
Спасибо тем кто смог прийти, за участие и вопросы!
На сегодняшней встрече, мы рассмотрели на примерах основные тезисы о Docker, его установке, настройке, и запуске.
Основное о Dockerfile, docker-compose.yaml.
Запустили Postgresql в контейнере, посмотрели его в работе.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем теплого вечера и хорошего настроения! 🫡✌️
Встреча_в_Телемосте_01_09_24_20_08_55_—_запись.webm
274.8 MB
Для тех кто не смог победить блокировку Youtube и не желает заходить в Rutube выкладываю видео тут!
Смотрите на здоровье) 🫡
#online_meeting
Смотрите на здоровье) 🫡
#online_meeting
Collections, особенности и внутреннее устройство
Работа с коллекциями — это неотъемлемая часть программирования на Java. Коллекции позволяют разработчикам удобно управлять группами объектов, будь то списки, множества, очереди или карты. Коллекции являются частью структуры данных и играют важную роль в решении множества задач, таких как сортировка, фильтрация и агрегирование данных.
Что такое коллекции?
Коллекции в Java представляют собой архитектуру, позволяющую группировать объекты, чтобы упростить управление и манипулирование ими. В Java коллекции представлены в виде интерфейсов и классов, которые обеспечивают удобные методы для работы с данными. Основные интерфейсы коллекций включают List, Set, Queue, Deque и Map. Каждый из этих интерфейсов реализуется различными классами, которые обеспечивают конкретную реализацию соответствующих структур данных.
Иерархия коллекций в Java начинается с интерфейса Collection, который является корневым интерфейсом для всех коллекций, за исключением Map. Вот основные интерфейсы и классы, которые используются для создания коллекций:
Collection: Основной интерфейс, от которого наследуются другие коллекции.
List: Коллекция, представляющая собой упорядоченный набор элементов, допускающий дублирование. Примеры: ArrayList, LinkedList.
Set: Коллекция, не допускающая дублирование элементов. Примеры: HashSet, TreeSet.
Queue: Коллекция, представляющая собой очередь, работающую по принципу FIFO (first-in, first-out). Примеры: LinkedList, PriorityQueue.
Deque: Двусторонняя очередь, позволяющая добавлять и удалять элементы с обеих сторон. Примеры: ArrayDeque, LinkedList.
Map: Интерфейс для хранения пар «ключ-значение», где каждый ключ уникален. Примеры: HashMap, TreeMap, LinkedHashMap.
Внутреннее устройство коллекций
Каждая коллекция в Java имеет свое уникальное внутреннее устройство и особенности, которые делают её подходящей для решения определенных задач:
1. ArrayList
ArrayList является реализацией интерфейса List, которая использует динамический массив для хранения элементов. Это означает, что элементы в ArrayList могут быть доступны по индексу, и этот доступ осуществляется за константное время (O(1)). Однако добавление новых элементов может потребовать перераспределения массива, что занимает время O(n). ArrayList отлично подходит для задач, где требуется частый доступ к элементам по индексу.
2. LinkedList
LinkedList также реализует интерфейс List, но использует связный список для хранения элементов. В отличие от ArrayList, LinkedList обеспечивает эффективное добавление и удаление элементов в начале и середине списка, поскольку для этого не требуется перераспределение памяти. Однако доступ к элементам по индексу занимает больше времени, так как необходимо последовательно переходить от одного узла к другому.
#Java #Training #Medium #Collections
Работа с коллекциями — это неотъемлемая часть программирования на Java. Коллекции позволяют разработчикам удобно управлять группами объектов, будь то списки, множества, очереди или карты. Коллекции являются частью структуры данных и играют важную роль в решении множества задач, таких как сортировка, фильтрация и агрегирование данных.
Что такое коллекции?
Коллекции в Java представляют собой архитектуру, позволяющую группировать объекты, чтобы упростить управление и манипулирование ими. В Java коллекции представлены в виде интерфейсов и классов, которые обеспечивают удобные методы для работы с данными. Основные интерфейсы коллекций включают List, Set, Queue, Deque и Map. Каждый из этих интерфейсов реализуется различными классами, которые обеспечивают конкретную реализацию соответствующих структур данных.
Иерархия коллекций в Java начинается с интерфейса Collection, который является корневым интерфейсом для всех коллекций, за исключением Map. Вот основные интерфейсы и классы, которые используются для создания коллекций:
Collection: Основной интерфейс, от которого наследуются другие коллекции.
List: Коллекция, представляющая собой упорядоченный набор элементов, допускающий дублирование. Примеры: ArrayList, LinkedList.
Set: Коллекция, не допускающая дублирование элементов. Примеры: HashSet, TreeSet.
Queue: Коллекция, представляющая собой очередь, работающую по принципу FIFO (first-in, first-out). Примеры: LinkedList, PriorityQueue.
Deque: Двусторонняя очередь, позволяющая добавлять и удалять элементы с обеих сторон. Примеры: ArrayDeque, LinkedList.
Map: Интерфейс для хранения пар «ключ-значение», где каждый ключ уникален. Примеры: HashMap, TreeMap, LinkedHashMap.
Внутреннее устройство коллекций
Каждая коллекция в Java имеет свое уникальное внутреннее устройство и особенности, которые делают её подходящей для решения определенных задач:
1. ArrayList
ArrayList является реализацией интерфейса List, которая использует динамический массив для хранения элементов. Это означает, что элементы в ArrayList могут быть доступны по индексу, и этот доступ осуществляется за константное время (O(1)). Однако добавление новых элементов может потребовать перераспределения массива, что занимает время O(n). ArrayList отлично подходит для задач, где требуется частый доступ к элементам по индексу.
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println("List: " + list);
}
}
2. LinkedList
LinkedList также реализует интерфейс List, но использует связный список для хранения элементов. В отличие от ArrayList, LinkedList обеспечивает эффективное добавление и удаление элементов в начале и середине списка, поскольку для этого не требуется перераспределение памяти. Однако доступ к элементам по индексу занимает больше времени, так как необходимо последовательно переходить от одного узла к другому.
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println("List: " + list);
}
}
#Java #Training #Medium #Collections
3. HashSet
HashSet реализует интерфейс Set и хранит элементы в виде хэш-таблицы. В HashSet не допускается дублирование элементов, и порядок их хранения не гарантируется. Хэш-таблица обеспечивает быстрый доступ к элементам (O(1)), что делает HashSet отличным выбором для задач, где важна производительность при добавлении и поиске уникальных элементов.
4. TreeSet
TreeSet также реализует интерфейс Set, но хранит элементы в отсортированном порядке с использованием красно-черного дерева. Доступ к элементам и операции добавления выполняются за логарифмическое время (O(log n)). TreeSet используется, когда необходимо поддерживать элементы в отсортированном порядке.
5. HashMap
HashMap реализует интерфейс Map и хранит данные в виде пар «ключ-значение». Ключи в HashMap уникальны, и доступ к значениям по ключу осуществляется за константное время (O(1)). HashMap является отличным выбором для хранения ассоциативных массивов, где важна производительность при доступе к данным по ключу.
Особенности коллекций
Изменяемые и неизменяемые коллекции: Большинство коллекций в Java являются изменяемыми, что означает, что их элементы можно добавлять, удалять и изменять. Однако существуют и неизменяемые коллекции, которые нельзя изменить после создания. Создание неизменяемых коллекций особенно важно в многопоточных приложениях для предотвращения непредсказуемого поведения.
Синхронизированные коллекции: Коллекции, такие как ArrayList и HashMap, не синхронизированы по умолчанию, что делает их небезопасными для многопоточной среды. Java предоставляет методы для создания синхронизированных коллекций, например, с использованием Collections.synchronizedList().
Производительность: Выбор правильной коллекции влияет на производительность приложения. Например, для частых операций вставки и удаления в середине списка лучше подходит LinkedList, тогда как для доступа по индексу предпочтительнее использовать ArrayList.
#Java #Training #Medium #Collections
HashSet реализует интерфейс Set и хранит элементы в виде хэш-таблицы. В HashSet не допускается дублирование элементов, и порядок их хранения не гарантируется. Хэш-таблица обеспечивает быстрый доступ к элементам (O(1)), что делает HashSet отличным выбором для задач, где важна производительность при добавлении и поиске уникальных элементов.
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
set.add("Apple"); // Дубликат не будет добавлен
System.out.println("Set: " + set);
}
}
4. TreeSet
TreeSet также реализует интерфейс Set, но хранит элементы в отсортированном порядке с использованием красно-черного дерева. Доступ к элементам и операции добавления выполняются за логарифмическое время (O(log n)). TreeSet используется, когда необходимо поддерживать элементы в отсортированном порядке.
import java.util.Set;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("Banana");
set.add("Apple");
set.add("Cherry");
System.out.println("Sorted Set: " + set);
}
}
5. HashMap
HashMap реализует интерфейс Map и хранит данные в виде пар «ключ-значение». Ключи в HashMap уникальны, и доступ к значениям по ключу осуществляется за константное время (O(1)). HashMap является отличным выбором для хранения ассоциативных массивов, где важна производительность при доступе к данным по ключу.
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);
System.out.println("Map: " + map);
}
}
Особенности коллекций
Изменяемые и неизменяемые коллекции: Большинство коллекций в Java являются изменяемыми, что означает, что их элементы можно добавлять, удалять и изменять. Однако существуют и неизменяемые коллекции, которые нельзя изменить после создания. Создание неизменяемых коллекций особенно важно в многопоточных приложениях для предотвращения непредсказуемого поведения.
Синхронизированные коллекции: Коллекции, такие как ArrayList и HashMap, не синхронизированы по умолчанию, что делает их небезопасными для многопоточной среды. Java предоставляет методы для создания синхронизированных коллекций, например, с использованием Collections.synchronizedList().
Производительность: Выбор правильной коллекции влияет на производительность приложения. Например, для частых операций вставки и удаления в середине списка лучше подходит LinkedList, тогда как для доступа по индексу предпочтительнее использовать ArrayList.
#Java #Training #Medium #Collections
Что выведет код?
#Tasks
import java.util.*;
public class Main {
public static void main(String[] args) {
Set<String> set = new HashSet<>(Arrays.asList("apple", "banana", "cherry", "date"));
set.removeIf(s -> s.length() > 5);
System.out.println(set);
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
14%
[banana, cherry, apple, date]
10%
[banana, date]
62%
[apple, date]
14%
[cherry, apple, date]