Как стать автором
Обновить

Бритва EPAMа: тест по Java, о котором не скажут «опяяять»

Время на прочтение 27 мин
Количество просмотров 27K
На Хабре больше сотни хабов и компаний, привязанных к тегу Java. Кажется, ни на одну тему не пишут так часто и подробно. Возможно, мы с компанией EPAM и сломали бритву Оккама, но сделали этот тест, посвященный одному из самых популярных языков программирования. Какое отношение имеет Райан Гослинг к Java? Var — это варик или совсем не вариант? Отработает ли вывод в консоль, если программист в конец запутался? — Предлагаем пройти тест и ответить на вопросы, в которых не упущены ни давняя история, ни последние обновления.

Начать тест
Когда состоялся выпуск Java 1.0?
Дальше
Проверить
Узнать результат
Команда по разработке Java состояла из нескольких человек. Скажите, кто изображен на фотографиях?
Дальше
Проверить
Узнать результат
Почему название книги «Design Patterns: Elements of Reusable Object-Oriented Software» затем условно сократили до «GOF»?
Дальше
Проверить
Узнать результат
Команда разработчиков решила отметить выход первого релиза. Пришли в бар, сели за стол, позвали официанта и заказали еду. Работа стала основной темой разговора, которую они постоянно проецировали на окружающую действительность. Спор дошел до того, что ребята стали определять, к каким шаблонам проектирования можно отнести ту или иную стандартную ситуацию из жизни. Так, они пытались понять, чем является заказ еды у официанта и передача заказа от официанта к шеф-повару.
Помогите разрабам уйти сытыми и довольными из ресторана. Какому поведенческому шаблону соответствуют заказ и передача заказа?
Дальше
Проверить
Узнать результат
Отдел внедрения решил подготовить небольшие задачи для своих коллег-программистов в рамках творческого конкурса. Одна из задач вызвала споры еще до этапа проверки кода. Помогите сэкономить время команде, ответив на вопрос. Что будет в результате запуска блока А и В (результаты запуска блоков объединены в один верный ответ)?

Что будет в результате запуска блока А:
class ClassA {

    private final String value;

    public ClassA(String value) {
        this.value = value;
        System.out.println(value);
    }
}

public class ClassB extends ClassA {
    private final String value = new String();

    public ClassB() {
        super(value);
    }

    public static void main (String[] args) {
        ClassA var = new ClassB();
        System.out.println(var);
    }
}


Что будет в результате запуска блока В:
abstract class ClassA {

    public ClassA() {
        System.out.println(value());
    }
    abstract String value();
}

public class ClassB extends ClassA {
    private final String value = new String();

    public ClassB() {
    }

    @Override
    String value() {
        return value;
    }

    public static void main (String[] args){
        new ClassB();
    }
}

Дальше
Проверить
Узнать результат
Есть задача по созданию метода с использованием двух ключей. Специалист решил попробовать вариант с hashBasedTable. Создал пример, но запутался. Как отработает вывод в консоль (System.out.println)?

public class ClassSaveKey{

    private static HashBasedTable<String, String, String> languageTable = HashBasedTable.create();

    public static void main(String[] args) {
        //первоначальные данные
        setText("Object-oriented programming language", "1990", "Python");
        setText("Object-oriented programming language", "1995", "Java");
        setText("Functional programming language", "2005", "F#");

        //вывод в консоль
        System.out.println("Языки: " + languageTable.row("Object-oriented programming language"));
        System.out.println("Ключи строк: " + languageTable.rowKeySet());
        System.out.println("Структура относительно столбцов: " + languageTable.columnMap());
        System.out.println("Получение значения с использованием ключа столбца и строки: " + languageTable.column("2005").get("Functional programming language"));

    }
    private static void setText(String rowStr, String keyStr, String text) {
        languageTable.put(rowStr, keyStr, text);
    }
}

Дальше
Проверить
Узнать результат
В рамках задач по переводу логики на Java команда постоянно работала с коллекциями и изучала методы. В этот раз был самый обычный метод reverse(). Один из разработчиков задал вопрос коллегам с вариантами ответа. Помогите «повернуть» список коллегам. Какой будет вывод в консоль?

class ReverseTest {
    public static <T> List<T> reverseNew(List<T> src) {
            List<T> results = new ArrayList<>(src);
            Collections.reverse(results);
            System.out.println("3 = " + results);
            return results;
        }

    public static void main(String[] args) {
            List<String> nameList = new ArrayList<>();
            nameList.add("Александр");
            nameList.add("Иван");
            nameList.add("Пётр");
            System.out.println("1 = " + nameList);

            Collections.reverse(nameList);
            System.out.println("2 = " + nameList);
            reverseNew(nameList);
            System.out.println("4 = " + nameList);
    }
}

Дальше
Проверить
Узнать результат
Проводя оптимизацию кода, команда разработчиков задумалась о возможности добавления в конце определенных блоков вызова сборки мусора с помощью System.gc(). Как обычно, состоялся спор, что лучше, System.gc() или Runtime.gc(), и чем они отличаются. Остановились на System.gc(). Тестирование кода показало, что добавление System.gc() не привело к желаемому результату и «передача» памяти в систему не состоялась. Скажите, какие утверждения верны (правильными могут быть несколько ответов)?
Дальше
Проверить
Узнать результат
В компании решили перейти на 8 версию Java и сделать небольшой рефакторинг. Денис любил играть на гитаре, поэтому его сделали ответственным за модуль работы с музыкой. Первым он начал исправление методов, отвечающих за поиск музыкальных произведений. Далее представлен один из методов поиска мелодий с длительностью звучания более двух минут (120 секунд).

public Set<String> findLengthyMelodies(List<Album> albums) {
    Set<String> melodyNames = new HashSet<>();
    for(Album album : albums) {
        for (Melody melody : album.getMelodies()) {
            if (melody.getLength() > 120) {
                String name = melody.getName();
                melodyNames.add(name);
            }
        }
    }
    return melodyNames;
}


Специалист подумал, что стримы — это отличный вариант и произвел рефакторинг. Вот что у него получилось.

public Set<String> findLengthyMelodiesNew(List<Album> albums) {
    return albums.stream()
        .flatMap(album -> album.getMelodyStream())
        .filter(melody -> melody.getLength() > 120)
        .map(melody -> melody.getName())
        .collect(toSet());
}


Программиста позвали на обед, и он не успел запустить проверку. Как вы думаете, метод отработает?
Дальше
Проверить
Узнать результат
Предусмотрительные программисты решили подготовиться к летнему отпуску и заодно посмотреть на новые фичи Java 12. Создали приложения по сбору вещей для отпуска/поездки с использованием новых возможностей. Скажите, метод isRestThing() с вызовом константы перечисления отработает корректно?

public class SwTest {

    enum RestThings {
        SUNGLASSES, BEACH_UMBRELLA, TOWEL, BURGER
    }

    private static boolean isRestThing(RestThings restThings){
        return switch (restThings){
            case SUNGLASSES -> true;
            case BEACH_UMBRELLA -> true;
            case TOWEL -> true;
            case BURGER -> false;
        };
    }

    public static void main(String[] args) {
        System.out.println("Sunglasses are very necessary on vacation = " + isRestThing(RestThings.SUNGLASSES));
    }
}

Дальше
Проверить
Узнать результат
Про ключевое слово «var» было множество споров. Разработчики решили попробовать написать небольшой пример и посмотреть, как на деле выглядит работа с «var».
Они воспроизвели пример, который поможет в будущем определить необходимость внесения изменений в код, разбив большие цепочки на несколько результирующих частей для возможности быстрой отладки и просмотра результатов.
Как вы думаете, код отработает, и если да, то какой будет результат?

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Q12 {

    public static void main(String[] args) {
            testVar();
    }

    private static void testVar() {

        var carBrands = Stream.of("Alfa Romeo", "BMW", "DAF")
            .collect(Collectors.toMap(e -> e.substring(0,1), e ->e));

        var countCars = (long) carBrands.values().size();

        var mixedList = List.of(((int) countCars), 7, 1, 6, 2, 5, 5, (int) countCars);

        var divTwo = mixedList.parallelStream()
            .collect(Collectors.partitioningBy(i -> i % 2 != 0));

        var divTwoEv = divTwo.values()
            .stream()
            .max(Comparator.comparing(List::size));

        var sumDivTwoEv = divTwoEv.orElse(Collections.emptyList())
            .parallelStream()
            .mapToInt(Integer::intValue)
            .sum();
        System.out.println(sumDivTwoEv);
    }
}

Дальше
Проверить
Узнать результат
Было решено посмотреть в сторону варианта вывода десятичных чисел в компактной форме с учетом местоположения благодаря Java12. Что будет в консоли после запуска?

import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;

public class Q13 {

    public static void main(String[] args) {
        testCompactNumber(Locale.UK);
        testCompactNumber(Locale.ENGLISH);
    }

    private static void testCompactNumber(Locale locale) {
        var numbers = List.of(100, 1000, 10000);
        numbers.forEach((num) -> {
            NumberFormat nf = NumberFormat.getCompactNumberInstance(locale, NumberFormat.Style.SHORT);
            String format = nf.format(num);
            String country = locale.getCountry();
            System.out.println(country + format);
        });
        numbers.forEach((num) -> {
            NumberFormat nf = NumberFormat.getCompactNumberInstance(locale, NumberFormat.Style.LONG);
            String format = nf.format(num);
            String country = locale.getCountry();
            System.out.println(country + format);
        });
    }
}

Дальше
Проверить
Узнать результат
Команде было необходимо обработать текст и убрать спецсимволы в виде пробелов, табуляции и т.д.. В качестве примера им пришло с сервиса стихотворение А. К. Толстого. «Клонит к лени полдень жгучий» с возможными «проблемными» символами до и после.* Был создан небольшой метод по анализу данной проблемы.
* <8 spaces>, <5 spaces> — представь 8 и 5 пробелов соответственно.

public class Q14 {

    public static void main(String[] args) {
        testStringRow("<8 spaces> Клонит к лени полдень жгучий," +
            "Замер в листьях каждый звук," +
            "В розе пышной и пахучей," +
            "Нежась, спит блестящий жук;"+
            "А из камней вытекая," +
            "Однозвучен и гремуч," +
            "Говорит, не умолкая," +
            "И поет нагорный ключ.<5 spaces>");
    }

    private static void testStringRow(String str) {

        str.lines()
            .map(l -> l.strip())
            .forEach(System.out::println);

        str.lines().forEach(System.out::println);

        str.lines()
            .map(l -> l.trim())
            .forEach(System.out::println);
    }
}


Скажите, какой будет результат вывода в консоль?
Дальше
Проверить
Узнать результат
Не отчаивайтесь. Даже если вы только начинаете работать с Java, у вас есть все, чтобы стать классным специалистом. Например, в компании EPAM много возможностей для профессионального роста. ИТ-специалисты, которые хотят проработать свои навыки или освоить новые направления, ждут в тренинг-центре EPAM . И это может быть как раз то, что нужно для обучения и развития.
Пройти заново
Очень неплохо, но есть куда расти! Приходите работать в EPAM — здесь вы прокачаете свои профессиональные скиллы. В компании много возможностей для обучения: тренинг-центр для начинающих, курсы для сотрудников всех уровней, программы менторинга, обучение английскому прямо в офисе. Онлайн доступно более 5000 курсов.
Пройти заново
Вау! Наверное, вы сеньор? Но чем больше мы растем и развиваемся, тем большие перспективы открываются впереди. Вы нужны EPAM, а EPAM нужен вам — здесь вы сможете стать менеджером проектов, архитектором решений или крутым экспертом, который известен не только в компании, но и во всей отрасли. Компания может предложить пять карьерных путей, причем двигаться можно и вертикально, и горизонтально, меняя специализацию.
Пройти заново
Теги:
Хабы:
+16
Комментарии 39
Комментарии Комментарии 39