Знаешь ли ты JAVA, %username%?

JAVA Evil EditionНедавно я сдавал экзамен Oracle Certified Professional Java Programmer (бывший Sun Certified), и за время подготовки прорешал огромное количество различных задачек. Отдельные задачки по джаве иногда появляются на хабре и вызывают немалый интерес, поэтому я решил поделиться накопленным и сделать небольшую подборку.

Итак, ниже представлен десяток наиболее, на мой взгляд, интересных задач по Java SE из более чем 1000, проработанных мной. Сложность варьируется от средней до ооооооочень сложной. Решение большинства задач практически не требует знания API, достаточно логики и фундаментальных основ Java.

К слову, сложность экзамена Oracle Certified Professional Java Programmer гораздо ниже чем сложность данного теста, поэтому все, кто правильно ответит хотя бы на половину этих вопросов, может смело сдавать этот экзамен без всякой подготовки.

На самом деле количество очень понравившихся мне вопросов в несколько раз больше, поэтому через недельку я планирую написать продолжение данной темы. Если вопросы показались вам слишком легкими или наоборот, слишком сложными — дайте мне знать, внесем коррективы.

ВНИМАНИЕ: во второй половине статьи — ответы и подробные пояснения по соответствующим нюансам JAVA.



Тест


Во всех вопросах правильный ответ только один.

Вопрос 1

Имеется следующий код:
public class Overload{
  public void method(Object o) {
    System.out.println("Object");
  }
  public void method(java.io.FileNotFoundException f) {
    System.out.println("FileNotFoundException");
  }
  public void method(java.io.IOException i) {
    System.out.println("IOException");
  }
  public static void main(String args[]) {
    Overload test = new Overload();
    test.method(null);
  }
}

Результатом его компиляции и выполнения будет:
  1. Ошибка компиляции
  2. Ошибка времени выполнения
  3. «Object»
  4. «FileNotFoundException»
  5. «IOException»

Вопрос 2

Float f1 = new Float(Float.NaN);
Float f2 = new Float(Float.NaN);
System.out.println( ""+ (f1 == f2)+" "+f1.equals(f2)+ " "+(Float.NaN == Float.NaN) );

Что будет выведено в результате выполнения данного куска кода:
  1. false false false
  2. false true false
  3. true true false
  4. false true true
  5. true true true

Вопрос 3

class Mountain {
  static String name = "Himalaya";
  static Mountain getMountain() {
    System.out.println("Getting Name ");
    return null;
  }
  public static void main(String[ ] args) {
    System.out.println( getMountain().name );
  }
}

Что произойдет при попытке выполнения данного кода:
  1. Будет выведено «Himalaya» но НЕ будет выведено «Getting Name „
  2. Будет выведено “Getting Name » и «Himalaya»
  3. Ничего не будет выведено
  4. Будет выброшен NullPointerException
  5. Будет выведено «Getting Name », а потом выброшено NullPointerException

Вопрос 4

Integer a = 120;
Integer b = 120;
Integer c = 130;
Integer d = 130;
System.out.println(a==b);
System.out.println(c==d);

В результате выполнения данного кода будет выведено:
  1. true true
  2. false false
  3. false true
  4. true false
  5. произойдет ошибка времени выполнения

Вопрос 5

Прошлый вопрос уже когда-то поднимался на хабре, поэтому этот вопрос для тех, кому был не интересен предыдущий:
//In File Other.java
package other;
public class Other { public static String hello = "Hello"; }

//In File Test.java
package testPackage;
import other.*;
class Test{
  public static void main(String[] args) {
    String hello = "Hello", lo = "lo";
    System.out.print((testPackage.Other.hello == hello) + " ");
    System.out.print((other.Other.hello == hello) + " ");
    System.out.print((hello == ("Hel"+"lo")) + " ");
    System.out.print((hello == ("Hel"+lo)) + " ");
    System.out.println(hello == ("Hel"+lo).intern());
  }
}
class Other { static String hello = "Hello"; }

В результате мы получим:
  1. false true true false true
  2. false false true false true
  3. true true true true true
  4. true true true false true
  5. Все ответы неверны

Вопрос 6

Дана сигнатура метода:
public static <E extends CharSequence> List<? super E> doIt(List<E> nums)
Который вызывается как-то так:
result = doIt(in);

Какого типа должны быть result и in?
  1. ArrayList<String> in; List<CharSequence> result;
  2. List<String> in; List<Object> result;
  3. ArrayList<String> in; List result;
  4. List<CharSequence> in; List<CharSequence> result;
  5. ArrayList<Object> in; List<CharSequence> result;

Вопрос 7

public static void doIt(String String) { //1
  int i = 10;
  i : for (int k = 0 ; k< 10; k++) { //2
    System.out.println( String + i); //3
    if( k*k > 10) continue i; //4
  }
}

Данный код:
  1. Не скомпилируется из-за строки 1
  2. Не скомпилируется из-за строки 2
  3. Не скомпилируется из-за строки 3
  4. Не скомпилируется из-за строки 4
  5. Скомпилируется и запустится без проблем

Вопрос 8

public class Main {
  static void method(int... a) {
    System.out.println("inside int...");
  }
  static void method(long a, long b) {
    System.out.println("inside long");
  }
  static void method(Integer a, Integer b) {
    System.out.println("inside INTEGER");
  }
  public static void main(String[] args) {
    int a = 2;
    int b = 3;
    method(a,b);
  }
}

В результате мы получим:
  1. Ошибку компиляции
  2. Ошибку времени выполнения
  3. «inside int...»
  4. «inside long»
  5. «inside INTEGER»

Вопрос 9

class Super { static String ID = "QBANK"; }
class Sub extends Super{
  static { System.out.print("In Sub"); }
}
class Test{
  public static void main(String[] args) {
    System.out.println(Sub.ID);
  }
}

В результате выполнения данного кода:
  1. Он даже не скомпилируется
  2. Результат зависит от реализации JVM
  3. Будет выведено «QBANK»
  4. Будет выведено «In Sub» и «QBANK»
  5. Все ответы неверны

Вопрос 10

Имеется два класса:
//in file A.java
package p1;
public class A{
  protected int i = 10;
  public int getI() { return i; }
}

//in file B.java
package p2;
import p1.*;
public class B extends A{
  public void process(A a) {
    a.i = a.i*2;
  }
  public static void main(String[] args) {
    A a = new B();
    B b = new B();
    b.process(a);
    System.out.println( a.getI() );
  }
}

В результате выполнения класса В мы получим:
  1. Будет выведено «20»
  2. Будет выведено «10»
  3. Код не скомпилирутся
  4. Возникнет ошибка времени выполнения
  5. Все ответы неверны


Внимание — Ответы



Итак, сверим результаты:
  1. 4
  2. 2
  3. 2
  4. 4
  5. 4
  6. 3
  7. 5
  8. 4
  9. 3
  10. 3

Хочу поздравить тех, кто правильно ответил на большинство вопросов. Вы — круты.

Разбор полетов


Итак, начнем.

Вопрос 1

Имеется следующий код:
public class Overload{
  public void method(Object o) {
    System.out.println("Object");
  }
  public void method(java.io.FileNotFoundException f) {
    System.out.println("FileNotFoundException");
  }
  public void method(java.io.IOException i) {
    System.out.println("IOException");
  }
  public static void main(String args[]) {
    Overload test = new Overload();
    test.method(null);
  }
}

Наверное, мой любимый вопрос. Большинство людей угадывает ответ с 5-го раза. FileNotFoundException — последнее, о чем думаешь глядя на этот код. Но на самом деле всё просто. Начнем с того, что в любой метод можно передать null. А дальше компилятор выбирает наиболее узкую версию метода из возможных. В данном случае FileNotFoundException это подкласс IOException, который, в свою очередь, подкласс Object. Поэтому компилятор выбирает именно данный метод.

Вот немного другая ситуация:
public class Overload{
  public void method(Object o) {
    System.out.println("Object");
  }
  public void method(String s) {
    System.out.println("String");
  }
  public void method(StringBuffer sb) {
    System.out.println("StringBuffer");
  }
  public static void main(String args[]) {
    Overload test = new Overload();
    test.method(null);
  }
}

На первый взгляд код почти такой же, но он даже не скомпилируется, так как тут есть два метода на одном уровне иерархии, и компилятор не может выбрать наиболее специфичный из них.

Вопрос 2

Float f1 = new Float(Float.NaN);
Float f2 = new Float(Float.NaN);
System.out.println( ""+ (f1 == f2)+" "+f1.equals(f2)+ " "+(Float.NaN == Float.NaN) );

C первым выражением вроде всё ясно. Разные объекты, поэтому false. А вот дальше…
В Java NaN'ы несравнимы между собой. Но есть два исключения в работе класса Float:
  1. Если f1 и f2 оба представляют Float.NaN, тогда метод equals возвращает true, в то время как Float.NaN==Float.NaN принимает значение false.
  2. Если f1 содержит +0.0f в то время как f2 содержит -0.0f, метод equal возвращает false, в то время как 0.0f==-0.0f возвращает true.


Вопрос 3

class Mountain {
  static String name = "Himalaya";
  static Mountain getMountain() {
    System.out.println("Getting Name ");
    return null;
  }
  public static void main(String[ ] args) {
    System.out.println( getMountain().name );
  }
}

Тут всё просто: для всех static полей и методов компилятор заменяет название объекта на название класса, и во время выполнения уже не имеет никакого значения, была ссылка нулевой или нет.
То есть mountain.name меняется на Mountain.name.
Вообще рекомендуют при обращении к статик-членам класса всегда ссылаться на них именно через имя класса, а не объекта.

Вопрос 4

Integer a = 120;
Integer b = 120;
Integer c = 130;
Integer d = 130;
System.out.println(a==b);
System.out.println(c==d);

Многим данный вопрос знаком. Для остальных расскажу. Для более эффективного использования памяти, в джаве используются так называемые пулы. Есть строковый пул, Integer pool итд. Когда мы создаем объект не используя операцию new, объект помещается в пул, и в последствии, если мы захотим создать такой же объект (опять не используя new), новый объект создан не будет, а мы просто получим ссылку на наш объект из пула.
Особенность Integer-пула — он хранит только числа, которые помещаются в тип данных byte: от -128 до 127. Для остальных чисел пул не работает.

Вопрос 5

Таже тема, но сложнее:
//In File Other.java
package other;
public class Other { public static String hello = "Hello"; }

//In File Test.java
package testPackage;
import other.*;
class Test{
  public static void main(String[] args) {
    String hello = "Hello", lo = "lo";
    System.out.print((testPackage.Other.hello == hello) + " ");
    System.out.print((other.Other.hello == hello) + " ");
    System.out.print((hello == ("Hel"+"lo")) + " ");
    System.out.print((hello == ("Hel"+lo)) + " "); // runtime
    System.out.println(hello == ("Hel"+lo).intern());
  }
}
class Other { static String hello = "Hello"; }

Всё тот же строковый пул, но с нюансами.
Итак, 6 малоизвестных фактов о строках в Java:
1. Строковые литералы в одном классе представляют собой ссылки на один и тот же объект.
2. Строковые литералы в разных классах, но в одном пакете представляют собой ссылки на один и тот же объект.
3. Строковые литералы в разных классах и разных пакетах всё равно представляют собой ссылки на один и тот же объект )).
4. Строки, получающиеся сложением констант, вычисляются во время компиляции и далее смотри пункт первый.
5. Строки, создаваемые во время выполнения НЕ ссылаются на один и тот же объект. (поэтому четвертый вывод — false)
6. Метод intern в любом случае возвращает объект из пула, вне зависимости от того, когда создается строка, на этапе компиляции или выполнения. (Поэтому последний вывод — true).

Более подробно эта тема описана в пункте 3.10.5 спецификации Java.

Вопрос 6

Дана сигнатура метода:
public static <E extends CharSequence> List<? super E> doIt(List<E> nums)
Который вызывается как-то так:
result = doIt(in);

Какого типа должны быть result и in?
  1. ArrayList<String> in; List<CharSequence> result;
  2. List<String> in; List<Object> result;
  3. ArrayList<String> in; List result;
  4. List<CharSequence> in; List<CharSequence> result;
  5. ArrayList<Object> in; List<CharSequence> result;

Входной параметр был описан как List<E>, где E — это какой-то класс, наследующий CharSequence. Таким образом ArrayList<String>, List<String>, или List<CharSequence> — подходящие варианты для 'in'.
Данный метод возвращает List<? super E>, что значит, что это List, содержащий какой-то суперкласс E. Притом, E будет привязано к типу, который используется для 'in'. Например, если вы объявили ArrayList<String> in, E будет типа String.

Важный момент, который нужно понять, что невозможно заранее определить, что вернет метод. То есть вы не можете тут указать ни один из Java-классов, даже Object.

Единственный возможный вариант — использовать нетипизированный список, например: List result.

Данная тема достаточно сложна, и у меня есть мысли посвятить нюансам работы с коллекциями в Java отдельную статью. Там я постараюсь осветить эти моменты подробнее.

Вопрос 7

public static void doIt(String String) { //1
  int i = 10;
  i : for (int k = 0 ; k< 10; k++) { //2
    System.out.println( String + i); //3
    if( k*k > 10) continue i; //4
  }
}

Этот код работает ).

Есть еще более забавный пример:

class X {
  <X> X(X x) {
    System.out.println(x);
  }
}

Это тоже рабочий код, который печатает любой объект, который указать в конструкторе класса X.

Вернемся к нашей задаче. String это не ключевое слово, поэтому его можно использовать как идентификатор. Второй момент — джава хранит идентификаторы меток отдельно от всех остальных идентификаторов. Поэтому допускается использование одинаковых идентификаторов.

Вопрос 8

public class Main {
  static void method(int... a) {
    System.out.println("inside int...");
  }
  static void method(long a, long b) {
    System.out.println("inside long");
  }
  static void method(Integer a, Integer b) {
    System.out.println("inside INTEGER");
  }
  public static void main(String[] args) {
    int a = 2;
    int b = 3;
    method(a,b);
  }
}

В данном случае вызовется метод, принимающий тип long. Это сделано по той причине, что до 5й джавы не существовало ни методов с переменным количеством параметров, ни автоупаковки. Поэтому в старых версиях джавы вызвался бы метод long как единственный возможный. Поскольку нововведения не должны влиять на выполнение старого кода, вполне логично, что запускается метод long.

Если бы у нас было только два метода, «inside int...» и «inside INTEGER», запустился бы последний. Таким образом, приоритет автоупаковки в Java выше, чем приоритет vararg'ов.

Вопрос 9

class Super { static String ID = "QBANK"; }
class Sub extends Super{
  static { System.out.print("In Sub"); }
}
class Test{
  public static void main(String[] args) {
    System.out.println(Sub.ID);
  }
}

Статик-блоки запускаются во время инициализации класса. Весь вопрос в том, когда класс инициализируется, а это происходит в следующих случаях:
  1. Когда вызывается метод, непосредственно находящийся в данном классе (а не наследующийся от суперкласса)
  2. Когда вызывается конструктор данного класса, либо когда создается массив объектов данного класса
  3. Когда читается либо присваивается поле, которое не является константой

В данном случае, ни одно из этих трех условий не выполнялось, таким образом, класс Sub не инициализировался.

Вопрос 10

Имеется два класса:
//in file A.java
package p1;
public class A{
  protected int i = 10;
  public int getI() { return i; }
}

//in file B.java
package p2;
import p1.*;
public class B extends A{
  public void process(A a) {
    a.i = a.i*2;
  }
  public static void main(String[] args) {
    A a = new B();
    B b = new B();
    b.process(a);
    System.out.println( a.getI() );
  }
}

Данный вопрос отражает важное свойство спецификатора доступа protected. Во всех книгах и статьях пишут, что члены с доступом protected видны в данном пакете и в подклассах других пакетов. Но мало кто уточняет, что за пределами пакета данные члены видны ТОЛЬКО ЧЕРЕЗ НАСЛЕДОВАНИЕ.
У самого класса B есть доступ к полю i, но он не может вызывать его на другом объекте, как это сделано в примере, что и приводит к ошибке компиляции.

Надеюсь вам понравились данные задачи и их решения. С скором времени я напишу продолжение данной статьи, где мы рассмотрим другие интересные аспекты языка JAVA.

Спасибо за внимание.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 85

    +10
    ответил на 1 вопрос.
      –4
      Написали бы такой тест для C#, я бы вас бы расцеловал!!!
      • UFO just landed and posted this here
          0
          clck.ru/4YiE — не тест, но более чем достаточно.
            0
            Теперь бы себя проверить :)
          0
          6. Я не безнадежен :)
          Вопрос №7 ввел в ступор (параметр String и метка).
            +40
            Забавляют эти тесты, которые показывают уровень задротства конкретного языка, вместо умения, собственно, программировать.
            Бессмысленные и беспощадные.
              +7
              Зато знание таких вот вещей очень помогает на собеседованиях. Там очень часто любят что-то в этом духе спрашивать.
              Хотя тут я подобрал вопросы, которые логичны. А вот на самих экзаменах по сертификации реально большинство вопросов на задротство, притом не языка, а API, что еще хуже.
                +8
                Я б в жизнь не пошёл бы в такую контору, которая такие собеседования делает. В конце концов им что надо? Шашечки или ехать?
                • UFO just landed and posted this here
                +4
                Тем не менее такие тесты позволяют не зазнаваться, что тоже полезно. ;)
                  +3
                  или же, наоборот, зазнаться задротствующим :)
                • UFO just landed and posted this here
                    +10
                    Общее «умение программировать» — это хорошо, но оно не помогает, если:
                    5а. В одном jar-файле изменилось значение строковой константы, а код почему-то продолжает работать по-старому.
                    5б. Строковый пул одного класса не содержит имени другого класса, хотя мы наверняка знаем, что есть зависимость по использованию константы.
                    9. Класс в своем блоке статической инициализации регистрирует себя в реестре. Мы «дергаем» класс, а регистрации не происходит.

                    Другие вопросы тоже выглядят жизненно. Если человек сталкивался с этими особенностями языка Java, то, возможно, он действительно много программировал на Java. Другое дело, что лучше не задавать один из этих вопросов на собеседовании, а спросить, с какой запомнившейся проблемой сталкивался интервьюируемый.
                      +2
                      Другое дело, что лучше не задавать один из этих вопросов на собеседовании, а спросить, с какой запомнившейся проблемой сталкивался интервьюируемый.

                      Тут большой шанс получить историю о сексе с узкоспециализированной, кривой и хитровывернутой библиотекой. Они встречаются чаще таких фундаментальных косяков, и возни с ними обычно больше.
                        0
                        Такая история — тоже ок. Интересно ведь, как человек выходит из затруднений, и что для него — затруднение.
                        0
                        Проблему иногда и не вспомнишь вот так сразу )
                        Зато если спросят проблему, то знающий решит мгновенно, а незнающий — вряд ли решит сразу.
                          0
                          Это относится только к особенностям языка и компилятора, не к сторонним библиотекам. Лично мне нюансы сторонних API почему-то запоминаются, а вот особенности языка просто откладываются и вспоминаются только либо возникновении соответствующих симптомов, либо при непосредственном программировании.
                        +1
                        Это вопросы на понимание принципов работы языка, которое может сэкономить уйму времени на решение «WTF». Мелким аникейщикам такие знания конечно не к чему, для экспертов — обязательны.
                        Вобщем учите матчасть, Сэр
                          0
                          Зато такие знания очень помогают в попытках понять быдлокод, который тебе запрещено редактировать, ибо «работает, и не трогай» :-)
                          +4
                          Некоторые вопросы действительно интересные. Спасибо!
                            +1
                            ответил на 4 вопроса: 2, 4, 7, 10.
                              0
                              О, у меня точно такая же комбинация :-)

                              С 10-й лично сталкивался, жутко раздражало после плюсов :-)
                              +6
                              Спасибо за тест. Теперь вот сижу и мне стыдно за моё знание java.
                              Выложите плиз ссылки на остальные более чем 990 задачек.
                              • UFO just landed and posted this here
                                +8
                                Прочитал пост и понял что я не знаю java :(
                                  +1
                                  6/10.

                                  Я действительно люблю читать стандарты и запоминать такие узкие места :) Помогает не часто, но порой спасает.

                                  Чем мне нравится Java — там таких непонятных мест не очень много, и реально в хорошо написанном коде с ними сталкиваешься крайне редко.
                                    0
                                    К сожалению, только один правильный ответ. Но уж на 4-й то вопрос думал, что правильно отвечу…
                                      +1
                                      А где можно поподробнее прочитать про эти тонкости языка? Какую книгу посоветуете?
                                      +5
                                      Вот так какой нибудь задрот напишет подобный код или скопипастит, а ты сиди голову ломай.
                                      А ещё вместо обычного класса с методом, любят понаписать вокруг этого класса разной херни и вызывают этот метод через жопу.

                                      Чем код проще и логичнее тем лучше.
                                        +2
                                        Хочу такой же по Python. И, уверен, наберутся желающие попробовать решить подобные тесты для всех других языков)
                                          0
                                          Всего только два правильных ответа. Печаль, печаль…
                                            –2
                                            в избранное
                                              0
                                              реквестирую ответы с подробным разбором :)
                                                +12
                                                ну прямо даже… ээээ. не знаю что сказать:))
                                                  +1
                                                  ой, простите :)
                                                  хватило пяти вопросов, чтобы понять что я не знаю java, дальше не осилил)
                                                0
                                                brainbench.com есть для тренировок, но он за деньги. Есть еще хороший ресурс quizful.net. Там достаточно интересные и обширные тесты по java и другим технологиям. Правда он в последнее время как то вяло развивается.
                                                  0
                                                  Так экзамен то сдали? :)
                                                    0
                                                    Да. На экзамене большинство вопросов оказалось легче чем я думал. Набрал 92% при необходимых 65.
                                                    0
                                                    На brainbench частенько есть бесплатные тесты и по Java тоже.
                                                      0
                                                      По вопросв 9 у меня компилятор выдаёт такой вот результат:

                                                      $
                                                      error: Class names, 'Test', are only accepted if annotation processing is explicitly requested
                                                      1 error

                                                      К сведению,

                                                      $ java -version
                                                      java version «1.6.0_22»
                                                      Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
                                                      Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)
                                                        0
                                                        у меня всё работает. Версия джавы такая же. Возможно что-то с настройками IDE?
                                                        В любом случае не важно, класс можно переназвать ))
                                                          –1
                                                          Да, виноват, очепятался. Но вот вам в копилку ещё одна загадка: почему эта ошибка выдаётся, если набрать javac Test вместо javac Test.java?

                                                          ;-(
                                                            +1
                                                            ну как бы это не ошибка. для утилиты javac ты указываешь имя файла, который компилить. Поэтому расширение обязательно. А для java.exe нужно указывать имя класса, а не имя файла, поэтому .class писать не нужно.
                                                              –1
                                                              Ошибка, ошибка, написано же два раза: error ;-)
                                                        +5
                                                        В большинстве вопросов ответом будет «0. Так не стоит писать» =)
                                                        • UFO just landed and posted this here
                                                            0
                                                            Исходя из подписи «evil edition», череп.
                                                            0
                                                            ответил на 5,6,8,10((
                                                            жду продолжение!!!
                                                              0
                                                              2, 6, 7. Лососнул я что-то.
                                                                –1
                                                                Как то это все уныло :(
                                                                  0
                                                                  Никогда в жизни не писал на Java, только на Pythonе, ответил на 2,3,7,8,9, просто по интуиции.
                                                                    +1
                                                                    Чтобы сравнить с помощью == два скалярных типа надо знать про пул и особенности его устройства??!!.. Помнится когда появился С# жависты обвиняли его в нарушении принципов ООП — и это замечательно потому что там всегда 1000==1000.
                                                                      0
                                                                      А что не так? == сравнивает ссылки на объекты. Всегда. Просто когда юзается пул, получается что объект один а ссылок несколько, отсюда другой результат. Если хочешь сравнивать значения, используется equals, у которого «1000».equals («1000») всегда true.
                                                                      Я не силен в c#, но разве там == и пул не точно также работает?
                                                                        0
                                                                        В C# скалярные типы хранятся в стэке и не являются ссылочными типами — думаю это небольшой мемори импакт тк типы фиксированной длины. Похожий пул используется в .net для строк — тут это оправданно. Но это не столь важно в контексте дискуссии. Важно то что для cкалярных типов и строк оператор == сравнивает значения — по мне это и удобнее и интуитивнее.
                                                                          +1
                                                                          в Java тоже сравнивание примитивных типов по == работает как ожидается.
                                                                          int a = 1000;
                                                                          int b = 1000;

                                                                          a == b -> true

                                                                          В то время, как Integer — это уже не примитивный тип данных, а полноценный объект и сравнивание для него работает как для всех объектов.

                                                                          А помнить надо про auto boxing-unboxing — вот тут очень много тонкостей, и пул объектов, и утечки памяти
                                                                            0
                                                                            В .net int — это алиас для полноценного типа Int32 а примитивом он называется по другим очевидным причинам. Если угодно можно хоть так сравнивать: 5.Equals(5); но куда проще 5==5. И вообще, как наличие примитивов стоящих вне общей системы типов вписывается в концепцию ООП?
                                                                              0
                                                                              А в чём спор?
                                                                              > можно хоть так сравнивать: 5.Equals(5); но куда проще 5==5
                                                                              Для примитивов в Java возможен только второй способ, более простой :)
                                                                              Для объектов в любом руководстве по языку написано, что сравнивать объекты необходимо с помощью equals(), а не ==. Как по мне, разделение примитив-врапер удобно — разработчик сам решает что и где ему использовать (о том правильно ли он решит думать не хочется :).
                                                                              К сожалению, не очень знаком с .net, поэтому не хочу развивать дискуссию «что лучше» далее.

                                                                              Про концепцию ООП вообще молчу — всего должно быть в меру, примитивные типы — это как раз то разумное отступление, сделанное для удобства.
                                                                      0
                                                                      В C# скалярные типы хранятся в стэке и не являются ссылочными типами — думаю это небольшой мемори импакт тк типы фиксированной длины. Похожий пул используется в .net для строк — тут это оправданно. Но это не столь важно в контексте дискуссии. Важно то что для cкалярных типов и строк оператор == сравнивает значения — по мне это и удобнее и интуитивнее.
                                                                        0
                                                                        Ошибся веткой :)
                                                                        0
                                                                        жду изврат-тестов для Perl :)))
                                                                          0
                                                                          из интересного на собеседованиях вспонил
                                                                          int i=0;
                                                                          while(i){
                                                                          i++;
                                                                          if (i>4) break;
                                                                          }

                                                                          и задротства на тему необязательности выполнения второй части && и ||
                                                                            +1
                                                                            >и задротства на тему необязательности выполнения второй части && и ||

                                                                            А в чём тут задротство-то? Вполне нормальный вопрос, причём ситуации, где это используется, очень распространены.
                                                                            Банально:

                                                                            if ( array == null || array.length == 0 ) {
                                                                                return;
                                                                            }

                                                                            При незнании того, что в случае array == null второе сравнение не будет производиться, а следовательно можно не бояться NPE, этот код развернётся в что-то вроде

                                                                            if ( array == null ) {
                                                                                return;
                                                                            }
                                                                            else if ( array.length == 0 ) {
                                                                                return;
                                                                            }

                                                                            Что захламляет код даже, как видим, в самых тривиальных случаях.
                                                                              +1
                                                                              Вообще тут столько людей в коментах называет задротством знание тонкостей языка, что складывается впечатление, что научились писать простые классы и методы и считают себя самыми крутыми.
                                                                              А кто больше знает — просто задрот. Очень удобно.

                                                                              Незнание, например, принципов работы тех же пулов или автоупаковки может просто убить производительность отдельных кусков кода.
                                                                                +1
                                                                                угу, особенно опасны конструкции вида:

                                                                                Integer c = 0;
                                                                                Integer d = 0;
                                                                                ...
                                                                                
                                                                                synchronized ( c ) {
                                                                                ...
                                                                                }
                                                                                ...
                                                                                
                                                                                synchronized ( d ) {
                                                                                ...
                                                                                }
                                                                                


                                                                                Но это ещё ладно, всё просто будет больше тормозить, но намного хуже когда:
                                                                                Integer c = 0;
                                                                                ...
                                                                                
                                                                                synchronized ( c ) {
                                                                                    с++;
                                                                                    ...
                                                                                }
                                                                                ...
                                                                                
                                                                                synchronized ( с ) {
                                                                                    ...
                                                                                }
                                                                                


                                                                                Вуаля, много ли кто понимает, чем это опасно?
                                                                                  0
                                                                                  Думаю, понимают все, кто до сюда комментарии дочитал.
                                                                                  0
                                                                                  да ну что Вы… простые классы уметь писать… вот ещё…
                                                                                  кликнул пару раз по визарду, надергал примеров из инета, слепил прогу — и программер
                                                                                    0
                                                                                    Интересно, как вы оправдаете бредни вроде doIt(String String)? Неужели все те люди, не знающие, что именно произойдёт в таком абсурдном случае — «научились писать простые классы и методы и считают себя самыми крутыми»? (-;
                                                                                      0
                                                                                      Кто сказал что я это оправдываю? :) Очевидно, что писать такой код нельзя.

                                                                                      С другой стороны, знать что для идентификаторов могут использоваться любые последовательности символов кроме ключевых слов — иногда полезно.
                                                                                  0
                                                                                  Спасибо, очень интересно. Понял, что мне надо освежить знание языка.
                                                                                    +1
                                                                                    Изумительный тест.

                                                                                    Хотелось бы еше только, чтобы в ответах везде давалась ссылка на соотв. пункт JLS.

                                                                                    Типа —

                                                                                    «в вопросе про строковые литералы, см. „
                                                                                    java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5,

                                                                                      +1
                                                                                      Изумительный тест.

                                                                                      Хотелось бы еше только, чтобы в ответах везде давалась ссылка на соотв. пункт JLS.

                                                                                      Типа —

                                                                                      «в вопросе про строковые литералы, см. „
                                                                                      java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5,

                                                                                      обратите внимание на пункт:

                                                                                      This example illustrates six points:
                                                                                      Literal strings within the same class (§8) in the same package (§7) represent references to the same String object (§4.3.1).
                                                                                      Literal strings within different classes in the same package represent references to the same String object.
                                                                                      Literal strings within different classes in different packages likewise represent references to the same String object.
                                                                                      Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
                                                                                      Strings computed by concatenation at run time are newly created and therefore distinct.

                                                                                      Constant expressions описаны тут — java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

                                                                                      Тогда люди получат из вашей замечательной статьи не только знание факта, но с большей вероятностью углубятся в тему.

                                                                                      Продолжайте писать!
                                                                                        0
                                                                                        Ответил на 3, 4, 5, 6, 7, 9.
                                                                                        Внимательности не хватает :-)
                                                                                          0
                                                                                          подсветите код, черт возьми
                                                                                            0
                                                                                            Кто возьмется такое же сделать для Ruby?
                                                                                            Буду благодарен.

                                                                                              0
                                                                                              Если в 5 задаче пометить lo как final, то hello = «Hel» + lo тоже вернёт true.
                                                                                                0
                                                                                                ооо… отлично) Топик понравился)
                                                                                                  0
                                                                                                  4/10.
                                                                                                  Действительно хорошие вопросы на понимание.

                                                                                                  Ремарка: Автор не раскрыл тему многопоточного задротства.
                                                                                                  Тема коллекций c обобщениями раскрыта не полностью.

                                                                                                    0
                                                                                                    > Во всех книгах и статьях пишут, что члены с доступом protected видны в данном пакете и в подклассах других пакетов. Но мало кто уточняет, что за пределами пакета данные члены видны ТОЛЬКО ЧЕРЕЗ НАСЛЕДОВАНИЕ.

                                                                                                    В C++ тоже так. И в C#, мне кажется, тоже. Так что тут нет ничего особо удивительного.
                                                                                                    • UFO just landed and posted this here
                                                                                                        0
                                                                                                        Let's talk about Java*
                                                                                                          0
                                                                                                          6 из 10 верно, еще на двух пролетел по невнимательности :-)
                                                                                                          На этот раз правильно ответил на 3, 4, 5, 6, 7, 10.

                                                                                                          Only users with full accounts can post comments. Log in, please.