java-coder

Любая Java-обезъяна (в том числе и я), знает, что в Java НЕЛЬЗЯ сравнивать объекты класса String спомощью ‘==’, потому что так будут сравниваться ссылки на объекты, а не сами строки.И соответсвенно вот такой вот код должен вернуть :

  • true
  • false
  1. public static void main(String[] args)
  2. {
  3. String hello1 = "Hello";
  4. String hello2 = "Hello";
  5. System.out.println(hello1.equals(hello2));
  6. System.out.println(hello1 == hello2);
  7. }

И…. Правильный ответ:

  • true
  • true

ВНЕЗАПНО! Не правда ли? Всё потому, что при такой вот записи строки создаются не в куче Java, а сразу в пууле строк. И соответсвенно hello1 и hello2 указывают на одну и туже область памяти.

Чтобы создать  объект строки в  heap необходимо сделать так:

  1. public static void main(String[] args)
  2. {
  3. String hello1 = "Hello";
  4. String hello2 = new String("Hello");
  5. System.out.println(hello1.equals(hello2));
  6. System.out.println(hello1 == hello2);
  7. }

И вот тут уже ответ будет:

  • true
  • false

Так же есть специальный метод, который может положить объект класса String в пулл и вернёт ссылку на него, название этого метода intern().  В следующем куске кода, если добавить его в предыдущий пример вывод в консоль будет trueHello.

  1. hello2 = hello2.intern();
  2. System.out.println(hello1 == hello2);
  3. System.out.println(hello2);
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс