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

  • Чем заняться 23-го февраля

    Играть в снежки, например.

  • Пейнтбол

    Моя малышка. Последний раз рубился в клубе Гвардия в том году на внутреннем турнире сети фитнес клубов Спортив. 6 команд по 10 игроков.…

  • Фитнес который перетекает в пейнтбол

    Первый раз за последние два года выбрался. И сразу на турнир между клубами сети Спортив. 6 команд примерно по 12-13 человек. В нашей 10. Играли 6…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments