Есть два самых популярных способа создания строк:
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
1❤26👍20🔥7✍2👨💻2❤🔥1⚡1
В 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 вычисляется на основе содержимого строки:
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
1❤26👍20🔥7❤🔥4👨💻3
▪️ В качестве активной среды — кристалл искусственного рубина ( оксид алюминия Al₂O₃ с небольшой примесью хрома Cr ).
▪️ Из кристалла был изготовлен стержень в виде цилиндра диаметром 1 и длиной 2 см, который в процессе работы подвергался облучению излучением импульсной газоразрядной лампы.
▪️ Резонатором служил резонатор Фабри-Перо, образованный серебряными зеркальными покрытиями, нанесёнными на торцы стержня.
▪️ Лазер работал в импульсном режиме, излучая свет с длиной волны 694,3 нм.
▪️ Майман предложил принцип накачки рабочего тела — короткими вспышками света от лампы-вспышки.
▪️ Зеркальные покрытия на торцах кристалла создавали положительную обратную связь, чтобы усилитель стал генератором.
▪️ Расчёты Маймана показали, что атомы хрома в кристалле рубина имеют подходящую систему энергетических уровней, которая делает возможной генерацию лазерного излучения.
▪️ Первый лазер Маймана стал отправной точкой для развития лазерных технологий. Лазеры стали незаменимыми инструментами в физике, химии, биологии и других научных дисциплинах, позволили учёным проводить более точные эксперименты и измерения.
▪️ Лазеры стимулировали дальнейшие исследования и инновации в области оптики и фотоники, привели к разработке новых типов лазеров, увеличению мощности и эффективности.
Импульсные лазеры мощнее непрерывных в плане мощности:
▫️Непрерывные лазеры характеризуются постоянной выходной мощностью, которая может достигать десятков киловатт. Это делает их идеальными для задач, требующих высокой мощности на протяжении длительного времени, таких как лазерная резка или сварка металлов.
▫️Импульсные лазеры работают иначе — они передают энергию в короткие, мощные вспышки. Это делает их менее энергоёмкими, поскольку импульсы могут достигать высокой пиковой мощности при минимальном общем энергопотреблении. Такой подход позволяет выполнять точные, деликатные работы, не перегревая материал.
Таким образом, для крупных производств, где необходима высокая мощность и стабильность, лучше подойдут непрерывные лазеры, а для точных задач, таких как микросварка, очистка поверхности или гравировка, рекомендуется использовать импульсные лазеры. #лазер #техника #science #физика #physics #производство
💥 Лазерная очистка поверхности старой монеты
🔦 Лазерная сварка с разной формой луча
💥 Лазерное скальпирование микросхемы
💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍46❤19🔥6❤🔥3🤔3⚡1🌚1
🔍 Субботняя задачка по физике для разминки наших подписчиков
Вспомним немного оптики. Задачка из дополнительных вступительных испытаний в МГУ.
✍🏻 Попробуйте решить самостоятельно и написать в комментариях ваши идеи. ( Обсуждаем задачу здесь )
#геометрия #оптика #олимпиады #мгу #дви #задачи #problems #физика
💡 Physics.Math.Code // @physics_lib
Вспомним немного оптики. Задачка из дополнительных вступительных испытаний в МГУ.
✍🏻 Попробуйте решить самостоятельно и написать в комментариях ваши идеи. ( Обсуждаем задачу здесь )
#геометрия #оптика #олимпиады #мгу #дви #задачи #problems #физика
💡 Physics.Math.Code // @physics_lib
1👍15❤12✍7🔥7🤯2🤷♀1
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Вы когда-нибудь видели, как раскалённую докрасна металлическую деталь за считанные секунды охлаждают мощными струями воды? Это один из самых эффектных процессов в металлообработке — индукционная закалка. то современный, высокоточный и очень эффективный метод поверхностной закалки. Его главная цель — сделать внешний слой детали исключительно твёрдым и износостойким, сохранив при этом вязкую сердцевину, которая не будет хрупкой и сможет выдерживать ударные нагрузки. Представьте себе шестерёнку или ось станка: их поверхность должна сопротивляться истиранию, а внутри они не должны ломаться. Индукционная закачка — идеальное решение для этого.
1. Создание вихревых токов (токи Фуко) — Деталь помещают внутрь медной катушки (индуктора), по которой пропускают переменный ток очень высокой частоты. Этот ток создаёт вокруг катушки мощное, быстро меняющееся магнитное поле.
Когда в это поле попадает металлическая заготовка, в её поверхностном слое наводятся вихревые электрические токи. Именно они и разогревают металл. По сути, деталь нагревает сама себя изнутри!
2. Скин-эффект — Здесь вступает в дело ключевой физический принцип — скин-эффект. Переменный ток высокой частоты стремится течь не по всему сечению проводника, а только по его поверхности. Чем выше частота тока в катушке, тем тоньше разогреваемый слой. Это позволяет с хирургической точностью контролировать глубину закалки, просто меняя частоту генератора.
3. Мгновенное охлаждение (закалка) — Как только поверхностный слой металла раскаляется до нужной температуры (для стали это обычно 800-1000°C), его тут же обдают мощными струями воды или водяного тумана. Резкое охлаждение фиксирует кристаллическую структуру стали в напряжённом состоянии, превращая её в мартенсит — сверхтвёрдую и хрупкую фазу. Именно это и делает поверхность такой прочной. #физика #металлы #технологии #производство #наука #закалка #индукционныйнагрев
🧲 Электромагнитное торможение колебаний маятника
🔥 Индукционный нагрев
💫 «Гроб Мухаммеда»
🧲 Как работают трансформаторы?
⚡️ Основные физические понятия электродинамики (Леннаучфильм)
✨ Взаимодействие зарядов. Электростатическая индукция
💫 Исследование электрических полей. Опыт по физике
⚡️ Уравнения Максвелла ✨
⚙️ Электромагнитная подвеска 🧲
💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤23👍21
Разберем физику обогревателя, в котором нет насоса, но который способен подсасывать топливо самостоятельно. Только огонь, медная трубка и хитрый закон физики, который заставляет топливо самотеком лететь в сопло. В чем фокус? Разбираем физику процесса
▪️ 1. Нагрев и расширение. Мы подносим источник огня (например, паяльную лампу) к началу полой медной трубки, свернутой в змеевик. Трубка быстро нагревается.
▪️ 2. Создание тяги. Воздух внутри нагретого участка трубки резко расширяется, его давление падает. Поскольку другой конец трубки опущен в емкость с топливом (например, соляркой или отработанным маслом), возникает разница давлений.
▪️ 3. Эффект эжекции (подсоса). Горячий воздух с большой скоростью вырывается из дальнего конца трубки. Этот быстрый поток создает зону низкого давления, которая, как мощный насос, начинает затягивать пары топлива из емкости и подсасывать новую порцию жидкости. Возникает что-то вроде реактивной струи, но внутри системы. Получается самоподдерживающаяся система: пламя нагревает трубку -> нагрев создает тягу -> тяга всасывает новое топливо -> топливо сгорает, поддерживая пламя.
⚙️ Как собрать эффективную конструкцию?
▫️Медная трубка: диаметром 6-10 мм, длиной 1.5-2 метра. Медь отлично проводит тепло.
▫️Емкость для топлива: металлическая, с герметичной, но не полностью закрытой крышкой (нужен байпас для подсоса воздуха).
▫️Основание: негорючее (кирпичи, металл).
▫️Топливо: хорошо подходит керосин, дизель (солярка) или отработанное моторное масло.
1. Форма змеевика. Сверните трубку в плотную спираль. Так площадь нагрева будет максимальной, и процесс парообразования пойдет интенсивнее.
2. Диаметр и длина. Слишком тонкая трубка может засориться, слишком толстая — будет плохо прогреваться. Длина должна быть достаточной для создания хорошей тяги, но не чрезмерной.
3. Положение «сопла». Выходной конец трубки должен быть направлен в зону горения. Это создаст замкнутый цикл: вырывающиеся газы будут поджигать всасываемое топливо, поддерживая стабильный факел.
4. Предварительный нагрев. Систему нужно запустить. Сначала вы прогреваете змеевик сторонним источником огня 30-60 секунд. Как только слышите характерное «шипение» и видите, как топливо начинает втягиваться в трубку, — процесс пошел! Источник огня можно убрать (но не всегда, зависит от конструкции).
🔥 Физика в чашке с водой
💨 Паровой или реактивный двигатель ?
💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2❤1🙈1