Задачи Яндекса на должность Android Developer. Спорный вопрос. Подскажите, где я ошибся?
1,00
р.
р.
Есть 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. Более развернутый ответ давать не собираюсь, т.к. считаю подобное поведение некорректным по отношению к Яндексу и другим соискателям.