На Хабре больше сотни хабов и компаний, привязанных к тегу 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();
}
}
Что будет в результате запуска блока А:
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);
}
}
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);
}
}
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());
}
Программиста позвали на обед, и он не успел запустить проверку. Как вы думаете, метод отработает?
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));
}
}
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);
}
}
Они воспроизвели пример, который поможет в будущем определить необходимость внесения изменений в код, разбив большие цепочки на несколько результирующих частей для возможности быстрой отладки и просмотра результатов.
Как вы думаете, код отработает, и если да, то какой будет результат?
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);
});
}
}
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);
}
}
Скажите, какой будет результат вывода в консоль?
* <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 нужен вам — здесь вы сможете стать менеджером проектов, архитектором решений или крутым экспертом, который известен не только в компании, но и во всей отрасли. Компания может предложить пять карьерных путей, причем двигаться можно и вертикально, и горизонтально, меняя специализацию.
Пройти заново |