17
Сен
2015

Задачи Яндекса на должность 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<byte[], byte[]> cache = new HashMap<byte[], byte[]>();
    
        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.

    После выполнения указанного действия для всех пунктов в ответе необходимо указать:

    1. Как будет выглядеть стек Activity для задач. Например, Task 1: A,B,C,D; Task 2: X,Y,Z;

    2. Историю того, как будут изменяться стеки при нажатии кнопки 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, там есть таблица в середине с полным описанием.

    1. а) 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;

    2. а) 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;

    3. а) 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 задаче, где каждый может найти свою неточность или огрех.

Заранее благодарю за ответы, ибо для меня это дело принципа!

Источник: https://ru.stackoverflow.com/questions/451589/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8-%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0-%D0%BD%D0%B0-%D0%B4%D0%BE%D0%BB%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C-android-developer-%D0%A1%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%B9-%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81-%D0%9F%D0%BE%D0%B4%D1%81%D0%BA%D0%B0%D0%B6%D0%B8%D1%82%D0%B5-%D0%B3%D0%B4%D0%B5-%D1%8F

Share

Тебе может это понравится...