Quicklet 2

Рубрика: Java, Задачки | 11 April 2007, 13:55 | juriy

Вот еще один пример для разминки, наслаждайтесь. Как всегда, просьба сначала отвечать, а уж затем вызывать javac.

[java]

public class Test {

  private static void checkMe(String a, String b) {
    if (a == b)
      System.out.print("The same ");
    else
      System.out.print("Not the same ");

    if (a.equals(b))
      System.out.println(" and equals ");
    else
      System.out.println(" and not equals ");
  }

  public static void main(String[] args) {
    String a;
    String b;

    a = new String ("Are they the same?");
    b = new String ("Are they the same?");
    checkMe(a, b);

    a = "Not a chance?";
    b = "Not a chance?";
    checkMe(a, b);

    a = new String(b);
    b = new String(a);
    checkMe(a, b);
  }
}

[/java]

Что будет напечатано после выполнения фрагмента?

1.
Not the same and equals
Not the same and equals
The same and equals

3.
Not the same and equals
The same and equals
Not the same and equals

2.
The same and equals
Not the same and equals
Not the same and equals

4.
Not the same and equals
Not the same and equals
Not the same and equals

Комментариев: 12

12 Responses to “Quicklet 2”

Комментарии:

  1. vadim

    Исходя из того, что == проверяет развность ссылок на обьекты, а equals – значения, то:

    В первом случае
    Not the same and equals (2 разных обьекта с одинаковыми значениями)

    Во втором – под вопросом будут ли a и b указывать на один экземпляр строки или на разные копии в пуле? Скорее всего это будет одна и та же строка. Потому
    The same and equals

    В третьем – копирующий конструктор создает копии строк. Потому
    Not the same and equals

    Итого, ответ №3, какой почемe-то стоит после ответа №1 и перед ответом №2.

  2. Traut

    #4
    если не ошибаюсь, “some” создает новый объект и во втором случае все же not the same

  3. Traut

    черт :) на один объект ссылаются все-таки

  4. vadim

    В этом то и была “соль” этой задачки.

  5. Sanya

    Давай еще! :)

  6. Snal

    Насколько я помню, это как повезет.
    a = “Not a chance?”;
    b = “Not a chance?”;
    могут ссылаться, а могут и не ссылаться на один и тот же объект. Это уж как JVM захочет. Т.е. для этого примера они, скорее всего, будут одинаковыми, но это просто повезло.

  7. vadim

    2Snal: Мне тоже так кажется.
    Если написать:
    [java]a = “Not a chance?”.intern();
    b = “Not a chance?”.intern();[/java]
    тогда a и b точно должны указывать на один и тот же обьект.

  8. Juriy

    Не совсем так. Вот выдержка из спецификации JVM:

    The Java programming language requires that identical string literals (that is, literals that contain the same sequence of characters) (!)must(!) refer to the same instance of class String. In addition, if the method String.intern is called on any string, the result is a reference to the same class instance that would be returned if that string appeared as a literal. Thus,

    (“a” + “b” + “c”).intern() == “abc”

    must have the value true.

    Полная версия документа лежит тут: http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html

  9. Juriy

    Кстати, никто не хочет ради интереса скомпилировать этот кусочек кода и запустить на виртуальной машине какого-нибудь мобильного терминала? Вот где-где, а там довольно часто на спецификации забивают.

  10. Snal

    Насколько я помню, ссылаться на одно и то же место они будут после птимизации. А до нее строки вполне могут иметь разные ссылки. Вроде бы.

  11. vadim

    2Snal: Скорее не оптимизации, а интернализации.

  12. Юра

    2 vadim, Snal

    Да ладно вам спорить, я же даже ссылку на спецификацию привел: идентичные строковые литералы _обязаны_ ссылаться на один и тот же объект. Это требование к работе VM.
    Кстати, если скомпилировать такой класс:

    [java]
    public class Test {
    public static void main(String[] args) {
    String a = “Not a chance?”;
    String b = “Not a chance?”;
    System.out.println(a + args.length + b);
    }
    }
    [/java]

    А потом посмотреть в блокноте .class файл, который получился, то видно, что литерал “Not a chance?” встречается там только однажды.

Leave a Reply