Это очень показательное интервью того факта, что если ты хорошо начал, то дальше тебя будет вести вперёд и оправдывать уже сам интервьюер. Очень неплохая психологическая уловка
Не понял момент со стринг билдером String s= "Hello" + "Wolrd"; тут при дебагинге будет один обьект в памяти Hello World String s= new StringBuilder().append("Hello").append("World").toString(); а тут наоборот 3 обьекта Hello & World & Hello World
Спасибо за вопрос. 1. String в Java является иммутабельным. Это значит что каждая строка будет создана и займет место в памяти. Раз: "Hello", Два: "World", Три: "Hello" + "World" и так далее. 2. Надо учитывать оптимитизации, которые происходят неявно. Для литерального выражения "Hello" + "World" в байткоде будет создан StringBuilder, который выполнит операцию append. Ясное дело, что это не обходится бесплатно с точки зрения ресурсов. 3. Если осуществлять операцию конкатенации a += "a" в цикле, то будет проблема производительности, поскольку создаются лишние "промежуточные" объекты. Тем самым занимая память и ресурсы. Вот как выглядит п.3 в коде: String a = "a"; for (int i = 0; i < 100; i++) a += "a"; А вот его байткод: Особенно уделить внимание секции L4-L5 L0 LINENUMBER 44 L0 LDC "A" ASTORE 1 L1 LINENUMBER 45 L1 ICONST_0 ISTORE 2 L2 FRAME APPEND [java/lang/String I] ILOAD 2 BIPUSH 10 IF_ICMPGE L3 L4 LINENUMBER 46 L4 NEW java/lang/StringBuilder DUP INVOKESPECIAL java/lang/StringBuilder. ()V ALOAD 1 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 1 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String; ASTORE 1 L5 LINENUMBER 45 L5 IINC 2 1 GOTO L2
Заметил, что отличает джуниора: * повторяет вопрос, чтобы понять, что спросили; * даёт ответы с вопросительной интонацией; * отвечает не на тот вопрос, который задавали.
20:04 "byte в памяти будет занимать один байт". Это неверно. В Java, в отличие от C++, базовые типы данных имеют фиксированную разрядность. Переменная типа byte в памяти физически будет занимать 4 байта, но занести в нее можно будет значение от -128 до 127. 37:11 "вероятно нужно сам массив еще урезать". При удалении элементов из ArrayList уменьшения capacity не происходит. Поэтому удаление элемента из конца ArrayList будет иметь сложность O(1). Так как не только не происходит уменьшения capacity, но и не происходит перезаписи элементов, стоящих справа от удаляемого, так как таких элементов нет.
@@nikhrom3551 Вообще много всяких особенностей при хранении примитивов в памяти. И как это делается фактически - зависит от реализации JVM. Так что примитивы (меньше int) вполне могут быть расширены до 4 байт. Но в любом случае, это касается только отдельно лежащих примитивов. Если же речь о массиве, то там все будет плотно упаковано и каждый byte будет занимать ровно один байт.
@@funbiscuit первый раз слышу о том, чтобы сам примитив расширялся. Есть такое понятие как "выравнивание данных". Суть заключается в том, что данные в памяти разбиваются на "пачки" по 4-8 байт в зависимости от процессора (допустим, есть пачка 4 байта, первый байт занят, допустим типом данных byte, а следом идёт тип данных int. И тогда 3 следующих байта после byte будут пустовать, чтобы не разбивать на части данные из int). Сделано это ради оптимизации. Например в C++ имеется возможность управлять этим процессом. Это абсолютно другой процесс, здесь не происходит расширения данных
@@nikhrom3551 В общем-то да, я в основном о выравнивании и говорил. Я скорее предполагаю, что реализация вполне может использовать int вместо byte в машинном коде т.к. современные процессоры вроде как быстрее с этим работают (хотя я не уверен), но как тогда можно обеспечить фиксированный диапазон (-128..127) я не представляю (возможно и нет гарантий, что после 127 будет идти -128 в случае byte).
Спасибо за контент! Возможно я упустил момент в постановке технической задачи, но было ли какое-то ограничение на создание вспомогательных классов? Т.е. можно было ли рассмотреть решение технической задачи через enum типы?
Спасибо за вопрос. Да, задача не была ограничена при необходимости создания классов. И Enum вполне можно использовать для решения данной технической задачи.
Может ты не заметил, это мок интервью и для меня оно было первым, помогло сделать работу над ошибками, прошел реальный собес и никто не закончил диалог (7 месяцев уже работаю)
@Эмиль Хачатрян По разному, бывают задачи и простые и сложные, но всегда помогут если не получается, пока таких задач чтобы никто не знал как решить ещё не ставилось, общими усилиями сложные задачи закрываем, это мок интервью помогло немного, в основном проверка знаний, от собеса зависит что будут спрашивать и как
Огромное спасибо за вашу работу, очень мотивирует ещё раз погуглить все эти темы!
Очень отрадно слышать, что наше дело живет и оно нужно ИТ-сообществу.
Таким вещи мотивируют и далее делать контент. Спасибо)
Музыка выдает хороший вкус. Уже второе видео мне она заходит....
А по видео: Юрий молодец:)
Это очень показательное интервью того факта, что если ты хорошо начал, то дальше тебя будет вести вперёд и оправдывать уже сам интервьюер. Очень неплохая психологическая уловка
Удачи Юра!!!!!
Не понял момент со стринг билдером
String s= "Hello" + "Wolrd"; тут при дебагинге будет один обьект в памяти Hello World
String s= new StringBuilder().append("Hello").append("World").toString();
а тут наоборот 3 обьекта Hello & World & Hello World
Спасибо за вопрос.
1. String в Java является иммутабельным. Это значит что каждая строка будет создана и займет место в памяти. Раз: "Hello", Два: "World", Три: "Hello" + "World" и так далее.
2. Надо учитывать оптимитизации, которые происходят неявно. Для литерального выражения "Hello" + "World" в байткоде будет создан StringBuilder, который выполнит операцию append. Ясное дело, что это не обходится бесплатно с точки зрения ресурсов.
3. Если осуществлять операцию конкатенации a += "a" в цикле, то будет проблема производительности, поскольку создаются лишние "промежуточные" объекты. Тем самым занимая память и ресурсы.
Вот как выглядит п.3 в коде:
String a = "a";
for (int i = 0; i < 100; i++) a += "a";
А вот его байткод:
Особенно уделить внимание секции L4-L5
L0
LINENUMBER 44 L0
LDC "A"
ASTORE 1
L1
LINENUMBER 45 L1
ICONST_0
ISTORE 2
L2
FRAME APPEND [java/lang/String I]
ILOAD 2
BIPUSH 10
IF_ICMPGE L3
L4
LINENUMBER 46 L4
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder. ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 1
L5
LINENUMBER 45 L5
IINC 2 1
GOTO L2
немного не понял, зачем мы кастим (T) в return
Будут ли собесы с мидлами?
Будет, все будет. Но постепенно ))
Заметил, что отличает джуниора:
* повторяет вопрос, чтобы понять, что спросили;
* даёт ответы с вопросительной интонацией;
* отвечает не на тот вопрос, который задавали.
20:04 "byte в памяти будет занимать один байт". Это неверно. В Java, в отличие от C++, базовые типы данных имеют фиксированную разрядность. Переменная типа byte в памяти физически будет занимать 4 байта, но занести в нее можно будет значение от -128 до 127.
37:11 "вероятно нужно сам массив еще урезать". При удалении элементов из ArrayList уменьшения capacity не происходит. Поэтому удаление элемента из конца ArrayList будет иметь сложность O(1). Так как не только не происходит уменьшения capacity, но и не происходит перезаписи элементов, стоящих справа от удаляемого, так как таких элементов нет.
Это откуда инфа такая про примитивные типы? По вашему примитивный тип long тоже занимает 4 байта?
@@nikhrom3551 Вообще много всяких особенностей при хранении примитивов в памяти. И как это делается фактически - зависит от реализации JVM. Так что примитивы (меньше int) вполне могут быть расширены до 4 байт. Но в любом случае, это касается только отдельно лежащих примитивов. Если же речь о массиве, то там все будет плотно упаковано и каждый byte будет занимать ровно один байт.
@@funbiscuit первый раз слышу о том, чтобы сам примитив расширялся. Есть такое понятие как "выравнивание данных". Суть заключается в том, что данные в памяти разбиваются на "пачки" по 4-8 байт в зависимости от процессора (допустим, есть пачка 4 байта, первый байт занят, допустим типом данных byte, а следом идёт тип данных int. И тогда 3 следующих байта после byte будут пустовать, чтобы не разбивать на части данные из int). Сделано это ради оптимизации. Например в C++ имеется возможность управлять этим процессом.
Это абсолютно другой процесс, здесь не происходит расширения данных
@@funbiscuit если есть по поводу этой темы какая-то другая информация, то хотелось бы почитать
@@nikhrom3551 В общем-то да, я в основном о выравнивании и говорил. Я скорее предполагаю, что реализация вполне может использовать int вместо byte в машинном коде т.к. современные процессоры вроде как быстрее с этим работают (хотя я не уверен), но как тогда можно обеспечить фиксированный диапазон (-128..127) я не представляю (возможно и нет гарантий, что после 127 будет идти -128 в случае byte).
Спасибо за контент! Возможно я упустил момент в постановке технической задачи, но было ли какое-то ограничение на создание вспомогательных классов? Т.е. можно было ли рассмотреть решение технической задачи через enum типы?
Спасибо за вопрос.
Да, задача не была ограничена при необходимости создания классов.
И Enum вполне можно использовать для решения данной технической задачи.
А можно было просто сделать c.newInstance() :) Ну и в трай-кэтч завернуть
Есть ли возможность пособеседоваться с тобой ? :)
Привет)
Конечно есть.
Вся информация на www.jetbulb.com
Подписывайся на телеграмм-канал.
Мы там регулярно даём анонсы.
t.me/jetbulb
Ему надо в автосалоне работать а не в продакшене писать код
Меня одного смутило, что парень несёт кучу непонятной воды, и ни слова по делу? На собеседовании после 2го вопроса уже бы закончили с ним диалог…
Да, у меня тоже терпения не хватило бы это спокойно слушать на месте интервьюера. Но Максим очевидно человек закаленный.
да согласен(
Может ты не заметил, это мок интервью и для меня оно было первым, помогло сделать работу над ошибками, прошел реальный собес и никто не закончил диалог (7 месяцев уже работаю)
@Эмиль Хачатрян По разному, бывают задачи и простые и сложные, но всегда помогут если не получается, пока таких задач чтобы никто не знал как решить ещё не ставилось, общими усилиями сложные задачи закрываем, это мок интервью помогло немного, в основном проверка знаний, от собеса зависит что будут спрашивать и как
@@YuryMusiyenka Привет.Как нашел первую работу?Через отклики или на тебя вышли?Можешь рассказать в кратце.
- Хорошо, хорошо
- Доктор, что хорошо?
- Хорошо, что не со мной
Джуниор? ...
А что так удивляет?
@@pressf8083 это даже на стажера не тянет
@@ЕвгенийЛист-х5п ну не расстраивайте так!)
О, Юра из Минска. "Земеля, а ты к кому приехал?"
Короче, Юра, иногда лучше слушать больше, чем говорить
Дофига перебивает. В утиль!
неприятный тип
еще и 2 в 4 бита у него байт занимает.... полный атас
байт от +4 до -4 , АХАХАХАХАХ, ржунемогу