Технические вопросы на собеседовании.

Привет всем, Джаварашовцы!

Так уж случилось, что недавно я проходил собеседование и хотел бы рассказать, какие вопросы мне задавали предполагая, что идет позиция Junior++. Т.е. еще не мидл, но уже и не зеленый джун.

Так вот, собеседование проходило по такому плану
  1. JavaCore
  2. ООП
  3. REST
  4. Базы данных.
  5. Инструменты, которыми пользуешься.

JavaCore

  • Вначале меня попросили нарисовать иерархию интерфейсов у Коллекций.(Это было не сложно, там всего их несколько(Collection,List,Set,Queue,Map). )
  • В чем различие ArrayList и LinkedList(это один из замых заезженных вопросов и ответов в инетах просто тьма). Обсудили скорость выполнения запросов в них и какая разница между листами.
  • Вопрос про класс Object. какие у него методы, что они делают.
  • Рефлексия. что делает метод getClass(). Очень интересный вопрос, разберите его. Особенно про то, как получить всё про класс, пусть даже там приватные методы или переменные.
  • Спросили за многопоточность. Слабенько, как я считаю, так рассказать как ты понимаешь что такое многопоточность. Что нужно, чтоб запустить новый поток. Реально, если вы 20+ уровень, то эти вопросы для вас покажутся смешными.
  • Что можешь сказать про Stream. Это имеется в виду не про Java 8. Имеется в виду потоки ввода и вывода. Как базовые интерфейсы, какие они (символьные и байтовые). На понимание, никакой конкретики.
  • Исключения. Здесь опять-таки попросили нарисовать иерархию исключений, какие бывают, какие из них checked, а какие unchecked. Что нужно делать с Runtime исключениями. Назовите самое часто попадающее(NullPointerException)
  • Вопрос с тем, что нужно делать с checked исключениями(пробрасывать дальше или обработать — понятно и то и другое.)

ООП

  • Что такое ООП в двух словах?
  • Какие еще есть парадигмы программирования? В чем их различие от ООП
  • Какие основные принципы ООП?(наследование, полиморфизм и инкапсуляция) Рассказать про каждый из них. Пока всё абстракатно, не привязываясь к какому-то языку.
  • Задача на понимание проектирования систем: есть Лошадь и Птица. Нужно получить Пегаса. принцип «has a» и «is a»

REST

  • Что такое REST. В википедии об этом говориться очень круто. Реально статьи из википедии для ознакомления хватит
  • HTTP. Здесь тоже общие фразы. Его методы, для чего каждый из них.
  • Коды состояния HTTP. на какие пять частей делиться, расскажите про самые известные (200,204,404,500,501). Зачем они. Спросили еще про 401 и 403. Но я не знал их. Сказали они важные.

Базы данных

Здесь я рассказал, что знаю MySQL. Рассказал про три нормальные формы. Рассказал про Join'ы, какие бывают и нарисовал пересечение областей, в котором используются разные джоины. Рассказал про то, как я понимаю реляционную БД. Не забыл еще о про MongoDB — это NoSQL база данных. Через некоторе время я напишу и про это.

Другие Инструменты
Здесь мы прошлись по моем резюме. У меня было написано, что использую Maven/Gradle для сборки, использую JIRA для тасков, git, Docker, Swagger. Для Continuous Integration — Stash, Bamboo, Puppet. Для тестирования JUnit, Mockito, JMeter.


Я мог что-то забыть, поэтому если интересно — спрашивайте в комментариях постараюсь ответить.

Это была первая часть собеседования. Теперь жду результаты и если да, то будет вторая часть. Напишу о ней как только так сразу.
Всем кому статья понравилась и была полезна — ставьте "+". Пишите в комментариях.

См. также мои другие статьи:
Тестовое задание: «Написать Интерпретатор на язык BrainFuck»
Тестовое задание «Image Comparison»
Java — быстрее, сильнее и выше! Зарплаты украинских программистов.
История успеха спустя 1.5 года от начала обучения
Технические вопросы на собеседовании.
Как найти работу? Рассылка резюме
Профессиональное выгорание. Как устоять?
Английский для IT и для собеседования
Паттерн Command своими словами.
Паттерн Singleton своими словами.
Как создать исполняемый jar в Intellij IDEA / how to create jar in IDEA
Помогите, нужна мотивация!

Подписывайтесь на мой блог Паттерны Проектирования пишите в нем статьи!
  • ,

Стоит ли работать в направлении PEGA BPM?

Методом пристального всматривания и использования Google, для себя определил, что это платформа, обладающая большим инструментарием компонентов, и создание приложений сводится в первую очередь к установке и настройке этих компонентов. Написание кода сводится к минимуму, а основная работа связана с конфигурированием.

Поправьте меня если я неправильно понял.
Набор видео на Youtube не внушает доверия, толковых мануалов я не обнаружил, а то что есть ограничивается беглым обзором платформы на очень «грязном» английском.

Стоит ли связывать с этим свою жизнь, если хочется работать именно программистом, а не конфигуратором, вооруженным мышкой? Даст ли какой-то опыт, дополнительный вес вакансии для Java разработчика, время работы с PEGA BPM?

Отпугивает заточка под мышку, минимальное вмешательство в код, отсутствие хороших, свободно доступных мануалов.
  • ,

Как инициализировать переменную logger в методе setUp, что бы она выполнялась для всех метод с тэгом @Test?

Как инициализировать переменную logger в методе setUp, что бы она выполнялась для всех метод с тэгом @Test?


public class TestClass {

    private static WebDriver driver;
    
    @BeforeClass
    public static void setUp(){
    	
        System.setProperty("webdriver.chrome.driver", "D://Програмирование//ChromeDriver//chromedriver.exe");
        driver = new ChromeDriver();

    }

    @Test
    public void Login() throws InterruptedException{
    	
    	 ExtentReports logger = ExtentReports.get(TestClass.class);
     	logger.init ("D:\\Програмирование\\report\\newreport.html", true); 
    	logger.startTest("TC1");
    	
    	driver.manage().window().maximize();
        driver.get("https://bigmir.net");
        Thread.sleep(2000);
        logger.log(LogStatus.INFO, "Portal is open");

        if(driver.getPageSource().contains("Clients")){
        	logger.log(LogStatus.PASS, "Data was verify");
        	}else{
        		logger.log(LogStatus.FAIL, "Admin was sign in");
        	}
         
        logger.attachScreenshot("D:\\Програмирование\\report\\pict");
        
        logger.endTest();
    }

    
    @Test
    public void AddCat() throws Exception {
    	
    	 ExtentReports logger = ExtentReports.get(TestClass.class);
     	logger.init ("D:\\Програмирование\\report\\newreport.html", true);
     	
    	logger.startTest("TC2");
   
  	driver.findElement(By.partialLinkText("Tesla")).click();
  	Thread.sleep(2000);

      if(driver.getPageSource().contains("Category with same Name already exists.")){
      	logger.log(LogStatus.PASS, "Cat was added");
        	}else{
        		logger.log(LogStatus.FAIL, "Cat was added");
        	}      
           
      driver.findElement(By.xpath("/html/body/div[6]/div[7]/div/button")).click();
      Thread.sleep(1000);                       
      logger.endTest();
     
    }

    @Test
    public void Setpassword() throws Exception {
    	
    	ExtentReports logger = ExtentReports.get(TestClass.class);
    	logger.init ("D:\\Програмирование\\report\\newreport.html", true);
    	
    	logger.startTest("TC3");
  	  
  	driver.findElement(By.partialLinkText("Tesla")).click();
      Thread.sleep(1000);
      
      driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/nav/div[2]/div[1]/ul/li[3]/a")).click(); //Member
      Thread.sleep(1000);
      driver.findElement(By.partialLinkText("new new")).click(); //Employee
      Thread.sleep(1000);
      driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[3]/div[2]/div/div[2]/div/div[1]/div/div[2]/button")).click(); // Reset password
      Thread.sleep(1000);
      
      logger.log(LogStatus.PASS, "Pass was set");
      
      logger.endTest(); 
      
    }
        
    @AfterClass
    public static void cleanUp(){
    	
    	driver.quit();
    }

}

Зачем используется static и в каких случаях?

Привет всем. Может и глупый вопрос, но не как не могу догнать. Я читал в интернете, смотрел видео и все равно не понимаю. Может тут кто-нибудь объяснит. Заранее спасибо.
  • ,

Сложно ли пересесть с Java на C++ или C#?

Добрый день. Скажите пожалуйста — на сколько сложно будет пересесть с Java на C++ или C# после окончания курса Javarush? Недавно узнал, что моя профильная специальность будет требовать именно знание языков майкрософт, но заканчивать курс заранее совсем не хочется, так как я чувствую, что знания из него откладываются в голове куда лучше разных книг.
  • ,

Нужна помощь в решении задачи

Выполняю тут одну простую задачу (подобные дают на собеседованиях джунам), но реально в ней запутался. Хотелось бы, чтобы кто нибудь взглянул на нее и помог советом. Никаких сторонних технологий в ней нет, только коре. Отпишите в личку кому интересно.

level18.lesson05.task03

package com.javarush.test.level18.lesson05.task03;

/* Разделение файла
Считать с консоли три имени файла: файл1, файл2, файл3.
Разделить файл1 по следующему критерию:
Первую половину байт записать в файл2, вторую половину байт записать в файл3.
Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть.
Закрыть потоки. Не использовать try-with-resources
*/


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws Throwable {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name1 = reader.readLine();
        String name2 = reader.readLine();
        String name3 = reader.readLine();

        FileInputStream stream = new FileInputStream(name1);
        FileOutputStream out1 = new FileOutputStream(name2);
        FileOutputStream out2 = new FileOutputStream(name3);

        byte[] buffer = new byte[stream.available()];
        stream.read(buffer);

        int count = stream.available();
        int count2 = stream.available()%2==0 ? stream.available()/2 : stream.available()/2 + 1;
        int count3 = count-count2;

        out1.write(buffer, 0, count2);
        out2.write(buffer, count2, count3);

        stream.close();
        out1.close();
        out2.close();
        reader.close();

    }
}


Помогите разобраться, в чём ошибка? Вроде всё предельно просто, но не проходит
  • ,

Ответы на вопросы к собеседованию Level31

1 Может ли объект File соответствовать файлу, которого еще нет?
Да, если передать в конструктор значение директории.

String dirPath = "/";
File f = new File(dirPath);
File[] files = f.listFiles();

Так делают
например для того, чтобы получить массив файлов.

public class MyClass {
    public static void main(String[] args) {
        boolean isObject = false;

        
        File file = new File("/");
        if (file instanceof Object){
            isObject = true;
        }
        boolean isFile = file.isFile(); // Tests whether the file denoted by this abstract pathname is a normal file.
Это из документации
        System.out.println(isObject + " "+ isFile);

    }
}

Вывод: true false
File наследуется от object. Ответ: да
Жду комментариев.
2 Как преобразовать объект File к типу Path?
Метод toPath();
toPath(); //Returns a java.nio.file.Path object constructed from the this abstract path.

3 Зачем нужен класс Files?
Взяли за основу класс File, добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и Files. Path – это, фактически новый аналог класса File, а Files – это утилитный класс (по аналогии с классами Arrays & Collections), в него вынесли все статические методы класса File. Так «правильнее» с точки зрения ООП.
Немного из документов:
public final class Files
extends Object
This class consists exclusively of static methods that operate on files, directories, or other types of files.
In most cases, the methods defined here will delegate to the associated file system provider to perform the file operations.

4 Какие классы для архивации вы знаете?
Неплохая статья на эту тему и выдержка из нее: crypto.pp.ua/2010/06/arxivaciya-v-java/
Для работы с архивами в спецификации Java существуют два пакета – java.util.zip и java.util.jar соответственно для архивов zip и jar. Различие форматов jar и zip заключается только в расширении архива zip. Пакет java.util.jar аналогичен пакету java.util.zip, за исключением реализации конструкторов и метода voidputNextEntry(ZipEntry e) класса JarOutputStream. Ниже будет рассмотрен только пакетjava.util.jar. Чтобы переделать все примеры на использование zip-архива, достаточно всюду
в коде заме¬нить Jar на Zip
5 Как добавить директорию в архив?
Для себя я понял этот вопрос, как добавление пустой директории в готовый архив. Никаких рабочих примеров я не нашел. Вот код: (Он наглядно показывает, что можно в архив положить любой файл, а вот с пустой директорией… я не знаю как ответить, постить на StackOverFlow не стал, за такой вопрос заминусят точно) Если у кого есть предложения, то напишите.

public class Main {
    public static void main(String[] args) {
        String[] myFiles = {"D:\\forJava\\MyArtifactName\\packForTest\\res2.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res4.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\testDir\\"
                };
        String zipFile = "D:\\forJava\\MyArtifactName\\packForTest\\res.zip";
        ZipUtility zipUtil = new ZipUtility();
        try {
            zipUtil.zip(myFiles, zipFile);

        } catch (Exception ex) {
            // some errors occurred
            ex.printStackTrace();
        }
    }
}

Вопрос о последней testDir, ее то как раз в получившийся архив JVM не кладет, со всеми остальными txt – файлами норм получается.
ZipUtility.java:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtility {

    private static final int BUFFER_SIZE = 4096;

    public void zip(List<File> listFiles, String destZipFile) throws IOException {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destZipFile));
        for (File file : listFiles) {
            if (file.isDirectory()) {
                zipDirectory(file, file.getName(), zos);
            } else {
                zipFile(file, zos);
            }
        }
        zos.flush();
        zos.close();
    }

    public void zip(String[] files, String destZipFile) throws IOException {
        List<File> listFiles = new ArrayList<File>();
        for (int i = 0; i < files.length; i++) {
            listFiles.add(new File(files[i]));
        }
        zip(listFiles, destZipFile);
    }

    private void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws  IOException {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                zipDirectory(file, parentFolder + "/" + file.getName(), zos);
                continue;
            }
            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            long bytesRead = 0;
            byte[] bytesIn = new byte[BUFFER_SIZE];
            int read = 0;
            while ((read = bis.read(bytesIn)) != -1) {
                zos.write(bytesIn, 0, read);
                bytesRead += read;
            }
            zos.closeEntry();
        }
    }

    private void zipFile(File file, ZipOutputStream zos)
            throws  IOException {
        zos.putNextEntry(new ZipEntry(file.getName()));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        long bytesRead = 0;
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = bis.read(bytesIn)) != -1) {
            zos.write(bytesIn, 0, read);
            bytesRead += read;
        }
        zos.closeEntry();
    }
}

Код отсюда:
www.codejava.net/java-se/file-io/zip-directories

6 Зачем нужны Properties?
Properties – это файл свойств. Структура его: ключ – значение. Для работы с такими файлами в Java есть класс Properties, он унаследован от HashTable<Object, Object>
Есть статья про манипуляции с ним
www.mkyong.com/java/java-properties-file-examples/

7 В каком виде хранятся данные в файле .properties?
Ключ – значение.
8 Можно ли изменять данные в объекте Properties после загрузки их из файла?
Если он унаследован от HashMap, тогда можно, только потом нужно будет изменения в этот файл отписать. Для этого есть метод setProperty.
Вот код:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Created by Роман on 12.09.2016.
 */
public class LoadAndSetProperties {

    public static void main(String[] args) {

        Properties prop = new Properties();
        InputStream input = null;
        try {

            input = new FileInputStream("D:\\forJava\\MyArtifactName\\packForTest\\config.properties");

            // load a properties file
            prop.load(input);

            // get the property value and print it out


            prop.setProperty("database", "ddfdfdfdfdf");
            System.out.print(prop.getProperty("database"));
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

Вывод: ddfdfdfdfdf
9 Зачем нужен класс FileReader?
Java Docs:
public class FileReader

extends InputStreamReader

Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.
FileReader is meant for reading streams of characters.
Класс для чтения символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются подходящими. Чтобы задать эти значения самостоятельно, следует построить InputStreamReader над FileInputStream. FileReader предназначен для считывания потоков символов.
10 Зачем нужен класс FileWriter?
public class FileWriter
extends OutputStreamWriter

Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
Whether or not a file is available or may be created depends upon the underlying platform. Some platforms, in particular, allow a file to be opened for writing by only one FileWriter (or other file-writing object) at a time. In such situations the constructors in this class will fail if the file involved is already open.
FileWriter is meant for writing streams of characters.
Класс для записи символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются приемлемым. Чтобы задать эти значения самостоятельно, следует построить OutputStreamWriter над FileOutputStream. Является ли файл доступен для записи, зависит от используемой платформы. Некоторые платформы разрешают держать файл для записи только одним FileWriter (или другого объекта записи файла), в одно время. FileWriter предназначен для записи потоков символов. Для написания потоков необработанных байтов, используйте FileOutputStream.
Эти классы (FileReader и FileWriter) специально ориентированы для работы с текстом и строками.
  • ,

добавление пустой директории в zip Архив

В общем есть такой вопрос в собеседовании к Level31
номер 5: Как добавить директорию в архив?

Для себя я этот вопрос понял, как добавление пустой директории в уже готовый zipАрхив

Вот код.

В нем текстовые файлы добавляются в заданный архив, а вот пустая папка нет, может быть кто-нибудь знает почему?

Main:

public class Main {
    public static void main(String[] args) {
        String[] myFiles = {"D:\\forJava\\MyArtifactName\\packForTest\\res2.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res4.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\testDir"
                };
        String zipFile = "D:\\forJava\\MyArtifactName\\packForTest\\res.zip";
        ZipUtility zipUtil = new ZipUtility();
        try {
            zipUtil.zip(myFiles, zipFile);

        } catch (Exception ex) {
            // some errors occurred
            ex.printStackTrace();
        }
    }
}


ZipUtility.java:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtility {

    private static final int BUFFER_SIZE = 4096;

    public void zip(List<File> listFiles, String destZipFile) throws IOException {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destZipFile));
        for (File file : listFiles) {
            if (file.isDirectory()) {
                zipDirectory(file, file.getName(), zos);
            } else {
                zipFile(file, zos);
            }
        }
        zos.flush();
        zos.close();
    }

    public void zip(String[] files, String destZipFile) throws IOException {
        List<File> listFiles = new ArrayList<File>();
        for (int i = 0; i < files.length; i++) {
            listFiles.add(new File(files[i]));
        }
        zip(listFiles, destZipFile);
    }

    private void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws  IOException {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                zipDirectory(file, parentFolder + "/" + file.getName(), zos);
                continue;
            }
            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            long bytesRead = 0;
            byte[] bytesIn = new byte[BUFFER_SIZE];
            int read = 0;
            while ((read = bis.read(bytesIn)) != -1) {
                zos.write(bytesIn, 0, read);
                bytesRead += read;
            }
            zos.closeEntry();
        }
    }

    private void zipFile(File file, ZipOutputStream zos)
            throws  IOException {
        zos.putNextEntry(new ZipEntry(file.getName()));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        long bytesRead = 0;
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = bis.read(bytesIn)) != -1) {
            zos.write(bytesIn, 0, read);
            bytesRead += read;
        }
        zos.closeEntry();
    }
}

Java-конференция Joker 2016

14-15 октября в Петербурге уже в четвертый раз состоится Java-конференция Joker 2016, которая соберет более 1000 разработчиков уровня Senior/Middle. Конференция ориентирована на участников, которые хорошо разбираются в Java.



Спикеры конференции – ведущие мировые эксперты из США, Европы и России, такие как Алексей Шипилев, Барух Садогурский, Евгений Борисов и многие другие. Полный список спикеров и докладов вы найдете на сайте конференции: jokerconf.com/

Кроме того, в рамках конференции пройдет специальная программа для начинающих разработчиков и студентов, изучающих Java. Подробности о Joker Student Edition: jokerconf.com/se.html
  • ,

Хочу критику кода (новичок)

После того как бесплатные уроки кончились, а оплатить подписку я не мог (и пока не могу). Я стал смотреть разные видео на ютьюбе. Ну и в общем пришел к тому, что захотелось по практиковаться на чем-то. Хотел было попробовать андройд, но мой слабый комп не тянет (15 минут запускается эмулятор и еще 10 минут компилируется проект) Пришлось сделать выбор в пользу JavaFX. Его API мне показался не сложным и решил попробовать написать тетрис. Кое как мне удалось примерно понять идею того, как он должен работать (гуманитарий). Стал пробовать писать, долго доходил до понимания некоторых алгоритмовю. Позже в паблике JavaRush нашелся человек, который дает мне советы в некоторых моментах логики. В общем сам по себе тетрис можно сказать работает (остался один баг с вращением), но он еще не дописан до конца. Я бы хотел услышать критику имеющегося кода и разные советы. Он может казаться нагроможденным иногда. Я создал 4 класса- первые два это классы фигуры и поля, третий класс контроллер, содержащий логику и последний класс, где вызывается обновление и рендерится целиком все поле по таймеру. Проект Идеи в репозитории github.com/ZackFox/TetrisJava/tree/master/src/sample