25 ОктJava. Вопросы на собеседовании и ответы. Часть 1

Часто задаваемые вопросы на собеседованиях по Java. В статье рассмотрено 5 вопросов.

1. Вопрос: Побитовые операции.
Ответ: В Java существуют следующие виды побитовых операций:

|	ИЛИ (OR)
&	И (AND)
^	ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)
~	ОТРИЦАНИЕ (NOT)
<<	сдвиг влево
>>	сдвиг вправо
>>>	беззнаковый сдвиг вправо

Побитовое ИЛИ (OR) |

00000000 00000000 00000000 01111011 (123)
|
00000000 00000000 00000001 11001000 (456)
=
00000000 00000000 00000001 11111011 (507)

Побитовое И (AND) &

00000000 00000000 00000000 01111011 (123)
&
00000000 00000000 00000001 11001000 (456)
=
00000000 00000000 00000000 01001000 (57)

ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) ^

00000000 00000000 00000000 01111011 (123)
^
00000000 00000000 00000001 11001000 (456)
=
00000000 00000000 00000001 10110011 (435)

ПОБИТОВОЕ ОТРИЦАНИЕ (NOT) ~

~
00000000 00000000 00000000 01111011 (123)
=
11111111 11111111 11111111 10000100 (-124)

Знаковый оператор сдвига влево <<
Все биты смещаются влево. Число справа дополняется нулем.

00000000 00000000 00000000 00011111 (31)
<<
2
=
00000000 00000000 00000000 01111100 (124)

Знаковый оператор сдвига вправо >>
Все биты смещаются вправо. Число слева дополняется нулем, если число положительное и единицей, если отрицательное.

11111111 11111111 11111111 11101111 (-5)
>>
2
=
11111111 11111111 11111111 11111011 (-17)

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

11111111 11111111 11111111 11101111 (-17)
>>
2
=
00111111 11111111 11111111 11111011 (1073741819)

2. Работа пост и пред инкремента. Что напечатается?

int i = 5;
i = i++;
System.out.println(i); 

i = 5;
i = i++ + i++;
System.out.println(i); 

i = 5;
i = i++ + ++i;
System.out.println(i); 

i = 5;
i = ++i + ++i;
System.out.println(i);

Ответ:
5
11
12
13

1 случай. Т.к. операция пост инкремент, то присвоется 5
2 случай. Получается 5 + 6. Т.к. во втором инкременте i = 6
3 случай. 5 + 7. Во втором случае операция пред инкремент со значением i=6 после инкремента.
4 случай. 6 + 7. Операции пред инкременты. Второй пред инкремент значение i=6 после первого пред инкремента.

3. Для чего нужен метод hashCode()?
Если в Java Вы используете объект собственного класса в качестве ключа для коллекций HashSet, HashMap, Hashtable или любых других коллекций, которые хранят объекты в группах, то Вам необходимо переопределить метод hashCode().
Реализация метода hashCode класса Object сделана нативной, т.е. определенной не с помощью Java-кода:
public native int hashCode();
Он обычно возвращает адрес объекта в памяти.
Пример:

@Override
 public int hashCode()
 {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + x;
    result = PRIME * result + y;
    return result;
 }

x, y - это поля в классе, напирмер, класс Point с координатами х и y. Берем наиболее уникальные поля для метода hashCode

4. Инкапсуляция, полиморфизм, наследование

Инкапсуляция - это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Это позволяет работать с объектами, не вдаваясь в особенности их реализации.

Полиморфизм — возможность объектов с одинаковой спецификацией иметь различную реализацию.

class X {
   int f() {
      . . .
   }
   void f(int k) {
      . . .
   }
...
}

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

5. Возможно ли при переопределении (override) метода изменить:
1) Модификатор доступа
2) Возвращаемый тип
3) Тип аргумента или количество
4) Имя аргументов
5) Изменять порядок, количество или вовсе убрать секцию throws

Ответ:
1) Да, если расширять (package -> protected -> public)
2) Да, если выполняется Upcasting (восходящее преобразование, преобразование вверх по иерархии)
3) Нет, в таком случае происходит Overload(перегрузка)
4) Да
5) Возможно изменять порядок.

Возможно вовсе убрать секцию throws в методе, так как она уже определена.
Так же, возможно добавлять новые исключения, которые наследуются от объявленных или исключения времени выполнения.

public class Main {
    class A {
        protected Collection execute(String myparam)
                throws IOException, SQLException {
            return null;
        }
    } 

    class B extends A {
        @Override
        public Queue execute(String arg) throws
                NullPointerException,
                SQLTransactionRollbackException,
                FileNotFoundException, {
            return null;
        }
    } 

    class C extends B {
        @Override
        public LinkedList execute(String arg) {
            return null;
        }
    }
}

One Response to “Java. Вопросы на собеседовании и ответы. Часть 1”

  1. Алина пишет:

    В примере Побитовое И (AND) & получается 00000000 00000000 00000000 01001000. Но в десятичной системе это 72, а не 57.

Оставить комментарий

Заполните данные
Имя
Email
Ваш комментарий


пять + 9 =