Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Задачи Яндекса на должность Android Developer. Спорный вопрос. Подскажите, где я ошибся?

Есть 3 задачки для прохождения собеседования в Yandex на должность Android Developer. После выполнения этих 3 заданий мне сообщили, что я не выполнил ни одного задания верно, хотелось бы услышать от вас, где у меня ошибки.
Задача 1: Какие объекты доступны для сборщика мусора на момент вызова System.gc() и почему?
public class GCTest { static class A { private String myName; public A(String myName) { this.myName = myName; } }
public static void main(String[] args) { A a1 = new A("a1"); A a2 = new A("a2"); ArrayList list = new ArrayList(); list.add(a1); A[] mas = new A[2]; mas[0] = a2; a2 = a1; clear(mas); a1 = null; a2 = null; System.gc(); // дальше идет какой-то код ... }
private static void clear(A[] mas) { mas = null; } }
Мой ответ: Массив new A[2] из строки A[] mas = new A[2] будет очищен, так как мы выполняем функцию, которая зануляет этот массив (mas = null). Также будет очищен объект new A("a2"), так как мы теряем на него ссылку в строке a2 = a1, соответственно он ссылается уже на объект new A("a1"). А далее мы зануляем массив, как я писал выше, поэтому больше никто не ссылается на на объект new A[2] Задача 2: Перечислите все проблемы, которые вы видите в данном коде:
public class Generator { private static final Map cache = new HashMap();
public static byte[] generate(byte[] src) { byte[] generated = cache.get(src); if (generated == null) { synchronized (cache) { generated = cache.get(src); if (generated == null) { generated = doGenerate(src); cache.put(src, generated); } } } return generated; }
private static byte[] doGenerate(byte[] src) {...} // ... }
Мой ответ: Я написал, что использование byte[] в качестве ключа HashMap недопустимо, так как у byte[] метод Hashcode() реализован на алгоритме Park-Miller RNG. Hashcode() у byte[] реализован так же, как и у Object, точно так же метод equals() будет работать, как у Object и будет сравнивать ссылки на объект, а не само содержание объектов (как обычно людям кажется), соответственно на основании этого я написал, что данная коллекция будет работать некорректно.
Далее я написал, что также все строки кода, в которых выполняется добавление данных в коллекцию или удаление не имеет смысла, так как мы используем в качестве ключа byte[]
Далее я написал, что код:
if (generated == null) { synchronized (cache) { generated = cache.get(src); if (generated == null) { generated = doGenerate(src); cache.put(src, generated); } } }
слишком растянут и имеют лишние строки, которые повторяются далее. Задача 3: Есть две задачи: Task 1 и Task 2. Стек Activity для Task 1: A,B,C,D. Стек Activity для Task 2: X,Y,Z.
После выполнения указанного действия для всех пунктов в ответе необходимо указать:
Как будет выглядеть стек Activity для задач. Например, Task 1: A,B,C,D; Task 2: X,Y,Z; Историю того, как будут изменяться стеки при нажатии кнопки BACK, пока не возвратимся в Home screen. Например: A,B,C,D - back -> A,B,C - back -> A,B - back -> A - back -> Home screen
а) У всех Activity установлен launchMode="standard". В текущий момент отображается Activity Z. Из Activity Z отправляется Intent на открытие Activity D.
б) У всех Activity установлен launchMode="standard", но только у Activity D установлен launchMode="singleTop". В текущий момент отображается Activity Z. Из Activity Z отправляется Intent на открытие Activity D.
в) У всех Activity установлен launchMode="standard", но только у Activity D установлен launchMode="singleTask". В текущий момент отображается Activity Z. Из Activity Z отправляется Intent на открытие Activity D
Мой ответ: При ответе в их форме я в конце прокомментировал мои действия, здесь не будут, просто дам ссылку на описание режимов Activity, там есть таблица в середине с полным описанием.
а) Task 1: A,B,C,D; Task 2: X,Y,Z,D;
б) A,B,C,D - back -> A,B,C - back -> A,B - back -> A - back -> Home screen; X,Y,Z,D - back -> X,Y,Z - back -> X,Y - back -> X - back -> Home screen; а) Task 1: A,B,C,D; Task 2: X,Y,Z,D;
б) A,B,C,D - back -> A,B,C - back -> A,B - back -> A - back -> Home screen; X,Y,Z,D - back -> X,Y,Z - back -> X,Y - back -> X - back -> Home screen; а) Task 1: A,B,C,D; Task 2: X,Y,Z;
б) A,B,C,D - back -> A,B,C - back -> A,B - back -> A - back -> Home screen; X,Y,Z - back -> X,Y - back -> X - back -> Home screen;
Я также искал в просторах интернета ответы на эти задачи, кроме 3, и нашёл пару ссылок, на первую задачу отвечают, что сборщик мусора отчистит ноль объектов; а я ответил, что два: массив и объект. Я не совсем понял, почему это так? Почему зануление массива не влияет на сам массив, почему он всё равно существует?
По поводу второй задачи были споры, что коллекция не является потокобезопасной; никто не писал по поводу ключа в качестве byte[]. Но как из их задачи вообще можно понять, что они там хотят сделать? Там же нету дополнений, что всё выполняется в несколько потоков. Так-то я в курсе, что коллекция не потокобезопасна, и для этого есть специальные реализации синхронизированных коллекций.
Прошу от вас конструктивных ответов, так как у меня завязался спор с сотрудником из Yandex, и мы договорились, что пусть более компетентные люди с большим опытом попробуют дать ответ на эти задачи и растолкуют мне мои недочёты. Если я был прав хотя бы в одном из ответов, то по этому вопросу будет непосредственное разбирательство внутри их компании; а я на 99% уверен, что 3 задачу я решил верно, и там варианты ответа не такие размазанные, как во 2 задаче, где каждый может найти свою неточность или огрех.
Заранее благодарю за ответы, ибо для меня это дело принципа!


Ответ

За 3-ю задачу говорить не буду, т.к. android не занимаюсь.
В первой задаче ответ действительно неверный. Изучайте Java. В том числе смотрите про передачу параметров в Java.
По второй задаче ответ во-первых далеко неполный (можно час обсуждать проблемы в этом коде, без преувеличений). Очевидно, что в коде представлен кэш. Попробуйте подумать о том, как он будет использоваться в клиентском коде. Какими вообще свойствами обладают кэши. Во-вторых, та часть ответа, которую вы представили на тему hashCode верна, но не всегда. Посмотрите на то, какие есть варианты реализации hashCode в JVM.
Более развернутый ответ давать не собираюсь, т.к. считаю подобное поведение некорректным по отношению к Яндексу и другим соискателям.

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

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