Physics.Math.Code
143K subscribers
5.21K photos
2.09K videos
5.81K files
4.47K links
VK: vk.com/physics_math
Чат инженеров: @math_code
Учебные фильмы: @maths_lib
Репетитор IT mentor: @mentor_it
YouTube: youtube.com/c/PhysicsMathCode

№ 6045941532

Обратная связь: @physicist_i
Download Telegram
📘 Грокаем функциональное мышление [2023] Эрик Норманд
📗 Grokking Simplicity: Taming complex software with functional thinking [2021] Eric Normand

💾 Скачать книги

Функциональное программирование — парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

👨🏻‍💻 Для тех, кто захочет пожертвовать на покупку новых книг и админу на кофе:
ЮMoney: 410012169999048
Карта ВТБ: 4272290768112195
Карта Сбербанк: 2202200638175206

#javascript #java #lisp #программирование #функциональное_программирование
38👍26🔥5❤‍🔥3
📙 Программируем на Java. 5-е издание [2023] Марк Лой, Дэниэл Лук, Патрик Нимайер
📗 Learning
Java: An Introduction to Real-World Programming with Java [2020] Marc Loy, Patrick Niemeyer, Daniel Leuck
📕 Learning
Java: An Introduction to Real-World Programming with Java (Early Release) [2023] Marc Loy, Patrick Niemeyer, Daniel Leuck

💾 Скачать книги

☕️ Java — строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process; язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.

👨🏻‍💻 Для тех, кто захочет пожертвовать на покупку новых книг и админу на кофе:
ЮMoney: 410012169999048
Карта ВТБ: 4272290768112195
Карта Сбербанк: 2202200638175206

#java #web #программирование #подборка_книг
👍32🔥76❤‍🔥2💯1
📒 Numerical Methods Using Kotlin [2023] Haksun Li, PhD

💾 Скачать книгу

Узнайте, что Kotlin имеет много преимуществ перед Java в своей скорости, а в некоторых случаях и простоте использования. В этой книге вы увидите, как это может помочь вам легко создавать решения для ваших сложных инженерных задач и задач, связанных с обработкой данных. Прочитав эту книгу, вы получите знания, необходимые для создания собственных численных моделей и алгоритмов с использованием языка программирования Kotlin.
#kotlin #java #программирование #численные_методы #numerical_methods
👍272🆒1
📗 Clojure на производстве. Зипперы, базы данных, REPL [2023] Гришаев

💳 Купить книгу

💾 Ознакомиться с книгой

⚠️ Книги предоставляется вам для ознакомления и не для распространения

Если Вы обдумываете проект, который требовал бы Java Database Connectivity – рассмотрите Clojure для реализации своих задач.
Clojure — совершенно другой язык по сравнению с уже традиционными языками разработки, которые используют и к которым давно привыкли. Этот ЯП хорошо подходит для параллельного программирования. Предоставляет такие инструменты для работы с потоками, как программная транзакционная память и изменяемые ссылки. Это довольно интерактивный язык — в нем есть возможность написать функцию и сразу из редактора запустить её - проверить и посмотреть, как она работает.

Самый большой плюс Clojure в его функциональности и неизменяемости функций. Ещё из плюсов
— в Clojure можно использовать любые библиотеки из Java и JavaScript. Это огромный плюс языка
— сам по себе он достаточно маленький и людей на нем работает не очень много. Поэтому отлично, что можно использовать сторонние системы. #Clojure #JVM #Java #Lisp #web #программирование
👍35🔥13❤‍🔥42
📚 Книжная серия. Бестселлеры O'Reilly [121 книга] [2008-2023]

💾 Скачать книги

Серия "Бестселлеры O'Reilly" познакомит читателя с различными областями программирования. Это уникальная серия "визуальных" книг, созданных по последним методикам эффективного обучения. Книги имеют огромное количество иллюстраций, графиков и таблиц, что позволяет усваивать материал намного эффективнее. Разговорный стиль изложения концентрирует внимание читателя, а упражнения, контрольные вопросы и задания позволяют эффективно закрепить полученные знания. #подборка_книг #программирование #алгоритмы #java #cpp #javascript #python #linux #html #css #php #машинное_обучение

📖 Вы можете купить книгу в бумаге по лучшим условиям. -35% по промокоду: MATH CODE Подробности тут

⚠️ Книги предоставляется вам для ознакомления и не для распространения
👍86🔥2312🤨6❤‍🔥4🥰2👏2
📙 Troubleshooting Java: Read, debug, and optimize JVM applications [2023] Laurentiu Spilca
📕
Java устранение проблем [2023] Лауренциу Спилкэ

⚠️ Книги предоставляется вам для ознакомления и не для распространения

💳 Купить книгу

💾 Ознакомиться c RU+EN

Эффективное чтение и понимание существующего кода - это сверхспособность разработчика. В этой книге вы освоите методы профилирования кода, расширенной отладки и анализа журналов для поиска и исправления ошибок и проблем с производительностью. В разделе Устранение неполадок Java: чтение, отладка и оптимизация приложений JVM вы узнаете, как:
• Определите, что делает код, когда вы видите его в первый раз.
• Выявлять проблемы с логикой кода
• Оценивайте дампы кучи для поиска утечек памяти
• Контролируйте потребление процессора для оптимизации выполнения
• Используйте дампы потоков для поиска и устранения взаимоблокировок
• Легко использовать сервис-ориентированную систему или систему микросервисов
• Правильно используйте ведение журнала, чтобы лучше понять выполнение Java-приложения
• Эффективно использовать Java-отладчики

👨🏻‍💻 Для тех, кто захочет пожертвовать на покупку новых книг и на кофе:
ЮMoney: 410012169999048
Карта ВТБ: 4272290768112195
Карта Сбербанк: 2202200638175206

#программирование #Java #JVM #GPU #оптимизация #рефакторинг
👍39🔥76❤‍🔥2
📕 Apache Pulsar в действии [2023] Хьеррумгор Д.
📗 Apache Pulsar in Action [2021] David Kjerrumgaard


⚠️ Книги предоставляется вам для ознакомления и не для распространения

💳 Купить книгу

💾 Ознакомиться с книгами RU+EN

Apache Pulsar — это платформа распределенного обмена сообщениями и потоковой передачи данных с открытым исходным кодом. Изначально она была разработана в компании Yahoo. УТП Pulsar — сегментированная архитектура, в которой о хранении данных полностью заботится Apache Bookkeeper.

Книга «Apache Pulsar в действии» предназначена для абсолютных новичков в Pulsar и является сочетанием информации, собранной автором во время непосредственного сотрудничества с основателями Pulsar в процессе активной разработки этой платформы, и опыта, накопленного во время работы с организациями, включившими Apache Pulsar в производственный процесс.

Издание придаст уверенности при разработке приложений потоковой обработки и микросервисов с спользованием Pulsar и языка программирования Java. Несмотря на то, что автор книги решил использовать Java для большинства примеров кода из-за личного знакомства с этим языком, он также создал аналогичный комплект исходного кода с использованием Python и загрузил его в свою учетную запись GitHub для тех, кто предпочитает писать код на этом языке.
Книга «Apache Pulsar в действии» поможет создавать масштабируемые системы потокового обмена сообщениями с использованием Pulsar. Следуя четким описаниям и выполняя практические примеры, читатель будет использовать фреймворк Pulsar Functions для разработки приложения на основе микросервисов.

Основные темы книги:
• Публикации сообщений из Pulsar в сторонние репозитории данныхи на другие платформы;
• Проектирование и разработка функций Apache Pulsar;
• Создание управляемого событиями приложения обработки заказов на доставку продуктов питания.
Издание предназначено для опытных разработчиков на языке Java. Предварительные знания о платформе Apache Pulsar не требуются. #java #apache #программирование
👍32🔥94❤‍🔥1😱1😍1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Сборка мусора (англ. garbage collection) в программировании — одна из форм автоматического управления памятью. Специальный процесс, называемый сборщиком мусора (англ. garbage collector - GC), периодически освобождает память, удаляя из неё ставшие ненужными объекты. Автоматическая сборка мусора позволяет повысить безопасность доступа к памяти. Сборка мусора была впервые применена Джоном Маккарти в 1959 году в среде программирования на разработанном им функциональном языке программирования Лисп. Впоследствии она применялась в других системах программирования и языках, преимущественно — в функциональных и логических. Необходимость сборки мусора в языках этих типов обусловлена тем, что структура таких языков делает крайне неудобным отслеживание времени жизни объектов в памяти и ручное управление ею. Широко используемые в этих языках списки и основанные на них сложные структуры данных во время работы программ постоянно создаются, надстраиваются, расширяются, копируются, и правильно определить момент удаления того или иного объекта затруднительно.

В промышленных процедурных и объектных языках сборка мусора долго не использовалась. Предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Но со второй половины 1980-х годов технология сборки мусора стала использоваться и в директивных (императивных), и в объектных языках программирования, а со второй половины 1990-х годов всё большее число создаваемых языков и сред, ориентированных на прикладное программирование, включают механизм сборки мусора либо как единственный, либо как один из доступных механизмов управления динамической памятью. В настоящее время она используется в Оберон, Java, Python, Ruby, C#, D, F#, Go и других языках.

▪️Висячая ссылка (англ. dangling pointer) — это ссылка на объект, который уже удалён из памяти. После удаления объекта все сохранившиеся в программе ссылки на него становятся «висячими». Память, занимаемая ранее объектом, может быть передана операционной системе и стать недоступной, или быть использована для размещения нового объекта в той же программе. В первом случае попытка обратиться по «повисшей» ссылке приведёт к срабатыванию механизма защиты памяти и аварийной остановке программы, а во втором — к непредсказуемым последствиям. Появление висячих ссылок обычно становится следствием неправильной оценки времени жизни объекта: программист вызывает команду удаления объекта до того, как его использование прекратится.

▪️Утечки памяти — Создав объект в динамической памяти, программист может не удалить его после завершения использования. Если ссылающейся на объект переменной будет присвоено новое значение и на объект нет других ссылок, он становится программно недоступным, но продолжает занимать память, поскольку команда его удаления не вызывалась. Такая ситуация и называется утечкой памяти (англ. memory leak). Если объекты, ссылки на которые теряются, создаются в программе постоянно, то утечка памяти проявляется в постепенном увеличении объёма используемой памяти; если программа работает долго, объём используемой ею памяти постоянно растёт, и через какое-то время ощутимо замедляется работа системы (из-за необходимости при любом выделении памяти использовать свопинг), либо программа исчерпывает доступный объём адресного пространства и завершается с ошибкой. 📱 Подробности

📱 Автор видео: Владимир Балун

#программирование #архитектура #многопоточность #сборщикмусора #cpp #java #coding #programming

💡 Physics.Math.Code
// @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥82👍5316🤨2👨‍💻1🙈1
🖥 Различия в создании строк на Java

Есть два самых популярных способа создания строк:
1 — String s1 = new String("Hello");
2 — String s2 = "Hello";
Разберем отличия.

▪️ 1. Место в памяти (Самое главное отличие) — Это отличие является корнем всех остальных различий.

🔸String s1 = new String("Hello"); (Оператор new)
Создает новый объект в Куче (Heap), независимо от того, какая строка там уже существует.
Каждый вызов new String("Hello") гарантированно создает новый, уникальный объект в памяти.

🔸String s2 = "Hello"; (Строковый литерал)
Строка создается и помещается в специальную область памяти — String Pool (Пул строк), который находится внутри кучи.
Механизм String Pool: Перед созданием новой строки JVM проверяет, нет ли уже строки с таким же значением в пуле. Если есть — переменной просто присваивается ссылка на существующий объект. Если нет — тогда в пуле создается новый объект.

Наглядная аналогия:
new String("Hello") — покупка нового, уникального экземпляра книги, даже если она уже есть в библиотеке.
"Hello" — взятие книги из библиотеки. Если книга есть — вы получаете именно её. Если нет — библиотека сначала покупает новую, а вы её берете.

▪️ 2. Поведение при сравнении (==). Оператор == сравнивает ссылки на объекты, а не их содержимое. Из-за различий в памяти поведение будет разным.
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = "Hello";

System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true

s1 == s2 -> false, потому что s1 ссылается на объект в куче, а s2 — на объект в String Pool. Это два разных объекта в памяти.
s2 == s3 -> true, потому что обе переменные ссылаются на один и тот же объект в String Pool.
Для сравнения содержимого строк всегда используйте метод equals():
System.out.println(s1.equals(s2)); // true (сравнивается содержимое "Hello")
System.out.println(s2.equals(s3)); // true


▪️ 3. Производительность

🔸Строковый литерал ("Hello") — более эффективен. Он избегает создания дубликатов в памяти, что экономит память и ускоряет работу, так как не нужно создавать новый объект, если он уже существует в пуле.
🔸Оператор new — менее эффективен. Он принудительно создает новый объект в куче, даже если идентичная строка уже существует. Это может привести к избыточному расходу памяти.

▪️ 4. Количество создаваемых объектов

🔸String s1 = new String("Hello"); — Может создать 1 или 2 объекта.
1. Строковый литерал "Hello" сначала ищется в String Pool. Если его нет — он создается в пуле. (Первый возможный объект).
2. Затем ключевое слово new создает новый объект String в куче. (Второй объект).
Таким образом, если строка "Hello" ранее не существовала в пуле, эта строка кода создаст два объекта.
🔸String s2 = "Hello";
Создает 0 или 1 объект.
JVM ищет "Hello" в String Pool. Если находит — объект не создается, переменной присваивается существующая ссылка (0 новых объектов).
Если не находит — создает новый объект в String Pool (1 новый объект).

▪️Метод intern() — мостик между двумя подходами. Метод intern() позволяет вручную поместить строку из кучи в String Pool или получить ссылку на уже существующую там строку.
String s1 = new String("Hello");
String s2 = s1.intern(); // Помещаем строку в пул (или получаем ссылку из пула)
String s3 = "Hello";

System.out.println(s1 == s2); // false, т.к. s1 все еще в куче
System.out.println(s2 == s3); // true, т.к. s2 и s3 ссылаются на один объект в пуле

В этом примере s1.intern() находит строку "Hello" в пуле (которая была создана при вычислении литерала внутри конструктора) и возвращает на неё ссылку, которую мы присваиваем s2.

Практический вывод: Почти всегда следует использовать строковые литералы (String s = "value";). Этот способ более эффективен по памяти и времени, так как использует механизм пула строк. #java #задачи #программирование #собеседования #IT #структуры_данных

💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
126👍20🔥72👨‍💻2❤‍🔥11
👩‍💻 Java: А есть ли связь между сравнением строк equals() и хешированием hashCode() ?

В Java существует важное правило (контракт):
1. Если две строки равны по equals(), то их hashCode() ДОЛЖЕН быть одинаковым
2. Обратное не обязательно верно: одинаковый hashCode() не гарантирует равенства строк
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");

System.out.println(s1.equals(s2)); // true
System.out.println(s1.hashCode() == s2.hashCode()); // true

System.out.println(s1.equals(s3)); // true
System.out.println(s1.hashCode() == s3.hashCode()); // true


👩‍💻 Как вычисляется hashCode для String

Метод hashCode() в классе String вычисляется на основе содержимого строки:
public int hashCode() {
int h = hash; // кэшированное значение
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

Вычисляется по формуле: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Результат кэшируется в поле hash для производительности
Для одинакового содержимого всегда одинаковый hashCode, независимо от того, как была создана строка
value и hash — являются полями класса String и уже существуют в объекте, когда вызывается метод hashCode().
value — массив символов, который хранит собственно содержимое строки. Он инициализируется при создании объекта. String s = "Hello"; // value = {'H', 'e', 'l', 'l', 'o'}
hash — поле для кэширования вычисленного хэш-кода. Оно инициализируется по умолчанию значением 0.

Практическое применение в коллекциях: Связь hashCode и equals критически важна для работы хэш-коллекций:

🔸 HashMap/HashSet
Map<String, Integer> map = new HashMap<>();
map.put("Hello", 1);
map.put(new String("Hello"), 2); // Затрет предыдущее значение!

System.out.println(map.size()); // 1 - потому что ключи равны по equals()

1. Сначала сравниваются hashCode() — если разные, объекты точно разные
2. Если hashCode одинаковые, тогда вызывается equals() для точной проверки

🔸 Оптимизация сравнения
String s1 = "very long string ...";
String s2 = "another very long string ...";

// Сначала проверяется hashCode - быстрая операция
if (s1.hashCode() == s2.hashCode() && s1.equals(s2)) {
// Строки точно равны
}

▪️ 1. Коллизии хэшей — Разные строки могут иметь одинаковый hashCode (хэш-коллизия)
String a = "Aa";
String b = "BB";

System.out.println(a.hashCode()); // 2112
System.out.println(b.hashCode()); // 2112
System.out.println(a.equals(b)); // false

▪️ 2. Производительность

// Медленно - создается новый объект и вычисляется hashCode
String s1 = new String("Hello");

// Быстро - используется кэшированный hashCode из String Pool
String s2 = "Hello";

3. String Pool и hashCode
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");

// Все три имеют одинаковый hashCode, но разные способы создания
System.out.println(s1.hashCode()); // одинаковый
System.out.println(s2.hashCode()); // одинаковый
System.out.println(s3.hashCode()); // одинаковый

🔍 Важные моменты. HashCode тесно связан со сравнением строк через:
1. Контракт Java — равные строки по equals() должны иметь одинаковый hashCode
2.. Оптимизацию сравнения — хэш используется для быстрой предварительной проверки
3. Работу коллекций — HashMap, HashSet и другие используют эту связь для эффективного хранения и поиска
#java #задачи #программирование #собеседования #IT #структуры_данных

💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
127👍22🔥7❤‍🔥4👨‍💻3