<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 17:10:56 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="65y_SPvSJL_JUzmztjiyvC1s_jNlelivtujkAgMArIgETXR_CayJ338QHSu6N0LL7WXTmW1Npg0LCH5WUQdL5g";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Модуль 6. Урок 1. Составные строки в Java. | Введение в Java</title>
<meta name="description" content="Модуль 6. Урок 1. Составные строки в Java. / Введение в Java: Получить теоретические знания о том, что такое cоставные строки в Java и закрепить полученные навыки на практике.">
<link rel="canonical" href="https://ru.hexlet.io/courses/java_101/lessons/stringbuffer/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Модуль 6. Урок 1. Составные строки в Java.">
<meta property="og:title" content="Введение в Java">
<meta property="og:description" content="Модуль 6. Урок 1. Составные строки в Java. / Введение в Java: Получить теоретические знания о том, что такое cоставные строки в Java и закрепить полученные навыки на практике.">
<meta property="og:url" content="https://ru.hexlet.io/courses/java_101/lessons/stringbuffer/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="5A2CgLcspx3-5otbEz_uL-gl__f3ElyIRtF4wqcPjbcL3Em3RVIKfUilr8MfMB5YKCzSXf8loir7MeKW9Qhq2Q" />
<script src="/vite/assets/inertia-INZxX8jp.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-6pOtQ3OW.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T17:10:56.020Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"4UwFGjNbyw0iRzKJ7zTzL503ooqhkrg4zS1WxNR5h6MOnc4twSVmbZQEFhHjOwNYXT6PIKmlRppwzcyQhn5gzQ","topics":[{"id":7646,"title":"Где можно поподробнее почитать про heap откуда он появился и в итоге пригодится он или нет? Какой размер у Heap? Т.к. уже не первый раз о нем слышу","plain_title":"Где можно поподробнее почитать про heap откуда он появился и в итоге пригодится он или нет? Какой размер у Heap? Т.к. уже не первый раз о нем слышу ","creator":{"public_name":"Иван Попов","id":133025,"is_tutor":false},"comments":[{"creator":{"public_name":"Иван Попов","id":133025,"is_tutor":false},"id":14444,"body":"В задании выдается вот такая вот ошибка \n```\nmake: Entering directory `/usr/src/app'\nmkdir -p out\nfind . | grep java > sources.txt\njavac @sources.txt -sourcepath src -d out -cp out\njava -cp ./out io.hexlet.xo.view.Main\nException in thread \"main\" java.lang.RuntimeException: Line generated: \" X | O | \" instead of \" X | O | \n\"\n\tat io.hexlet.xo.view.Main.main(Main.java:46)\nmake: *** [test] Error 1\nmake: Leaving directory `/usr/src/app' \n```","topic_id":7646},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":14473,"body":"Где-то лишний пробел или символ в иной раскладке клавиатуры.\n\nВ комментариях к уроку у многих такая ошибка выскакивала.\n\nhttps://ru.hexlet.io/topics/6777\n\n\nДа и без кода трудно догадываться в чем проблема...","topic_id":7646},{"creator":{"public_name":"Иван Попов","id":133025,"is_tutor":false},"id":14484,"body":"Не могу разобраться с вторым методом, почему-то я считаю, что этого вполне достаточно void generateSeparator(final StringBuilder sb) {\n\t// BEGIN (write your solution here)\n\n sb.append(\"~~~~~~~~~~~\\n\");\n\n\t// END\n }\n\n\nсоответственно в ошибке у меня нет строки значит нужно чтобы она появилась. Мне нужно сделать генерацию линии и объявить перенос ? Не понимаю как ","topic_id":7646},{"creator":{"public_name":"Иван Попов","id":133025,"is_tutor":false},"id":14485,"body":"Разобрался спасибо","topic_id":7646},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":14421,"body":"Я уверен что как раз вот в [ЭТОМ УРОКЕ](https://ru.hexlet.io/courses/java_101/lessons/java_types/theory_unit) можно найти такую информацию.\n\nТекст под видео так же обязателен к прочтению.\n\nВот еще [полезность](http://lmgtfy.com/?q=stack+%D0%B8+heap).\n","topic_id":7646}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":44423,"title":"Первый раз отправил на ревью, до этого в запутанных ситуациях смотрел решение учителя.\nПодскажите, почему выдаёт такое? Что тестам не нравится?\n\n```\njava.lang.RuntimeException: Line generated:\n01234567890\n O | X | instead of:\n01234567890\n O | X | \n```","plain_title":"Первый раз отправил на ревью, до этого в запутанных ситуациях смотрел решение учителя. Подскажите, почему выдаёт такое? Что тестам не нравится? java.lang.RuntimeException: Line generated: 01234567890 O | X | instead of: 01234567890 O | X | ","creator":{"public_name":"","id":290848,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":96109,"body":"Здравствуйте.\n\nДавайте ссылку на свое ревью.","topic_id":44423},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":96113,"body":"Здравствуйте.\n\nПрикрепляйте, пожалуйста, ссылку на свое кодревью. А то не всегда его можно найти по имени пользователя, среди других ревью.\n\nВ вашем решении неучтена одна мелоч: строка не должна заканчиваться лишь пробелом — за ней еще строка. И если это не обозначить — получим поле в одну строку.\n\nЯ попробую улучшить информативность вывода тестов.","topic_id":44423},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":96116,"body":"Обновленное задание будет подгружено только после сброса прогресса в этом задании.","topic_id":44423}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":41049,"title":"Опечатка: \n\nЕсли это последняя ячейка строки, то **горизоньальный** разделитель не добавляется.","plain_title":"Опечатка: Если это последняя ячейка строки, то горизоньальный разделитель не добавляется. ","creator":{"public_name":"","id":208622,"is_tutor":false},"comments":[{"creator":{"public_name":"","id":208622,"is_tutor":false},"id":89463,"body":"И еще одна:\n\nКак не странно, разделяет каждую строчку **пля**, сформированную из: ","topic_id":41049}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":41928,"title":"Здравствуйте.\nПодскажите пожалуйста, обязательно ли применять переменные в методе generateLine, типа linenumber ? Не очень понимаю для чего они нужны. Пока я попытался реализовать метод таким образом, подскажите считается ли это корректным ? И еще есть вопросик. Как в методе snow обращаться к generateLine, учитывая что он ничего не возвращает ?\nРевью https://ru.hexlet.io/code_reviews/257575","plain_title":"Здравствуйте. Подскажите пожалуйста, обязательно ли применять переменные в методе generateLine, типа linenumber ? Не очень понимаю для чего они нужны. Пока я попытался реализовать метод таким образом, подскажите считается ли это корректным ? И еще есть вопросик. Как в методе snow обращаться к generateLine, учитывая что он ничего не возвращает ? Ревью https://ru.hexlet.io/code_reviews/257575 ","creator":{"public_name":"Егор Сафонов","id":215642,"is_tutor":false},"comments":[{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":91529,"body":"Рад, что получилось)\n\nПо коду - в `generateLine` лишний `System.out.println`. Для отладки его ещё можно применять, а вот дальше лучше уже убрать, т.к. всё игровое поле должен выводить метод `show`.\n\nСмена мест в параметрах `Point()` поменяет местами строку и столбец. Тесты не пройдут, т.к. они будут ждать от вас первую строку, а вы им вернёте первый столбец) На итоговый результат (на всё игровое поле целиком) это никак не повлияет, но в этом упражнении есть отдельные тесты на метод `generateLine`.\n\nЧто-то дополнительное пока не буду советовать, на Hexlet много информации и заданий. Просто решайте всё подряд и старайтесь разбираться в том как это работает) С этой задачкой у вас уже получилось, нужно и со всеми остальными так же поступить)","topic_id":41928},{"creator":{"public_name":"Егор Сафонов","id":215642,"is_tutor":false},"id":91328,"body":"Пересмотрел видео, попытался сообразить методы, но не очень понимаю какие аргументы необходимо передать в generateLine и для чего переменная game в методе snow \n\nhttps://ru.hexlet.io/code_reviews/257575","topic_id":41928},{"creator":{"public_name":"Егор Сафонов","id":215642,"is_tutor":false},"id":91436,"body":"Получилось что-то такое https://ru.hexlet.io/code_reviews/257575. Очень похоже на итоговый результат, только компилятор считает иначе :) А в чем проблема, не подскажите ?","topic_id":41928},{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":91467,"body":"> а как тогда обратиться к методу который ничего не возвращает ?\n\nДа, метод ничего не возвращает, но ему на вход передаются объекты ссылочного типа с которыми он может работать.\n\nУ вас же есть `fieldBuilder` в качестве поля класса. Вы можете его передать вашему методу `generateLine`. Да он ничего не вернёт, но может добавить то, что вам нужно (информацию о строке) в этот самый `fieldBuilder`.\n\nДля работы это методу нужна информация об игровом поле, номере строки, которую он должен сейчас собрать, а также `StringBuilder` в который он должен всё собирать. Всё это у вас есть, нужно только вызвать)","topic_id":41928},{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":91282,"body":"Добрый день!\n\nЛогика заложена следующая - метод `show` выводить на экран всё игровое поле целиком, а метод `generateLine` готовит к выводу каждую строку в отдельности. Соответственно он должен знать какую строку ему нужно собирать на этом вызове. Эта информация содержится в переменной `lineNumber`.\n\nПересмотрите ещё раз видео с этих уроков, кажется пока нет ясности что содержится в классе Field и что нужно выводить на экран.","topic_id":41928},{"creator":{"public_name":"Егор Сафонов","id":215642,"is_tutor":false},"id":91465,"body":"Это нас возвращает нас к вопросу выше, а как тогда обратиться к методу который ничего не возвращает ? Как я понял, мне просто необходимо сформировать циклический вывод этой самой строки по вертикали, добавив туда разделители, но учитывая что на вход метода generateLine, ожидаются параметры, не очень ясно что туда вносить, из-за этого возникает проблема. переменная game.getField() возвращает нам все итоговое поле, как я понимаю, что также, к сожалению не решает проблемы( Может я что-то очевидное упускаю ? ","topic_id":41928},{"creator":{"public_name":"Егор Сафонов","id":215642,"is_tutor":false},"id":91508,"body":"И можно задать вам дополнительный вопрос ? Вот финальный код https://ru.hexlet.io/code_reviews/257575\nПодскажите в чем принципиальное отличие в перестановке входящих переменных в Point ?\nТ.е. вот так\n ```\nPoint (lineNumber,i)\n```\nКод проходит, а вот так \n```\nPoint (i,lineNumber)\n```\nуже выдает ошибку","topic_id":41928},{"creator":{"public_name":"Егор Сафонов","id":215642,"is_tutor":false},"id":91507,"body":"Спасибо за пояснения, целый день сегодня мучился и написал, не могли бы вы посоветовать какие-то ресурсы(сайты,книги), которые можно было бы изучить дополнительно, для понимая java и алгоритмов в частности ? Чувствую, что имеются с этим проблемы","topic_id":41928},{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":91332,"body":"Вам внутри этого класса как-то нужно узнать об игровом поле. Оно к вам должно прийти снаружи, как аргумент какого-то метода. `generateLine` его получает, но этот метод вызывается только внутри этого класса, снаружи ему поле никто не даст.\nИменно для этого в метод `show` идёт объект `Game` - из этого объекта можно уже получить актуальное поле.\n\nА метод `generateLine` должен перевести в строку конкретную линию, конкретного игрового поля. Поэтому у него в аргументах само поле, а также номер линии. \n\nПомимо этого у него есть ссылка на объект StringBuilder, в которое он всё и пишет.","topic_id":41928},{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":91443,"body":"Уже лучше)\n\nНо логику автора вы изменили, поэтому тесты не проходят. `generateLine` должен подготовить строковое представление только одной строки, а у вас он всё поле сразу 'рисует'.\n\nНу и вот это `fieldBuilder.append (game.getField());` тоже не совсем туда. мы должны самостоятельно собрать всё игровое поле. метод `show` должен для каждой строки вызывать `generateLine`, а `generateLine` должна заполнять одну линию игрового поля.","topic_id":41928}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":50578,"title":"Здравствуйте, у меня проблема с составлением алгоритма. \n\nЯ так думаю, что необходимо взять имеющееся поле getSize() и просто через append добавить нужные разделители с пробелами в каждую строку с полями. Если это так, то я не знаю как через алгоритм это показать.\n\n\n","plain_title":"Здравствуйте, у меня проблема с составлением алгоритма. Я так думаю, что необходимо взять имеющееся поле getSize() и просто через append добавить нужные разделители с пробелами в каждую строку с полями. Если это так, то я не знаю как через алгоритм это показать. ","creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108741,"body":"Добрых праздников! )\n\n> Получилось, что бы хоть что то на экран выводил.\n\nКруто!\nТеперь будем развивать это до нужного результата. Уже есть логика в коде, которая знает как добавить в билдер `\"X\"` или `\"O\"` (или пробел), в зависимости от содержимого в ячейке игрового поля.\n\nНапомню два важных момента:\n1. метод `show` должен выводить на экран все поле целиком;\n2. игровое поле представляется в двумерном массиве, поэтому у нас в `Point` есть не только координата икс, но и координата игрек. \n\nА это значит, что по п. 1 еще нужно будет написать логику, которая добавляет в билдер не только фигурку или пробел, но и разделители всякие, перевод строки.\n\nКстати, формирование одной строки игрового поля можно вынести в отдельный метод. А результат работы этого отдельного метода можно сразу добавлять в билдер.\n\nПо п. 2 отмечу, что в `field.getFigure` стоит передавать не `new Point(0, 0)`, а `new Point(x, y)`, где `x` & `y` это изменяемые переменные. Это позволит заглянуть в каждую ячейку игрового поля, а не только в ячейку по координатам 0:0.\n\nРекомендую нарисовать себе игровое поле на бумажке и подписать там все ячейки парами координат `x` & `y`. Такая визуализация может помочь придумать свой алгоритм прохода по всем ячейкам игрового поля. ","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108459,"body":"https://wmpics.pics/di-0TXH.png\n\nАлгоритм составлен правильно? \n\nСоздаю его и не покидает чувство, что делаю что то не правильно.","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108737,"body":"https://ru.hexlet.io/code_reviews/356120 Получилось, что бы хоть что то на экран выводил.\n\nМне трудно понять как работает программа, например я создал условия с циклом поставил 1 пробел и фигурки, но в OutPut он показывает всё игровое поле целиком. Но я только сделал одно поле х. Это из-за main видимо - исключение какое то. \n\nТак это я к чему, если я через append начинаю добавлять ```|``` или ```~~~~```, не могу с ориентироваться как я сделал, правильно или нет. \n\nПоказывает:\n\nExpected game field length: 60\n\nActual game field length: 3\n\nОно и ясно, я только поля х сделал. Но из того что я не понимаю, не знаю как дальше делать. В IDEA всё полностью скопировал, пытался там что то сделать, ничего не вышло.","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108707,"body":"> х1 и у1 недоступны потому что точка не была создана.\n\nКоторая типа \"Пробел\"? Или Point? ","topic_id":50578},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108332,"body":"> Благодаря fieldBuilder получится превратить фигурки с пробелами в строку?\n\nИменно так. `StringBuilder` выполняет роль аккумулятора, который накапливает в себе строки, в порядке их добавления в билдер. \n\n> Вместо getSize(), значит нужно использовать getFigure()?\n\nВерно. Ведь нам нужно достать из игрового поля фигурки.\n\n\n> \n> На игровом поле фигурка? - Если да, то выводит пробел, а если нет, то что?\n\nНа оборот! Если на игровом поле в конкретной клеточке есть фигурка — добавляем ее в наш билдер, обрамляя пробелами и т.д.\nА если в конкретной ячейке игрового поля нет фигурки — добавляем в билдер, вместо потенциальной фигурки, просто пробел, который тоже обрамлен двумя пробелами и т.д.\n\nВы верно заметили, что метод `show` ничего не возвращает. Так и нужно. Он просто выводит на экран один объект строки, который состоит из нескольких линий, формирующих в консоли визуально игровое поле.\n\nЯ бы кратко описал задачу так: построить строку, которая рисует игровое поле в консоли, основываясь на данных из класса `Field`.","topic_id":50578},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108851,"body":"Вызовы метода `append` верно выстроены. Но вот условие в цикле while и в условном операторе `if` непонятны. Ноль всегда будет меньше `field.getSize`.\n\nА почему в билдер нужно добавлять что-то только если `x != 0`? почему не `x != 1` или `x != 2`?\n\nИ последнее про метод `generateStroka`: хорошо бы его вызвать в методе `show`, а то он никогда не сработает.\n\nВернемся к методу `show`.\nОкей, вижу объявленную ссылку `final Field field;`, а объект ей не присвоен... Напоминаю: объект класса `Game` содержит в себе объект класса `Field`.\n\nВижу попытку достать фигурку `final Figure figure = field.getFigure(new Point(x, y));`. Эта строка синтаксически верна! Но откуда взять значение для `y`?\n\nПодсказка: метод `generateStroka` должен помогать методу `show`, а не существовать сам по себе.\n\nРекомендую быстро повторить темы:\n- Модуль 2. Урок 2. Типы данных в Java.\n- Модуль 2. Урок 3. Работа с экземплярами в Java.\n- Модуль 3. Урок 1. Основы использования и создания методов в классах.\n- Модуль 3. Урок 2. Аргументы и результаты работы методов. Рефакторинг.\n- Модуль 4. Урок 1. Условный оператор IF в Java.\n- Модуль 4. Урок 2. Массивы в Java.\n- Модуль 4. Урок 3. Циклы в Java.\n\nНекоторые данные из этих тем были упущены, что вызывает \"кашу\" в текущем задании. На повторение рекомендую потратить не более нескольких часов.\n","topic_id":50578},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108592,"body":"Добрый день.\n\n> final Point point = new Point(); // Я не понимаю, почему ошибка в переменной Point.\n\nЭто связано с тем, что создание `Point` требует сразу задавать свои координаты.\n\n\n\n> point.x1 = i; // Почему x1, y1 не доступны? В классе Point созданы методы для их доступа.\n> point.y1 = i2; // В нижней части я пытался показать условие, есть ли фигурка или нет\n\nх1 и у1 недоступны потому что точка не была создана. \n\nНаводящий вопрос: а зачем внутри метода создавать пустой `field` и пытаться в нем найти фигурки? У нас же есть входящий аргумент `Game`, а там и поле можно достать.","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108818,"body":"https://ru.hexlet.io/code_reviews/356120\n\nПеределал.\n\nСтроку х правильно создал?(```generateStroka```) ","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108749,"body":"Спасибо, вас тоже. \n\nОчень трудно, пока попрошу проверить generateStroka. SEPARATOR пока не делал, хочу хотя бы 1 строку х правильно создать.\n\nhttps://ru.hexlet.io/code_reviews/356120","topic_id":50578},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108773,"body":"Здравствуйте.\n\nВижу недопонимание строки игрового поля. \n\nВозьмем пример поля:\n\n```\n1 X | O | \n2 ~~~~~~~~~~~\n3 O | X | O \n4 ~~~~~~~~~~~\n5 X | | X \n```\nПоле состоит из пяти сток. Вторая и четвертая строки являются просто разделителями (сепараторами).\n\nТеперь добавим в билдер первую строку игрового поля.\nСначала идет пробел, потом `X, потом пробел, потом вертикальный разделитель, потом пробел, потом `O`, потом пробел, потом разделитель и три пробела. Ну еще нужно добавить перенос строки в конец этой строки.\n\nКакие у нас есть средства для добавления этой строки в билдер:\n\n1. Собственно сам билдер, который объявлен как поле класса `ConsoleView`. Поэтому его не нужно передавать как аргумент в методы этого класса — он и так им всем виден.\n2. Игровое поле `field`, которое мы можем достать из входящего в метод `show` аргумента `game`. Кстати создавать свое пустое поле строкой `final Field field = new Field();` нет смысла, поскольку:\n - Оно пустое, там нет фигурок и никогда не появятся.\n - У нас уже есть игровое поле, которое лежит внутри объекта `game`.\n3. У игрового поля есть метод `getFigure`, который позволяет доставать фигурки из этого игрового поля.\n4. У нас есть класс `Point`, объекты которого мы отправляем в `getFigure` для получения фигурок. Все эти объекты класса `Point` должны быть с разными координатами `x` & `y`.\n5. У нас есть циклы, которые помогут менять `x` & `y`.\n6. У нас есть условные операторы, которые позволяют добавлять в билдер ту или иную штуку, в зависимости от содержимого ячейки игрового поля, от начала или конца строки, от средины строки.\n\nОтмечу, что сразу печатать строку на экран не обязательно. Можно собрать все строки в один билдер, а потом разом их вывести на экран.\n\nВот теперь переделывайте `generateStroka` с учетом выше написанного. Только не забудьте вызвать этот метод в коде метода `show`! ))\n\n\n ","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108534,"body":"Здравствуйте, все вопросы в https://ru.hexlet.io/code_reviews/356120","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108497,"body":"https://ru.hexlet.io/code_reviews/356120\n","topic_id":50578},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108486,"body":"Схема очень правдоподобна!\n\nТолько вот проверка `fieldBuilder.equals(field.getSize())` не нужна, ведь размер былдера зависит от количества итераций в циклах. Да и не совпадет он по размеру с полем никогда. Поскольку в поле только фигурки, а в билдер мы добавляем всякие пробелы и разделители, по мимо фигурок с игрового поля.\n \nМожно уже пробовать схему в коде. Может еще придется ее подправить. Но уже сейчас можно выводить на экран что-то и смотреть результат своей работы.","topic_id":50578},{"creator":{"public_name":"Maxim","id":299519,"is_tutor":false},"id":108307,"body":"Благодаря _fieldBuilder_ получится превратить фигурки с пробелами в строку? \n\nВместо _getSize()_, значит нужно использовать _getFigure()_?\n\nСоздавая _условие_ в алгоритме например: На игровом \nполе фигурка? - Если да, то выводит пробел, а если нет, то что? Ведь метод ничего не возвращает или в случает \"Нет\" ничего предпринимать не нужно? . Или я могу в другом методе это реализовать? ","topic_id":50578},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":108277,"body":"Добрый день.\n\n`getSize()` вернет размер поля, а не само поле.\n\nДогадка в сторону `append` абсолютно верная.\nНо не забывайте, что нужно еще сформировать эти строки.\n\n\n> \n> Если это так, то я не знаю как через алгоритм это показать.\n\nПочти так.\n\nТеперь посмотрим на это так: \n- у нас есть поле с фигурками или без фигурок и мы можем их оттуда доставать;\n- мы знаем что такое строки и как их создавать, объединять;\n- нам нужно создать из содержимого на игровом поле, в итоге, одну строку;\n- нам известны циклы и условные операторы.\n\nРекомендую переиспользовать то, что уже есть в классе `ConsoleView`.\n","topic_id":50578}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":40740,"title":"https://ru.hexlet.io/code_reviews/244518\nпытался сделать по своему, но ничего не получалось. В итоге решил скопировать ваше же решение и компилятор выдает ошибки. В вашем решении что-то не так?\n","plain_title":"https://ru.hexlet.io/code_reviews/244518 пытался сделать по своему, но ничего не получалось. В итоге решил скопировать ваше же решение и компилятор выдает ошибки. В вашем решении что-то не так? ","creator":{"public_name":"Айрат Хасаншин","id":266241,"is_tutor":false},"comments":[{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":88894,"body":"Добрый день!\nОбратите внимание на лог ошибок.\nУ вас компилятор говорит что в 22 строке \" illegal start of type\".\nУ вас цикл находится вне какого либо метода, просто в теле класса.\nВ Java так делать нельзя.","topic_id":40740}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":2179,"title":"Может я что то не понимаю, но при обращении к элементу матрицы всегда обращаются: Матрица(№_СТРОКИ,№_СТОЛБЦА).\nСобственно так и было до этого задания, пока не появилась эта строчка для проверки:\n```\n\t\tfield.setFigure(new Point(0, 0), Figure.X);\n\t\tfield.setFigure(new Point(1, 0), Figure.O);\n```\nДалее:\n```\n\t\tfinal String expectedLine = \" X | O | \\n\";\n```\nПроверку при вызове моего метода конечно не проходит, ибо делал по как мне казалось общепринятому правилу обращения к матрицам. new Point(0, 0), Figure.X; new Point(1, 0), Figure.O - Это первый столбец с X и O, а не строка, в первой строке только X.\nВнесите ясность пожалуйста...","plain_title":"Может я что то не понимаю, но при обращении к элементу матрицы всегда обращаются: Матрица(№СТРОКИ,№СТОЛБЦА). Собственно так и было до этого задания, пока не появилась эта строчка для проверки: field.setFigure(new Point(0, 0), Figure.X); field.setFigure(new Point(1, 0), Figure.O); Далее: final String expectedLine = \" X | O | \\n\"; Проверку при вызове моего метода конечно не проходит, ибо делал по как мне казалось общепринятому правилу обращения к матрицам. new Point(0, 0), Figure.X; new Point(1, 0), Figure.O - Это первый столбец с X и O, а не строка, в первой строке только X. Внесите ясность пожалуйста... ","creator":{"public_name":"Павел Аверкин","id":80129,"is_tutor":false},"comments":[{"creator":{"public_name":"Глеб Бочкарёв","id":50147,"is_tutor":false},"id":3732,"body":"Да, действительно Х и Y перепутаны местами, но возможно мы не будем это фиксить, чтобы это заставляло задуматься в процессе решения. ","topic_id":2179}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":46692,"title":"Добрый день, можно разобрать задание из теста:\n\n```\npublic class Player {\n\n\tpublic static void main( String args[] ) {\n\t\tString s = \"1234\";\n\t\tStringBuilder sb = new StringBuilder(s.substring(2) \n\t\t\t\t.concat(\"56\")\n\t\t\t\t.replace(\"7\",\"6\"));\n \n\t\tSystem.out.println(sb.append(\"89\").insert(3,\"x\"));\n\t}\n}\n```\n\nИ почему получился именно такой ответ (345x689)\n\n1. У нас есть строка: 1234\n2. Мы берем подстроку со второго индекса - это будет 3 (потому что отсчет начинается с нуля)\n3. Объединяем получившееся (34) с 56\n4. Не совсем понятно в этом случае как отработал replace. Он должен был заменить 6 на 7?\n5. с помощью append добавляем к получившейся строке 89. и на третий индекс вставляем х\n\nЗаранее благодарю\n","plain_title":"Добрый день, можно разобрать задание из теста: public class Player { public static void main( String args[] ) { String s = \"1234\"; StringBuilder sb = new StringBuilder(s.substring(2) .concat(\"56\") .replace(\"7\",\"6\")); System.out.println(sb.append(\"89\").insert(3,\"x\")); } } И почему получился именно такой ответ (345x689) У нас есть строка: 1234 Мы берем подстроку со второго индекса - это будет 3 (потому что отсчет начинается с нуля) Объединяем получившееся (34) с 56 Не совсем понятно в этом случае как отработал replace. Он должен был заменить 6 на 7? с помощью append добавляем к получившейся строке 89. и на третий индекс вставляем х Заранее благодарю ","creator":{"public_name":"Анастасия Москалец","id":274947,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":100703,"body":"Здравствуйте.\n\n> Не совсем понятно в этом случае как отработал replace. Он должен был заменить 6 на 7?\n\nНаоборот. Это видно в сорцах `String`. А поскольку `\"7\"` отсутствует в строке — ничего не происходит.","topic_id":46692}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":21429,"title":"Опечатка в тексте под видео \"SдringBuffer\"","plain_title":"Опечатка в тексте под видео \"SдringBuffer\" ","creator":{"public_name":"Алексей Аношкин","id":14628,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":45438,"body":"Спасибо за внимательность.\n\nУже исправлено )","topic_id":21429}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}},{"id":41376,"title":"Доброго времени суток. \nПочему-то в созданный StringBuilder не записываются данные по иксам и ноликам. Однако метод generateLine работает как надо и все что нужно записывает. Подозреваю, что где-то некорректно создана какая-либо из ссылок (game. ...). Подскажите, пожалуйста, где ошибка https://ru.hexlet.io/code_reviews/251376 ","plain_title":"Доброго времени суток. Почему-то в созданный StringBuilder не записываются данные по иксам и ноликам. Однако метод generateLine работает как надо и все что нужно записывает. Подозреваю, что где-то некорректно создана какая-либо из ссылок (game. ...). Подскажите, пожалуйста, где ошибка https://ru.hexlet.io/code_reviews/251376 ","creator":{"public_name":"Сабина Муссаева","id":247660,"is_tutor":false},"comments":[{"creator":{"public_name":"Сабина Муссаева","id":247660,"is_tutor":false},"id":90199,"body":"Да, действительно поняла задание не совсем так, как предполагалось. Перекроила решение, все получилось, спасибо!","topic_id":41376},{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":90164,"body":"Взглянул на тесты. Есть отдельный тест на метод `generateLine`. Так что вам в любом случае придётся перенести логику набора одной строки игрового поля (с X и O) в него. ","topic_id":41376},{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":90163,"body":"Добрый день!\n\nВы основательно перекроили задумку автора) Метод `generateLine` должен был (по задумке автора) выводить одну линию игрового поля (вместе с крестиками и ноликами, а не только разделитель). Так можно было бы избежать вложенных циклов.\n\nВот этот код явно ошибочный:\n```\n.append(\"game.getField().getFigure(new Point(i, j))\") //должно получиться _X_ или _O_, где _-это пробел\n```\nПодумайте почему он не выведет X или O и что он будет выводить на самом деле.\n\nПравда тест валится похоже не из-за этого. Я бы вам предложил отрефакторить ваш код опираясь на следующее:\n1. Если вы несколько раз обращаетесь в класс за одним и тем же, то лучше вынести это в отдельную переменную, чем ходить в класс много-много раз за одним и тем же. (например, `getField` ,`getSize`, `getFigure` много раз возвращают одно и то же)\n2. Условия в `if (X || O)` заменить на `!=null`\n3. Ну и убрать из ревью старый закоментированный код, если он вам для чего-то не нужен.\n \nТак программа станет гораздо понятнее и, возможно, вы и сами поймёте в чем была проблема)\n","topic_id":41376}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 6. Урок 1. Составные строки в Java.","entity_url":null,"active":true}}],"lesson":{"exercise":null,"units":[{"id":339,"name":"theory","url":"/courses/java_101/lessons/stringbuffer/theory_unit"},{"id":341,"name":"quiz","url":"/courses/java_101/lessons/stringbuffer/quiz_unit"}],"links":[],"ordered_units":[{"id":339,"name":"theory","url":"/courses/java_101/lessons/stringbuffer/theory_unit"},{"id":341,"name":"quiz","url":"/courses/java_101/lessons/stringbuffer/quiz_unit"}],"id":238,"slug":"stringbuffer","state":"approved","name":"Модуль 6. Урок 1. Составные строки в Java.","course_order":24,"goal":"Получить теоретические знания о том, что такое cоставные строки в Java и закрепить полученные навыки на практике.","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"140645660","theory":"## Создание строк\n\n* С помощью присвоения некой строки соответствующей по типу ссылке: \n`final String string = \"Some string\";`\n\n* С помощью конструктора, который на вход принимает строку:\n\n`final String name = new String(\"Slava\");`\n\n* С помощью массива символов. Для начала уясним:\n__Литералы__ - это объекты, которые создаются в коде на основании записи, сделанной по определенным правилам.\nДвойные кавычки означают, что это строковый литерал и содержимое должно быть преобразовано в объект `String`. Одинарные кавычки - объект `char`.\nЗная это, можно переписать строку из предыдущего примера следующим образом: \n\n```java\nfinal char[] nameArray = new char[] {'S', 'l', 'a', 'v', 'a'};\nfinal String name = new String(nameArray);\n```\nТеперь вы знаете, что `String` это ссылочный тип, который внутри реализован как массив `char`.\n\n* С помощью специальных классов-билдеров.\nСуществует два специальных класса для создания `String`: `StringBuilder` и `StringBuffer`.\n__StringBuilder__ резервирует массив на 16 символов больше, чем нужно изначально. Следующее увеличение размера в два раза плюс один символ. Работает намного быстрее, чем через обычный `String()`.\n\n__Конструкторы__ класса `StringBuilder`:\n\n1. Создает массив через конструктор супер, передает туда длину строки плюс 16 символов и добавляет текущую строчку.\n\n\t```java\n\tpublic StringBuilder(String str) {\n\t\tsuper(str.length() + 16);\n\t\t\tappend(str);\n\t\t}\n\t```\n\n2. Создает пустой массив заданной длины.\n\n\t```java\n\tpublic StringBuilder(int capacity) {\n\t\tsuper(capacity);\n\t}\n\t```\n\n3. Default - создает массив на 16 символов.\n\n\t```java\n\tpublic StringBuilder() {\n\t\tsuper(16);\n\t}\n\t```\n\nНаследование и предки этих билдеров:\n\n__String builder__ и __String buffer__ --> __AbstractStringBuilder__ --> __Object__\n\nДля `StringBuffer` работают те же конструкторы и работает он так же, как и `StringBuilder`, за одним исключением: `StringBuffer` безопасен для использования в многопоточный среде, но очень медленный. В свою очередь `StringBuilder` небезопасный для такого использования, но быстр.\n\nРекомендую почитать спецификации на каждый из этих классов, изучить методы и их применение. Где искать информацию по конкретным классам Вы уже должны знать к этому уроку :)\n\nОтдельно стоит упомянуть __оператор конкатенации__ `+`. Строки он просто объединяет.\n\nПри __конкатенации__ (объединении) строк часто возникают проблемы с выделением памяти, появляется ошибка OutOfMemoryError. Поэтому для частого преобразования строки путем ее наполнения новыми символами или даже строками - _**лучше использовать билдеры**_.\n\nИз-за больших объемов строк, которые будут объединяться с помощью обычного оператора конкатенации - может зависать программа, т.к. _**Garbage Collector**_ приостанавливает работу программы для очистки различных остатков строк.\n\n[Спецификация класса String](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html)\nНе стесняйтесь искать там методы, которые уже решают поставленные задачи или как-то помогают их решать.\n\n\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":4,"name":"theory","url":"/courses/java_101/lessons/intro_to_java/theory_unit"}],"links":[],"ordered_units":[{"id":4,"name":"theory","url":"/courses/java_101/lessons/intro_to_java/theory_unit"}],"id":3,"slug":"intro_to_java","state":"approved","name":"Модуль 1. Урок 1. Введение в Java.","course_order":1,"goal":"Рассмотреть темы уроков сета Java 101: изучение Java с нуля, переход на Java SE8 и практическая разработка своего ПО.","self_study":null,"theory_video_provider":"youtube","theory_video_uid":"T13TlpHyxPU","theory":"## Цели курса\n\n* научиться основам программирования на Java\n* получить достаточно знаний, чтобы пройти сертификации первого уровня + основы функционального программирования из Java 8\n* получить практические навыки использования языка - написать реальный проект в процессе обучения\n\n## Условия для старта\n\n* добросовестно подходить к изучению\n* минимальное знание английского\n* необязательный опыт программирования\n* огромное желание учиться\n* внимательность!\n\nВ случае ядерной войны доступны контакты преподавателя курса (_в приоритете подписчики_):\n\n* skype: b0noii\n* e-mail: viacheslav@b0noi.com\n* twitter: [@b0noi](https://twitter.com/b0noi)\n\n## Структура курса\n\n* 10 больших модулей программы от oracle\n* на каждый модуль по 4+ урока\n* после курса будет большой тест.\n* почти каждый урок будет состоять из:\n\t- видео и текстового материала,\n\t- теста на основе теории и дополнительных материалов,\n\n## Дополнительные материалы\n\n- С первых дней обучения, уделяйте внимание [java code-style](https://www.lar.ru/java-codestyle/).\n- С тех же первых дней, у вас будет много вопросов и ошибок. Не стесняйтесь задавать вопросы! Но задавайте вопросы как можно точнее, чтобы получить точный ответ. Вот хорошая статья о том [как задавать вопросы](https://ru.hexlet.io/blog/posts/question-rules). Этот подход пригодится вам не только в обучении но и в работе!\n"},"id":31,"slug":"java_101","challenges_count":0,"name":"Введение в Java","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"free","description":"Практический курс по Java «с нуля» от инженера с опытом работы в крупнейших ИТ-компаниях мира.\n\nКурс посвящен изучению основ Java, популярного объектно-ориентированного языка программирования, разработанного компанией Oracle. Программы на Java транслируются в байт-код, который выполняет виртуальная машина Java (JVM). JVM — это программа, обрабатывающая байтовый код и передающая инструкции оборудованию как интерпретатор. Это позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина, независимо от операционной системы и оборудования.\n\nКурс рассчитан как на людей, не сталкивавшихся с программированием, так и на начинающих программистов.\nРекомендуемое продолжение — курс [Java Generics](https://ru.hexlet.io/courses/java_generics).","kind":"sandbox","updated_at":"2026-01-20T11:54:32.501Z","language":"java","duration_cache":45120,"skills":["Создавать несложные программы, используя основные конструкции языка (условия, циклы, методы и другие)","Разделять код на методы для повторного использования","Правильно анализировать ошибки в коде и пользоваться отладочной печатью при их поиске"],"keywords":["основы Java","JVM","логика","типы данных","алгоритмы"],"lessons_count":38,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODk5NCwicHVyIjoiYmxvYl9pZCJ9fQ==--50ee157ee29e5c50f50aa2191806e9d83fca25e6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--6067466c2912ca31a17eddee04b8cf2a38c6ad17/image.png"},"recommendedLandings":[],"lessonMemberUnit":null,"accessToLearnUnitExists":true,"accessToCourseExists":true},"url":"/courses/java_101/lessons/stringbuffer/theory_unit","version":"0b0c6d4ebbd40fd58630a0dd89cc25544ccdf24e","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Введение в Java</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Модуль 6. Урок 1. Составные строки в Java.</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Модуль 6. Урок 1. Составные строки в Java.","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"Введение в Java"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div style="margin-bottom:var(--mantine-spacing-xl)" class=""><div class="ratio ratio-16x9"><iframe width="100%" height="auto" src="//player.vimeo.com/video/140645660" loading="lazy" allowFullScreen="" title="video"></iframe></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><h2 id="heading-2-1">Создание строк</h2>
<ul>
<li>
<p>С помощью присвоения некой строки соответствующей по типу ссылке:
<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">final String string = "Some string";</code></p>
</li>
<li>
<p>С помощью конструктора, который на вход принимает строку:</p>
</li>
</ul>
<p><code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">final String name = new String("Slava");</code></p>
<ul>
<li>С помощью массива символов. Для начала уясним:
<strong>Литералы</strong> - это объекты, которые создаются в коде на основании записи, сделанной по определенным правилам.
Двойные кавычки означают, что это строковый литерал и содержимое должно быть преобразовано в объект <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">String</code>. Одинарные кавычки - объект <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">char</code>.
Зная это, можно переписать строку из предыдущего примера следующим образом: </li>
</ul>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">final char[] nameArray = new char[] {'S', 'l', 'a', 'v', 'a'};
final String name = new String(nameArray);</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Теперь вы знаете, что <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">String</code> это ссылочный тип, который внутри реализован как массив <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">char</code>.</p>
<ul>
<li>С помощью специальных классов-билдеров.
Существует два специальных класса для создания <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">String</code>: <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuilder</code> и <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuffer</code>.
<strong>StringBuilder</strong> резервирует массив на 16 символов больше, чем нужно изначально. Следующее увеличение размера в два раза плюс один символ. Работает намного быстрее, чем через обычный <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">String()</code>.</li>
</ul>
<p><strong>Конструкторы</strong> класса <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuilder</code>:</p>
<ol>
<li>
<p>Создает массив через конструктор супер, передает туда длину строки плюс 16 символов и добавляет текущую строчку.</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
</li>
<li>
<p>Создает пустой массив заданной длины.</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">public StringBuilder(int capacity) {
super(capacity);
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
</li>
<li>
<p>Default - создает массив на 16 символов.</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">public StringBuilder() {
super(16);
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
</li>
</ol>
<p>Наследование и предки этих билдеров:</p>
<p><strong>String builder</strong> и <strong>String buffer</strong> --> <strong>AbstractStringBuilder</strong> --> <strong>Object</strong></p>
<p>Для <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuffer</code> работают те же конструкторы и работает он так же, как и <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuilder</code>, за одним исключением: <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuffer</code> безопасен для использования в многопоточный среде, но очень медленный. В свою очередь <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">StringBuilder</code> небезопасный для такого использования, но быстр.</p>
<p>Рекомендую почитать спецификации на каждый из этих классов, изучить методы и их применение. Где искать информацию по конкретным классам Вы уже должны знать к этому уроку :)</p>
<p>Отдельно стоит упомянуть <strong>оператор конкатенации</strong> <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">+</code>. Строки он просто объединяет.</p>
<p>При <strong>конкатенации</strong> (объединении) строк часто возникают проблемы с выделением памяти, появляется ошибка OutOfMemoryError. Поэтому для частого преобразования строки путем ее наполнения новыми символами или даже строками - <em><strong>лучше использовать билдеры</strong></em>.</p>
<p>Из-за больших объемов строк, которые будут объединяться с помощью обычного оператора конкатенации - может зависать программа, т.к. <em><strong>Garbage Collector</strong></em> приостанавливает работу программы для очистки различных остатков строк.</p>
<p><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html" rel="noopener noreferrer" target="_blank">Спецификация класса String</a>
Не стесняйтесь искать там методы, которые уже решают поставленные задачи или как-то помогают их решать.</p></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/java_101/lessons/stringbuffer/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 38</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/java_101/lessons/stringbuffer/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-CdBlNCiQ.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>