Telegram Web Link
От Java до Kotlin, или первое впечатление от циклов for

Хотя Kotlin основан на Java, но он имеет множество отличий. Например, стандартные циклы for в Java не будут работать так же эффективно в Kotlin.

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

https://dev.to/bacongubbe/from-java-to-kotlin-first-impression-on-for-loops-42f8

@javatg
🖥 Понимание различий между методами List.of() и Arrays.asList

List.of() — это фабричный метод, впервые представленный в Java 9, который создает неизменяемый список, содержащий указанные элементы. Вот несколько ключевых моментов, на которые вам следует обратить внимание, изучая List.of():Неизменяемость: полученный список неизменен, то есть его размер и элементы не могут быть изменены после создания.

Фиксированный размер: список, созданный List.of(), имеет фиксированный размер и не поддерживает добавление или удаление элементов.

Нулевые значени: List.of() не допускает нулевых элементов. Если вы попытаетесь добавить null, появится исключение NullPointerException.
Пример использования:

List<String> immutable_list = List.of("apple", "banana", "orange");

Arrays.asList()
Arrays.asList() — это метод, доступный еще в ранних версиях Java, и он предоставляет удобный способ создания изменяемого списка, поддерживаемого массивом.

Рассмотрим его характеристики:

Модифицируемость: полученный из Arrays.asList() список можно модифицировать, что позволяет добавлять, удалять или изменять элементы.

Поддерживается массивом: список поддерживается исходным массивом, поэтому любые изменения в списке влияют на базовый массив и наоборот.

Ограничение фиксированного размера: несмотря на возможность изменения, размер списка, возвращаемого Arrays.asList(), является фиксированным, что предотвращает структурные модификации, такие как добавление или удаление элементов.

Нулевые значения: в отличие от List.of(), Arrays.asList() допускает нулевые элементы.

Пример использования:


List<String> mutable_list = Arrays.asList("red", "green", "blue");

📌 Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Задача о максимальной сумме подмассива (алгоритм Кадане) на Java
Дан целочисленный массив, найдите в нем непрерывный подмассив с наибольшей суммой.

Например:
Input: {-2, 1, -3, 4, -1, 2, 1, -5, 4}

Output: Subarray with the largest sum is {4, -1, 2, 1} with sum 6.


Мы можем легко решить эту задачу за линейное время, используя Алгоритм Кадане.
Идея состоит в том, чтобы поддерживать максимальный (с положительной суммой) подмассив, “заканчивающийся” на каждом индексе данного массива. Этот подмассив либо пуст (в этом случае его сумма равна нулю), либо состоит на один элемент больше, чем максимальный подмассив, оканчивающийся на предыдущем индексе.

Алгоритм может быть реализован следующим образом на Java:
class Main
{
// Функция для нахождения максимальной суммы непрерывного подмассива
// в заданном целочисленном массиве
public static int kadane(int[] arr)
{
// сохраняет максимальный суммарный подмассив, найденный на данный момент
int maxSoFar = 0;

// сохраняет максимальную сумму подмассива, заканчивающегося на текущей позиции
int maxEndingHere = 0;

// обход заданного массива
for (int i: arr)
{
// обновить максимальную сумму подмассива, "заканчивающегося" на индексе "i" (путем добавления
// текущий элемент до максимальной суммы, заканчивающейся на предыдущем индексе 'i-1')
maxEndingHere = maxEndingHere + i;

// если максимальная сумма отрицательна, устанавливаем ее в 0 (что представляет
// пустой подмассив)
maxEndingHere = Integer.max(maxEndingHere, 0);

// обновить результат, если текущая сумма подмассива окажется больше
maxSoFar = Integer.max(maxSoFar, maxEndingHere);
}

return maxSoFar;
}

public static void main(String[] args)
{
int[] arr = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };

System.out.println("The sum of contiguous subarray with the " +
"largest sum is " + kadane(arr));
}
}


результат:

The maximum sum of a contiguous subarray is 6

Временная сложность приведенного выше решения равна O(n) и не требует дополнительного места, где n это размер ввода.

Приведенный выше код не обрабатывает случай, когда все элементы массива отрицательные. Если массив содержит все отрицательные значения, ответом является максимальный элемент. Мы можем легко разместить эту проверку перед тем, как продолжить алгоритм. Реализацию можно увидеть ниже на Java:

Продолжение

@javatg
Wildcards в Java Generics
Продолжаем изучать тему дженериков.

Wildcards.
Это очень важная фишка дженериков.

Пример:
public class Main {

public static void main(String[] args) {

String str = new String("Test!");
// никаких проблем
Object obj = str;

List<String> strings = new ArrayList<String>();
// ошибка компиляции!
List<Object> objects = strings;
}
}


Что же тут происходит?
Мы видим две очень похожие ситуации. В первой из них мы пытаемся привести объект String к типу Object. Никаких проблем с этим не возникает, все работает как надо.

Но вот во второй ситуации компилятор выдает ошибку. Хотя, казалось бы, мы делаем то же самое. Просто теперь мы используем коллекцию из нескольких объектов.

Но почему возникает ошибка? Какая, по сути, разница — приводим мы один объект String к типу Object или 20 объектов?
Между объектом и коллекцией объектов есть важное различие.

Если класс B является наследником класса А, то Collection<B> при этом — не наследник Collection<A>.

Именно по этой причине мы не смогли привести наш List<String> к List<Object>. String является наследником Object, но List<String> не является наследником List<Object>.

Интуитивно это выглядит не очень логично. Почему именно таким принципом руководствовались создатели языка?

Давай представим, что здесь компилятор не выдавал бы нам ошибку:
List<String> strings = new ArrayList<String>();
List<Object> objects = strings;


В этом случае, мы бы могли, например, сделать следующее:
objects.add(new Object());
String s = strings.get(0);


Поскольку компилятор не выдал нам ошибок и позволил создать ссылку List<Object> object на коллекцию строк strings, можем добавить в strings не строку, а просто любой объект Object!

Продолжение

@javatg
Попасть в команду Дзена быстрее, чем кажется! Присоединяйтесь к Hiring Days 8 и 9 июля и получите оффер за выходные не выходя из дома.

💼 Дзен — это высоконагруженный сервис, в который приходит до 150 тысяч запросов в секунду и от 30 миллионов пользователей каждый день. В команде пишут на языках Java 17, C++, Python и Go, а релизятся несколько раз в день.

🧑‍💻 Что нужно от вас: опыт работы в backend-разработке от двух лет, регистрация на сайте проекта. Сейчас ищут коллег в команды инфраструктуры и продуктовой разработки.

Регистрация открыта до 5 июля. Что самое крутое — если случится мэтч, оффер выдадут прямо за выходные. И да, всё онлайн!

Подробнее.
🖥 Задача максимальная сумма замкнутого подмассива

Сложность: Средняя

Условие задачи: дается круговой целочисленный массив nums длины n, верните максимально возможную сумму непустого подмассива nums.

Циклический массив означает, что конец массива соединяется с началом массива. Формально следующим элементом nums[i] является nums[(i + 1) % n], а предыдущим элементом nums[i] является nums[(i - 1 + n) % n].

Подмассив может включать в себя каждый элемент фиксированных чисел буфера не более одного раза. Формально, для подмассива nums[i], nums[i + 1], ..., nums[j] не существует i <= k1, k2 <= j с k1 % n == k2 % n.

Пример:

Ввод:
nums = [1,-2,3,-2]
Вывод: 3
Объяснение: [3]

Ввод: nums = [5,-3,5]
Вывод: 10

Решение

Пишите свое решение в комментариях👇

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
10 распространенных утечек памяти в Java и способы их устранения

В этом руководстве изложены оптимальные решения по поиску и устранению утечек памяти в Java на этапе кодирования.

В перечень распространенных утечек памяти в Java входят:


Статические поля и коллекции.
Незакрытые ресурсы.
Переменные ThreadLocal.
Неограниченное кэширование.
Неправильное использование слушателей событий (Event Listeners).
Неубранные корни сборки мусора.
Неуправляемые пулы потоков.
Неправильное использование шаблона Singleton.
Глубокие и сложные графы объектов.
Сторонние библиотеки.
Поскольку с утечками памяти лучше (и проще всего) всего бороться на этапе кодирования, давайте рассмотрим оптимальные способы их устранения.

Читать статью

@javatg
Каким будет результат сравнения в следующем коде?

Ответ:
s1 == s2 ? true

s1 == s3 ? false

s1 equals s3 ? true

Вопрос на понимание работы пула строк в Java и на понимание сравнения строк. Разберем детально: Переменная s1 ссылается на строку в пуле уникальных строк в памяти, переменная s2 ссылается на ту же саму строку в пуле уникальных строк, что и переменная s1, первое сравнение будет true, так как s1 и s2 ссылаются на один и тот же объект. Переменная s3 ссылается на новый объект, который не находится в пуле уникальных строк, так как он создан через new, следовательно второе сравнение будет false, так как сравниваем переменные которые ссылаются на на два разных объекта. Третье сравнение будет true, так как мы сравниваем строки посимвольно на эквивалентность через equals, а содержимое данных строк одинаково.


#junior #собеседования

@javatg
Видеокурс Kotlin с нуля

Это бесплатный видео курс по основам программирования на языке Котлин. Он подойдёт начинающим разработчикам, а также тем, у кого совсем нет опыта в программировании и кто только знакомится с этой сферой.

Вас ждёт 24 урока средней продолжительностью 10 минут, так что вы не успеете устать и сможете дозированно получать новые знания:

https://www.youtube.com/playlist?list=PLgPRahgE-Gcu4s-I9mrHUrKUp9dY6QcJC

@javatg
💌Запечатанные классы (Sealed Classes)

В релизе Java 17 компания Oracle представила новую функцию под названием Sealed Classes (запечатанные классы). По идее, она предназначена для повышения безопасности и гибкости приложений Java.
Запечатанные классы позволяют разработчикам ограничивать иерархию наследования класса или интерфейса. Иными словами, они обеспечивают больший контроль над тем, как класс может быть расширен или реализован.

Пример класса Shape, который может быть расширен классами Circle, Square или Triangle.

Синтаксис для определения запечатанного класса:
public sealed class Shape permits Circle, Square, Triangle {
// Определение класса
}


🔍Что такое сопоставление с образцом и как оно улучшает читаемость кода Java

В контексте языков программирования сопоставление с образцом — это метод, используемый для сопоставления определенного образца с заданным входом. Его можно использовать для упрощения процесса идентификации и извлечения соответствующей информации из структурированных данных, таких как объекты, списки и другие сложные типы данных.

В функциональных языках сопоставление с образцом можно использовать в качестве альтернативы традиционным операторам потока управления, таким как if-else или switch-case.

Сопоставление с образцом на примере кода:
public interface Shape {
Double area();
}

public final static class Circle implements Shape {
public final double radius;

Circle(double radius) {
this.radius = radius;
}

@Override
public Double area() {
return Math.PI * radius * radius;
}
}

public final static class Square implements Shape {
public final double side;

Square(double side) {
this.side = side;
}

@Override
public Double area() {
return side * side;
}
}

📌 Подробнее

@javatg
🗑Кэширование Redis для максимальной производительности в Spring Boot и Java

Настройка приложения Spring Boot
Для начала создайте новое приложение Spring Boot с помощью Spring Initializr. Добавьте следующие зависимости:

Web;
JPA;
Lombok;
Redis.

Вы можете создать проект и импортировать его в любимую IDE.

Настройка кэша Redis
Прежде чем использовать Redis в качестве кэша в приложении, его нужно настроить. Сначала добавьте следующие свойства в файл application.properties:

spring.redis.host=localhost
spring.redis.port=6379


Далее создайте класс конфигурации RedisCacheConfig:
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory(new RedisStandaloneConfiguration(redisHost, redisPort));
}
@Bean
public RedisCacheManager cacheManager() {
return RedisCacheManager.builder(jedisConnectionFactory()).build();
}
}


Этот класс включает поддержку кэширования и настраивает бины (объекты) JedisConnectionFactory и RedisCacheManager.

Реализация сервисов с возможностью кэширования
Создадим простой сервис, работе которого поможет кэширование. В этом примере реализуем сервис для получения информации о пользователе из базы данных.

Сначала создадим сущность User:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
}


Теперь создадим интерфейс UserRepository:
public interface UserRepository extends JpaRepository<User, Long> {}

Далее создаем UserService:

@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Cacheable(value = "users", key = "#id")
public User findById(Long id) {
return userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("User not found"));
}
}

Аннотация @Cacheable указывает на то, что результат метода findById должен быть кэширован. Атрибут value определяет имя кэша, а атрибут key  — ключ кэша.

Способы вытеснения кэша 👇

Читать продолжение

@javatg
🔥 Подборка обучающих каналов для программистов.

🖥 Machine learning
ai_ml – крупнейши канал по ии, нейросетям и науке о данных.
datasc - дата сайнс обучение самой востребованной профессии.
@bigdatai - Big Data

@machinelearning_ru – гайды по машинному обучению
@machinelearning_interview – подготовка к собеседованию мл.
@datascienceiot – бесплатные книги ds
@ArtificialIntelligencedl – ИИ

@machinee_learning – чат о машинном обучении
@datascienceml_jobs - вакансии ds, ml
@Machinelearning_Jobs - чат с вакансиями

🖥 Python
@pythonl - крупнейший канал для Python программистов.
@pro_python_code – учим python с ментором.
@python_job_interview – подготовка к Python собеседованию.
@python_testit - проверочные тесты на python
@pythonlbooks - современные книги Python
@python_djangojobs - работа для Python программистов
@python_django_work - чат обсуждения вакансий

#️⃣ c#
C# - канал для изучения C# на практике.
@csharp_cplus - C# чат
@csharp_1001_notes - инструменты C#

🖥 C++
@cpluspluc - C++ кодинг


🖥 SQL базы данных

@sqlhub - Повышение эффективности кода с грамотным использованием бд.
@chat_sql - чат изучения бд.

👣 Golang
@Golang_google - восхитительный язык от Google, мощный и перспективный.
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@golangtests - интересные тесты и задачи GO
@golangl - чат изучающих Go
@GolangJobsit - отборные вакансии и работа GO
@golang_jobsgo - чат для ищущих работу.
@golang_books - полезные книги Golang
@golang_speak - обсуждение языка Go
@golangnewss - новости go

🖥 Linux
linux - kali linux ос для хакинга
linux chat - чат linux для обучения и помощи.
@linux_read - бесплатные книги linux

🖥 Javascript / front

@react_tg - - 40,14% разработчиков сайтов использовали React в 2022 году - это самая популярная библиотека для создания сайтов.
@javascript -канал для JS и FrontEnd разработчиков. Лучшие практики и примеры кода. Туториалы и фишки JS
@Js Tests - каверзные тесты JS
@hashdev - погружение в web разработку.
@javascriptjobjs - отборные вакансии и работа FrontEnd.
@jsspeak - чат поиска FrontEnd работы.

🖥 Java
@javatg - выучить Java с senior разработчиком на практике
@javachats - чат для ответов на вопросы по Java
@java_library - библиотека книг Java
@android_its - Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит

👷‍♂️ IT работа

https://www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi -ит каналы по яп с вакансиями

🤡It memes
@memes_prog - ит-мемы

⚙️ Rust
@rust_code - Rust избавлен от болевых точек, которые есть во многих современных яп
@rust_chats - чат rust

📓 Книги

https://www.tg-me.com/addlist/HwywK4fErd8wYzQy - актуальные книги по всем яп

⭐️ Нейронные сети
@vistehno - chatgpt ведет блог, решает любые задачи и отвечает на любые ваши вопросы.
@aigen - сети для генерации картинок. видео, музыки и многого другого.
@neural – погружение в нейросети.

📢 English for coders

@english_forprogrammers - Английский для программистов

🖥PHP
@phpshka - PHP академия для программистов.

🖥 Devops
Devops - канал для DevOps специалистов.

🔥 Папки для программитов

https://www.tg-me.com/addlist/_FjtIq8qMhU0NTYy - машинное обучение, нейросети, глубокое обучение

https://www.tg-me.com/addlist/eEPya-HF6mkxMGIy - папка для Python разработчиков

https://www.tg-me.com/addlist/MUtJEeJSxeY2YTFi - папка для Golang разработчиков
Please open Telegram to view this post
VIEW IN TELEGRAM
📕 Изучение Stream API и управляющие конструкции в Java

1️⃣ Stream API. Java. Максимально простым языком

Посмотрев видео, любой новичок, изучающий язык Java, получит четкое понимание, что такое Stream API и как применять эту библиотеку при работе с кодом.

2️⃣ Управляющие конструкции в Java

Как и в любом другом языке программирования, синтаксис языка Java имеет стандартные команды управления, которые также называют управляющими конструкциями. В этом видео вы узнаете, какие команды относятся к управляющим конструкциям, и как с ними работать в Java.

3️⃣ Примитивные типы данных

Видеоурок оформлен в виде простой анимации, которая облегчит понимание темы практически каждому, включая тех, кто лишь недавно начал свое обучение языку Java.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Project Loom и Spring Boot: тесты производительности

Сегодня я хочу выяснить, готов ли Project Loom заменить Spring WebFlux при создании высоконагруженных приложений с высокой пропускной способностью.

Проблемы реактивного подхода
WebFlux - замечательная технология с фантастической производительностью, однако:

При использовании реактивного подхода код сложнее писать и сопровождать
Стектрейсы малополезны при разборе ошибок
Все связанные клиенты/библиотеки также должны быть написаны в реактивном стиле

Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🗄Создание аннотаций с использованием Reflection API.

В повседневной работе на Java мы часто сталкиваемся с аннотациями, например, с @Override. Сами по себе аннотации представляют разновидность метаданных, которые можно добавлять в исходный код Java. Классы, методы, переменные, параметры и пакеты — все они могут быть аннотированы.

Как с помощью аннотации можно проверять электронную почту?
Для этого сначала создадим аннотацию Email:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {
}


Чтобы объявить аннотацию, используйте ключевое слово @interface. В Target было объявлено, что оно будет использоваться в полях (fields), а в Retention объявлено, что оно будет использоваться во время выполнения (runtime).

Теперь воспользуемся этой аннотацией. Давайте создадим класс Person с двумя полями: age и email.
public class Person {
private String name;

@Email
private String email;

public Person(String name, String email) {
this.name = name;
this.email = email;
}

public String getName() {
return name;
}

public String getEmail() {
return email;
}
}



Обратите внимание, что электронное письмо снабжено аннотацией @Email. Теперь создадим класс ValidateUtil, который будет проверять электронную почту с помощью Reflection API.
public class ValidateUtil {

public static void validate(Object object) throws IllegalAccessException {

Class<?> class = object.getClass();
for(Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
if(field.isAnnotationPresent(Email.class)) {
validateEmail(field, object);
}
}
}

private static void validateEmail(Field field, Object object) throws IllegalAccessException {
Pattern pattern = Pattern.compile("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$");
String email = (String) field.get(object);
if(isNotMatching(pattern, email)) {
throw new InvalidEmailException("Email " + email + " is invalid");
}
}

private static boolean isNotMatching(Pattern pattern, String value) {
return !pattern.matcher(value).matches();
}
}


В методе validate он берет объект, перебирает все поля, устанавливает их как доступные и проверяет, имеет ли поле аннотацию Email. Если аннотация есть, то он вызывает метод validateEmail.

Продолжение

@javatg
⚡️ 6 лучших ресурсов для изучения Java в 2023 году

Java - один из самых популярных и универсальных языков программирования в мире. Он используется в различных областях - от веб-разработки до создания мобильных приложений и игр. Независимо от того, являетесь ли вы опытным программистом или только начинаете, Java - это отличный язык, который необходимо иметь в своем арсенале.

1️⃣ Официальные учебники Oracle по Java

2️⃣ Курс Codecademy по изучению Java

3️⃣ Coursera: Программирование на Java и основы программной инженерии

4️⃣ Udemy: Мастер-класс по программированию на Java для разработчиков программного обеспечения

5️⃣ YouTube: курс JAVA

6️⃣ Java курс 2023

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Полный список сайтов с практическимим задачами для программистов.

Любите битвы роботов? Тогда игра Robocode для вас. Вы научитесь программировать, создавая боевых роботов-танков на Java или .NET. Когда вы создадите робота, на экране в реальном времени начнётся битва.

Edabit.com - 350+ практических задач по C#

C Puzzles - cайт с головоломками на языке С. Может быть полезен и тем, кто не знает C, но изучает С-подобные языки.

Codeforces — платформа для алгоритмических соревнований. Проводит контесты и раунды с 5 задачами на 2 часа. Есть система рейтинга и два дивизиона. Задачи можно решать и проверять после соревнования. Также есть доступ к тренировкам с задачами с прошлых соревнований.

SQLEx- большой кладез знаний для тех, кто изучает SQL. Множество упражнений для отработки навыков и рейтинг участников.

HackerRank - сайт будет больше интересен продвинутым программистам, которые уже многое умеют. На этом сайте собрано множество задач на самые разные разделы Computer Science: традиционная алгоритмика, ИИ, машинное обучение и т.д. Если вы решите много задач, то вами могут заинтересоваться работодатели, регуляторно мониторящие эту платформу.

C# задачи для начинающих - помощь в решении задач. Готовые программы.

Codewars — популярный cборник задач на разные темы, от алгоритмов до шаблонов проектирования.

LeetCode — известный сайт с задачами для подготовки к собеседованиям. Можно пообщаться и посмотреть решения других программистов.

Timus Online Judge — русскоязычная (хотя английский язык также поддерживается) платформа, на которой более тысячи задач удачно отсортированы по темам и по сложности.

TopCoder - популярная американская платформа. Она проводит алгоритмические контесты, а также соревнования по промышленному программированию и марафоны, где задачи требуют исследования и нет единого верного алгоритма. Участникам даются недели на решение таких задач.

informatics.mccme.ru - платформа с теоретическим материалом и задачами, удобно разделенными по категориям. Большая база задач с олимпиад школьников также доступна.

SPOJ - большой англоязычный сайт с 20000+ задачами на разные темы: DP, графы, структуры данных и др. Иногда проводят неинтересные контесты, если не из страны их проведения.

CodeChef — менее крупный аналог Codeforces и TopCoder, тоже с огромным архивом задач и регулярными контестами.

Project Euler - сборник 500 задач, проверяющих знание математических алгоритмов. Часто используется на собеседованиях, чтобы оценить алгоритмическую подготовку кандидата.

Kaggle - соревнования по анализу данных.

Golang tests - канал с тестами по Go

CodinGame - сайт для программистов и геймеров, предлагающий большую коллекцию видеоигр, оформленных в виде задач на программирование.

Al Zimmermann’s Programming Contests — платформа, на которой регулярно проводятся контесты с задачами на исследование и оптимизацию. Интересен тем, что писать программу необязательно — даются только тестовые данные. Ответы можно расчитывать вручную, или просто гадать их на кофейной гуще.

Programming Praxis — сайт, где можно найти много интересных задач.

CheckIO — сайт с задачами для программистов всех уровней, который вы проходите в виде игры.

Ruby Quiz — сайт с задачами для программистов на Ruby, но решения можно писать и на других языках.

Prolog Problems — Подборка задач для программистов, использующих Prolog.

Сборник задач от СppStudio - задачи на С++, но их можно и на других языках.

Operation Go — практика написания кода на Go в форме браузерной игры.

Empire of Code — сайт для программистов, где необходимо писать код, реализующий стратегию и тактику виртуальных бойцов.

@javatg
⭐️ Корутины в Kotlin

Корутины — одна из важнейших фич Kotlin, которая даёт очень удобный и простой способ работы с многопоточность.

В сравнении с многопточностью из Java, в Kotlin она сделана более понятной и наглядной, оставляя сложные процессы вне вашего кода.

В этой серии стате вы узнаете всё, что разработчик Kotlin должен знать о корутинах:

https://maxkim.eu/series/kotlin-coroutines

#kotlin

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое атомарные переменные в Java.

В Java атомарные переменные находятся в пакете java.util.concurrent.atomic. Учитывая, что они предлагают потокобезопасное программирование без блокировок, это повышает эффективность и предотвращает тупиковые ситуации, которые могут возникнуть при использовании традиционных методов синхронизации.

Атомарная операция неделима. Это означает, что как только операция начинает выполняться, она выполняется до завершения, не прерываясь другим потоком. Эта атомарность жизненно важна для параллельного программирования, поскольку помогает предотвратить состояние гонки.

В качестве примера рассмотрим операцию приращения (increment operation):
count++;

Атомарные классы Java:

▪️AtomicInteger
▪️AtomicLong
▪️AtomicBoolean
▪️AtomicReference
И другие…

Давайте рассмотрим пример с использованием AtomicInteger:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();


В этом примере incrementAndGet() является атомарной операцией. Она увеличивает значение count на единицу и возвращает обновленное значение. Независимо от того, сколько потоков одновременно вызывает этот метод, он всегда будет правильно увеличивать count.

📌 Преимущества использования атомарных переменных

@javatg
2024/10/02 22:23:22
Back to Top
HTML Embed Code: