BrotherFlame (brotherflame) wrote,
BrotherFlame
brotherflame

Category:

Ответы на вопросы к собесам

Пойду в обратном порядке.

14. Сделать класс неизменяемым (immutable)

class A {
int x;
public A();
public A(int x) {
this.x = x;
}
public A setX(int x) {
return new A(x);
}
public int getX() {
return x;
}
}

Иммутабельность это невозможность изменения состояния обьекта после его создания.
Таким образом мы можем задать поле x в конструкторе, но метод set, подразумевающий изменение этого поля , не меняет его у обьекта, а создает новый обьект.
Любые методы, которые так или иначе меняют значение полей обьекта, должны возвращать новый обьект, а не менять старый.

13. Почему строки immutable
String s1 = "ололо"; //1
String s2 = "ололо"; //2
Строка это массив char[]
В строке 1 будет создан обьект, внутри которого будет {'о','л','о','л','о'}
Будет ли создан в строке 2 еще один такой обьект?
Нет. Ява отправляет строки в пул строк. При добавлении в пул, проверяется, нет ли там уже такой строки? Т.к.она там уже есть в этом примере, то новый обьект создан не будет, вместо этого s2 будет ссылаться на уже созданный в строке 1 обьект.
Экономим память для одинаковых строк. Профит.
Если же кто замыслит недоброе, и подумает о том, чтобы по ссылке s2 поменять обьект, на который так же ссылается s1, то обломается. Строки же immutable. Это если создавать строки как константы при помощи String s = "..."
Если создать
String s = new String("ололо");
То будет создан новый обьект в куче, не в пуле строк.
s.intern(); // сделает то же самое, что String s = "..."; отправит обьект в пул, и s будет ссылаться на обьект из пула строк.
Иммутабельность так же снимает проблемы с синхронизацией в многопоточной программе. Если обьект в принципе нельзя изменить, то и разные потоки одновременно его поменять не могут тем более. Иммутабельность > потокобезопасность.
Ну и про сравнение при помощи ==
== сравнивает ссылки на обьекты, а не сами обьекты по их содержимому.
Поэтому в примере выше
s1 == s2 // true, ссылаются на один и тот же обьект в пуле строк
s1 == s // false, ссылаются на разные обьекты
s1 == s.intern() // true, интерн запихнул строку в пул, а так как там уже есть "ололо", то просто вернул ссылку на него.
Tags: work
Subscribe

  • Проходка

    Сделал проходку с тренером. Присед катастрофически упал до 150 на раз. Абсолютный максимум был 180. Жим, который всегда сильно падал после перерыва в…

  • Первый раз в первый класс

    alex_odessa Спасибо! Сегодня первое занятие было, пока теория, к практике технически сегодня был не готов. Но это годнота и крутотень до…

  • Внёс бронь

    Посидел на Сырке. Попялился на карбоновый триколор за 2.5м, он так выглядит, что кончить можно от одного вида, посидел на нем, на 1 или 2 см выше…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments