Рубрики
Без рубрики

Топ-50 Вопросов для интервью по программированию на Java

Топ-50 Вопросов для интервью по программированию на Java с подробными ответами. Эти упражнения по кодированию хороши для подготовки к собеседованию, охватывающему новейшие функции Java.

Автор оригинала: Pankaj Kumar.

Вопросы для собеседования по программированию на Java всегда являются решающим фактором в любом собеседовании на Java. Независимо от того, являетесь ли вы новичком в Java или опытным программистом, на собеседовании вас проверят на ваши навыки программирования. Так что, это хорошая идея, чтобы освежить свои навыки кодирования, прежде чем вы столкнетесь с собеседованием.

Вопросы для Интервью по программированию на Java

Я предоставляю более 50 вопросов по программированию на Java, чтобы проверить ваши навыки программирования. Это хорошо как для начинающих, так и для опытных Java-разработчиков. Самое приятное то, что некоторые вопросы взяты из последних выпусков (Java 14). Если вы можете писать программы на Java, используя новейшие функции, это означает, что вы поддерживаете себя в курсе событий, что будет работать в вашу пользу.

1. Как изменить строку в Java?

Это может показаться удивительным, но в классе String нет служебного метода reverse (). Но это очень простая задача. Мы можем создать массив символов из строки, а затем повторить его от конца до начала. Мы можем добавить символы в stringbuilder и, наконец, вернуть перевернутую строку.

public class StringPrograms {

	public static void main(String[] args) {

		String str = "123";
		System.out.println(reverse(str));
	}

	public static String reverse(String in) {
		if (in == null)
			throw new IllegalArgumentException("Null is not valid input");

		StringBuilder out = new StringBuilder();

		char[] chars = in.toCharArray();

		for (int i = chars.length - 1; i >= 0; i--)
			out.append(chars[i]);

		return out.toString();
	}
}

Бонусные баллы : Добавление нулевой проверки в метод и использование StringBuilder для добавления символов.

Легко пропустить : Индексация в Java начинается с 0. Итак, мы должны начать с “символов.длина – 1” в петле для.

2. Как поменять местами два числа без использования третьей переменной?

Это немного сложный вопрос. Это процесс из трех этапов. Это лучше визуализируется в коде.

int a = 10;
int b = 20;

b = b + a; // now b is sum of both the numbers
a = b - a; // b - a = (b + a) - a = b (a is swapped)
b = b - a; // (b + a) - b = a (b is swapped)

Мы не можем возвращать несколько переменных в Java. Поскольку Java передается по значению, а это примитивные типы данных, их значения не изменятся. Например, приведенная ниже функция подкачки не изменит входные целочисленные значения.

public static void swapNumbers(int a, int b) {
    b = b + a;
	a = b - a;
	b = b - a;
}

public static void main(String[] args) {
	int a = 10;
	int b = 20;
	swapNumbers(a, b);
	System.out.printf("a is %d, b is %d", a, b); // a is 10, b is 20
}

3. Java-программа для проверки наличия гласной в строке?

Мы можем использовать регулярное выражение, чтобы проверить, содержит ли строка гласные или нет.

public class StringContainsVowels {

	public static void main(String[] args) {

		System.out.println(stringContainsVowels("Hello")); // true
		System.out.println(stringContainsVowels("TV")); // false

	}

	public static boolean stringContainsVowels(String input) {

		return input.toLowerCase().matches(".*[aeiou].*");

	}

}

4. Java-программа для проверки того, является ли данное число простым?

Мы можем написать простую программу, чтобы разделить заданное число “n” от 2 до n/2 и проверить остаток. Если остаток равен 0, то это не простое число.

public class PrimeNumberCheck {

	public static void main(String[] args) {

		System.out.println(isPrime(19)); // true
		System.out.println(isPrime(49)); // false
	}

	public static boolean isPrime(int n) {
		if (n == 0 || n == 1) {
			return false;
		}
		if (n == 2) {
			return true;
		}
		for (int i = 2; i <= n / 2; i++) {
			if (n % i == 0) {
				return false;
			}
		}

		return true;
	}
}

Но это не очень экономично по памяти и времени. Для данного числа N, если существует простое число M от 2 до √N (квадратный корень из N), которое равномерно делит его, то N не является простым числом.

Вы можете прочитать больше об этом здесь .

5. Ряды Фибоначчи с использованием рекурсии

Мы можем использовать цикл for для печати рядов Фибоначчи.

public static void printFibonacciSeries(int count) {
	int a = 0;
	int b = 1;
	int c = 1;
	for (int i = 1; i <= count; i++) {
		System.out.print(a + ", ");
		a = b;
		b = c;
		c = a + b;
	}
}

Число Фибоначчи генерируется путем сложения двух предыдущих чисел –(N-1) + F(N-2). Мы можем использовать рекурсию для печати рядов Фибоначчи.

public class FibonacciNumbers {
	public static int fibonacci(int n) {
		if (n <= 1)
			return n;
		return fibonacci(n - 1) + fibonacci(n - 2);
	}

	public static void main(String args[]) {
		int n = 10;
		System.out.println(fibonacci(n));
	}
}

6. Проверьте, содержит ли список целых чисел только нечетные числа?

Мы можем использовать цикл for и проверять каждый элемент по одному, являются ли они нечетными или нет.

public static boolean onlyOddNumbers(List list) {
	for (int i : list) {
		if (i % 2 == 0)
			return false;
	}
	return true;
}

Если список огромен, мы можем использовать параллельный поток для более быстрой обработки.

public static boolean onlyOddNumbers(List list) {
	return list
			.parallelStream() // parallel stream for faster processing
			.anyMatch(x -> x % 2 != 0); // return as soon as any elements match the condition
}

7. Проверка палиндрома

Строка палиндрома-это строка, обратная сторона которой также является той же строкой. Таким образом, мы можем изменить входную строку и проверить, равны ли обе строки или нет. Мы также можем использовать метод String charAt(индекс int) для проверки строки палиндрома.

boolean checkPalindromeString(String input) {
	boolean result = true;
	int length = input.length();
	for(int i=0; i < length/2; i++) {
		if(input.charAt(i) != input.charAt(length-i-1)) {
			result = false;
			break;
		}
	}
	return result;
}

8. Как удалить пробелы из строки

Мы можем использовать Характер.Метод IsWhiteSpace() для удаления пробелов из строки.

String removeWhiteSpaces(String input){
	StringBuilder output = new StringBuilder();
	
	char[] charArray = input.toCharArray();
	
	for(char c : charArray) {
		if (!Character.isWhitespace(c))
			output.append(c);
	}
	
	return output.toString();
}

9. Как удалить начальные и конечные пробелы из строки?

Класс Java String содержит два метода для удаления начальных и конечных пробелов – trim () и strip(). Метод strip() был добавлен в класс String в Java 11. Однако метод strip() использует символ.Метод IsWhiteSpace() для проверки того, является ли символ пробелом. Этот метод использует кодовые точки Юникода, тогда как метод trim() идентифицирует любой символ, значение кодовой точки которого меньше или равно “U+0020”, как символ пробела.

Метод strip() является рекомендуемым способом удаления пробелов, поскольку он использует стандарт Юникода.

String s = "  abc  def\t";
		
s = s.strip();
		
System.out.println(s);

Поскольку строка неизменна, мы должны присвоить строке вывод strip ().

10. Сортировка массива в Java?

Этот вопрос требует глубокого понимания сортировки в Java. Если вы посмотрите на служебный класс Arrays, то увидите множество перегруженных методов сортировки() для сортировки как примитивных, так и объектных массивов.

Если вы сортируете примитивный массив в естественном порядке, то это очень просто. Просто используйте метод Arrays.sort ().

int[] array = {1, 2, 3, -1, -2, 4};

Arrays.sort(array);

System.out.println(Arrays.toString(array));

Но, если вы хотите отсортировать массив объектов, то объект должен реализовать Сопоставимый интерфейс. Если вы хотите указать критерии сортировки, вы можете передать компаратор для логики сортировки. Вы должны прочитать больше о них на – Comparable и Comparator в Java .

11. Как программно создать сценарий взаимоблокировки?

Взаимоблокировка-это особый сценарий в многопоточной среде, когда два или более потоков блокируются навсегда. Ситуация взаимоблокировки возникает по крайней мере с двумя потоками и двумя или более потоками. Давайте напишем простую программу для создания тупика.

public class ThreadDeadlock {

    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        Object obj2 = new Object();
        Object obj3 = new Object();
    
        Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
        Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
        Thread t3 = new Thread(new SyncThread(obj3, obj1), "t3");
        
        t1.start();
        Thread.sleep(5000);
        t2.start();
        Thread.sleep(5000);
        t3.start();
        
    }

}

class SyncThread implements Runnable{
    private Object obj1;
    private Object obj2;

    public SyncThread(Object o1, Object o2){
        this.obj1=o1;
        this.obj2=o2;
    }
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + " acquiring lock on "+obj1);
        synchronized (obj1) {
         System.out.println(name + " acquired lock on "+obj1);
         work();
         System.out.println(name + " acquiring lock on "+obj2);
         synchronized (obj2) {
            System.out.println(name + " acquired lock on "+obj2);
            work();
        }
         System.out.println(name + " released lock on "+obj2);
        }
        System.out.println(name + " released lock on "+obj1);
        System.out.println(name + " finished execution.");
    }
    private void work() {
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Все три потока смогут получить блокировку первого объекта. Но они используют общие ресурсы и запущены таким образом, что будут продолжать бесконечно ждать получения блокировки второго объекта. Мы можем использовать дамп потока java для обнаружения взаимоблокировок. Подробнее читайте в разделе Взаимоблокировка на Java .

12. Найти факториал целого числа?

Факториал целого числа вычисляется путем умножения всех чисел от 1 до заданного числа.

F(n)(1)*F(2)…F(n-1)*F(n).

Мы можем использовать рекурсию, чтобы найти факториал целого числа.

public static long factorial(long n) {
	if (n == 1)
		return 1;
	else
		return (n * factorial(n - 1));
}

13. Отменить связанный список?

Функция LinkedList descendingIterator() возвращает итератор, который повторяет элемент в обратном порядке. Мы можем использовать этот итератор для создания нового связанного списка с элементами в обратном порядке.

LinkedList ll = new LinkedList<>();

ll.add(1);
ll.add(2);
ll.add(3);
System.out.println(ll);

LinkedList ll1 = new LinkedList<>();

ll.descendingIterator().forEachRemaining(ll1::add);

System.out.println(ll1);

Если вы смотрите с точки зрения структур данных и алгоритмов, ознакомьтесь со связанным списком .

14. Как реализовать двоичный поиск?

Элементы массива должны быть отсортированы для реализации двоичного поиска. Алгоритм бинарного поиска основан на следующих условиях.

Если ключ меньше среднего элемента, то теперь нам нужно искать только в первой половине массива. Если ключ больше среднего элемента, то нам нужно искать только во второй половине массива. И если ключ равен среднему элементу в массиве, то поиск заканчивается. Наконец, если ключ не найден во всем массиве, то он должен возвращать -1. Это указывает на то, что элемент отсутствует.

public static int binarySearch(int arr[], int low, int high, int key) {
	int mid = (low + high) / 2;

	while (low <= high) {
		if (arr[mid] < key) {
			low = mid + 1;
		} else if (arr[mid] == key) {
			return mid;
		} else {
			high = mid - 1;
		}
		mid = (low + high) / 2;
	}
	if (low > high) {
		return -1;
	}
	return -1;
}

15. Сортировка слиянием в Java?

Сортировка слиянием – один из наиболее эффективных алгоритмов сортировки. Он работает по принципу “Разделяй и властвуй”. Он основан на идее разбиения списка на несколько подсписков до тех пор, пока каждый подсписк не будет состоять из одного элемента. Затем объедините эти подсписки таким образом, чтобы получился отсортированный список.

public class MergeSort {

	public static void main(String[] args) {

		int[] arr = { 70, 50, 30, 10, 20, 40, 60 };

		int[] merged = mergeSort(arr, 0, arr.length - 1);

		for (int val : merged) {
			System.out.print(val + " ");
		}

	}

	public static int[] mergeTwoSortedArrays(int[] one, int[] two) {

		int[] sorted = new int[one.length + two.length];

		int i = 0;
		int j = 0;
		int k = 0;

		while (i < one.length && j < two.length) {

			if (one[i] < two[j]) {
				sorted[k] = one[i];
				k++;
				i++;
			} else {
				sorted[k] = two[j];
				k++;
				j++;
			}
		}

		if (i == one.length) {

			while (j < two.length) {
				sorted[k] = two[j];
				k++;
				j++;
			}
		}

		if (j == two.length) {

			while (i < one.length) {
				sorted[k] = one[i];
				k++;
				i++;
			}
		}

		return sorted;

	}

	public static int[] mergeSort(int[] arr, int lo, int hi) {

		if (lo == hi) {
			int[] br = new int[1];
			br[0] = arr[lo];

			return br;
		}

		int mid = (lo + hi) / 2;

		int[] fh = mergeSort(arr, lo, mid);
		int[] sh = mergeSort(arr, mid + 1, hi);

		int[] merged = mergeTwoSortedArrays(fh, sh);

		return merged;
	}

}

16. Создайте пирамиду символов в Java?

Программы шаблонов часто используются в интервью, чтобы понять способности интервьюируемого к логическому мышлению. Шаблоны пирамид очень популярны, и как только мы получим логику в том, как она создается, написание кода для достижения той же цели станет легкой задачей.

Я написал обширный пост для примеров различных типов пирамидальных моделей, прочитайте его здесь .

17. Проверьте, содержат ли два массива одинаковые элементы?

Сначала мы создадим набор элементов из обоих массивов. Затем сравните элементы в этих наборах, чтобы выяснить, есть ли элемент, которого нет в обоих наборах?

package com.journaldev.programminginterviews;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class ArraySameElements {

	public static void main(String[] args) {
		Integer[] a1 = {1,2,3,2,1};
		Integer[] a2 = {1,2,3};
		Integer[] a3 = {1,2,3,4};
		
		System.out.println(sameElements(a1, a2));
		System.out.println(sameElements(a1, a3));

	}

	static boolean sameElements(Object[] array1, Object[] array2) {
		Set uniqueElements1 = new HashSet<>(Arrays.asList(array1));
		Set uniqueElements2 = new HashSet<>(Arrays.asList(array2));
		
		// if size is different, means there will be a mismatch
		if(uniqueElements1.size() != uniqueElements2.size()) return false;
		
		for(Object obj : uniqueElements1) {
			// element not present in both?
			if (!uniqueElements2.contains(obj)) return false;
		}
		
		return true;
	}
}

18. Сумма всех элементов в целочисленном массиве?

Это очень простая программа. Мы можем использовать цикл for для перебора элементов массива и добавления их, чтобы получить окончательную сумму.

int[] array = { 1, 2, 3, 4, 5 };

int sum = 0;

for (int i : array)
	sum += i;

System.out.println(sum);

19. Найдите второе по величине число в массиве?

Есть много способов решить эту проблему. Мы можем отсортировать массив в естественном порядке возрастания и взять второе последнее значение. Но сортировка-дорогостоящая операция.

Мы также можем использовать две переменные, чтобы найти второе по величине значение за одну итерацию.

private static int findSecondHighest(int[] array) {
	int highest = Integer.MIN_VALUE;
	int secondHighest = Integer.MIN_VALUE;

	for (int i : array) {
		if (i > highest) {
			secondHighest = highest;
			highest = i;
		} else if (i > secondHighest) {
			secondHighest = i;
		}

	}
	return secondHighest;
}

20. Как перетасовать массив в Java?

Мы можем использовать случайный класс для генерации случайных индексных чисел и перемешивания элементов.

int[] array = { 1, 2, 3, 4, 5, 6, 7 };

Random rand = new Random();

for (int i = 0; i < array.length; i++) {
	int randomIndexToSwap = rand.nextInt(array.length);
	int temp = array[randomIndexToSwap];
	array[randomIndexToSwap] = array[i];
	array[i] = temp;
}
System.out.println(Arrays.toString(array));

Мы можем запустить код перетасовки внутри другого цикла for, чтобы перетасовать несколько раундов.

21. Как узнать, присутствует ли строка в текстовом файле?

Мы можем использовать класс сканера для чтения содержимого файла строка за строкой. Затем используйте метод String contains (), чтобы проверить, присутствует ли строка в файле или нет.

boolean findStringInFile(String filePath, String str) throws FileNotFoundException {
	File file = new File(filePath);

	Scanner scanner = new Scanner(file);

	// read the file line by line
	while (scanner.hasNextLine()) {
		String line = scanner.nextLine();
		if (line.contains(str)) {
			scanner.close();
			return true;
		}
	}
	scanner.close();
	return false;
}

Приведенный выше код предполагает, что строка, которую мы ищем в файле, не содержит символов новой строки.

22. Как напечатать дату в определенном формате?

Мы можем использовать класс SimpleDateFormat для приведения строки даты в определенное форматирование.

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

String date = simpleDateFormat.format(new Date());
System.out.println(date); // 06-23-2020

Рекомендуемое чтение: Java SimpleDateFormat .

23. Как объединить два списка в java?

Мы можем использовать метод addAll() для объединения нескольких списков в Java.

List list1 = new ArrayList<>();
list1.add("1");
List list2 = new ArrayList<>();
list2.add("2");

List mergedList = new ArrayList<>(list1);
mergedList.addAll(list2);
System.out.println(mergedList); // [1, 2]

24. Как отсортировать хэш-карту по значениям?

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

package com.journaldev.programminginterviews;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class SortHashMapByValue {

	public static void main(String[] args) {
		Map scores = new HashMap<>();

		scores.put("David", 95);
		scores.put("Jane", 80);
		scores.put("Mary", 97);
		scores.put("Lisa", 78);
		scores.put("Dino", 65);

		System.out.println(scores);

		scores = sortByValue(scores);

		System.out.println(scores);

	}

	private static Map sortByValue(Map scores) {
		Map sortedByValue = new LinkedHashMap<>();

		// get the entry set
		Set> entrySet = scores.entrySet();
		System.out.println(entrySet);

		// create a list since the set is unordered
		List> entryList = new ArrayList<>(entrySet);
		System.out.println(entryList);

		// sort the list by value
		entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
		System.out.println(entryList);

		// populate the new hash map
		for (Entry e : entryList)
			sortedByValue.put(e.getKey(), e.getValue());

		return sortedByValue;
	}

}

25. удалить все вхождения данного символа из входной строки?

Класс String не имеет никакого метода для удаления символов. Мы можем использовать метод replace() для создания новой строки без данного символа.

String str1 = "abcdABCDabcdABCD";
		
str1 = str1.replace("a", ""); 

System.out.println(str1); // bcdABCDbcdABCD

Строка неизменна в Java. Все методы обработки строк возвращают новую строку. Поэтому необходимо, чтобы мы присвоили его другой переменной.

26. Как получить отдельные символы и их количество в строке?

Мы можем создать массив символов из строки. Затем повторите его и создайте хэш-карту с символом в качестве ключа и их количеством в качестве значения.

String str1 = "abcdABCDabcd";

char[] chars = str1.toCharArray();

Map charsCount = new HashMap<>();

for(char c : chars) {
	if(charsCount.containsKey(c)) {
		charsCount.put(c, charsCount.get(c)+1);
	}else
		charsCount.put(c, 1);
}

System.out.println(charsCount); // {a=2, A=1, b=2, B=1, c=2, C=1, d=2, D=1}

27. Как доказать, что строка неизменна программно?

String s1 = "Java"; // "Java" String created in pool and reference assigned to s1

String s2 = s1; //s2 is also having the same reference to "Java" in the pool

System.out.println(s1 == s2); // proof that s1 and s2 have same reference

s1 = "Python"; 
//s1 value got changed above, so how String is immutable?

//well, in the above case a new String "Python" got created in the pool
//s1 is now referring to the new String in the pool 
//BUT, the original String "Java" is still unchanged and remains in the pool
//s2 is still referring to the original String "Java" in the pool

// proof that s1 and s2 have different reference
System.out.println(s1 == s2); 

System.out.println(s2); 
// prints "Java" supporting the fact that original String value is unchanged, hence String is immutable

28. Написать программу для демонстрации наследования?

class Animal {
	String color;
}

class Cat extends Animal {
	void meuw(){
		System.out.println("Meuw");
	}
}

29. Написать программу, чтобы показать проблему с множественным наследованием?

Java не позволяет расширять несколько классов. Это делается для того, чтобы все было просто и избежать проблем с алмазами.

interface I {
	void foo();
}
class A implements I{
	public void foo() {}
}

class B implements I{
	public void foo() {}
}

class C extends A, B { // won't compile
	public void bar() {
		super.foo();
	}
}

В приведенном выше примере, если бы Java разрешила наследование нескольких классов, то какой метод super foo() должен быть вызван? Мог бы быть механизм, чтобы исправить это, но разработчики языка Java подумали, что лучше упростить его, не допуская множественного наследования.

30. Напишите программу, чтобы показать пример try catch?

Давайте рассмотрим простой блок-код try-catch.

try {
	FileInputStream fis = new FileInputStream("test.txt");
}catch(FileNotFoundException e) {
	e.printStackTrace();
}

Начиная с Java 7 и далее, мы также можем перехватывать несколько исключений в одном блоке catch. Это полезно, когда у нас один и тот же код во всех блоках catch.

public static void foo(int x) throws IllegalArgumentException, NullPointerException {
	// some code
}

public static void main(String[] args) {
	try {
		foo(10);
	} catch (IllegalArgumentException | NullPointerException e) {
		System.out.println(e.getMessage());
	}
}

31. Напишите код, чтобы показать исключение NullPointerException

Если мы вызываем функцию на “null”, она вызовет исключение NullPointerException.

public static void main(String[] args) {
	printString(null, 3);
	
}

static void printString(String s, int count){
	for (int i = 0 ; i < count; i++) {
		System.out.println(s.toUpperCase()); // Exception in thread "main" java.lang.NullPointerException
	}
}

Вот почему лучше иметь нулевую проверку для ранней проверки.

static void printString(String s, int count){
	if(s == null) return;
	for (int i = 0 ; i < count; i++) {
		System.out.println(s.toUpperCase());
	}
}

Мы также можем бросить Исключение IllegalArgumentException на основе требований проекта.

32. Как создать запись на Java?

Записи-это функция предварительного просмотра, представленная в Java 14. Записи позволяют нам создавать класс POJO с минимальным кодом. Он автоматически генерирует код метода hashCode(), equals(), методы получения и код метода toString() для класса. Записи являются окончательными и неявно расширяют java.lang.Класс рекордов.

import java.util.Map;
 
public record EmpRecord(int id, String name, long salary, Map addresses) {
}

Подробнее читайте в разделе Записи на Java .

33. Как создавать текстовые блоки в Java?

Java 13 добавила текстовые блоки в качестве функции предварительного просмотра. Мы можем создавать многострочные строки, используя текстовые блоки.

Многострочная строка должна быть записана внутри пары тройных двойных кавычек.

String textBlock = """
		Hi
		Hello
		Yes""";

Это то же самое, что создать строку типа “Привет\привет\да”.

34. Покажите пример выражений переключения и операторов с несколькими метками

Выражения переключения были добавлены в качестве функции предварительного просмотра в Java 12. Это стало стандартной функцией в выпуске Java 14. В приведенных ниже примерах показаны выражения переключения, а также операторы с несколькими метками.

int choice = 2;

int x = switch (choice) {
case 1, 2, 3:
	yield choice;
default:
	yield -1;
};
System.out.println("x = " + x); // x = 2

Мы также можем использовать лямбда-выражения в выражениях переключения.

String day = "TH";
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
	if (day.isEmpty())
		yield "Please insert a valid day.";
	else
		yield "Looks like a Sunday.";
}

};
System.out.println(result); // TTH

35. Как скомпилировать и запустить класс Java из командной строки?

Допустим, у нас есть класс, как показано ниже.

public class Test {

public static void main(String args[]) {
		System.out.println("Hi");
	}

}

Мы можем скомпилировать его, используя следующий код.

javac Test.java

Для запуска класса мы можем выполнить следующую команду.

java Test

Из последних выпусков команда java также позаботится о компиляции, если файл класса отсутствует.

Если класс находится в пакете com.journaldev , то он должен находиться внутри папки com/journaldev . Команда для компиляции и запуска будет следующей.

java com/journaldev/Test.java

Если нашему классу требуется несколько дополнительных банок для компиляции и запуска, мы можем использовать опцию-cp java.

java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar  com/journaldev/Test.java

36. Как создать перечисление в Java?

Давайте рассмотрим простое перечисление.

public enum ThreadStates {
	START,
	RUNNING,
	WAITING,
	DEAD;
}

Состояния потока-это перечисление с фиксированными полями констант “ЗАПУСК”, “ЗАПУСК”, “ОЖИДАНИЕ” и “МЕРТВЫЙ”.

Все перечисления неявно расширяют java.lang.Класс перечисления и реализует сериализуемые и сопоставимые интерфейсы.

Перечисление также может иметь методы, подробнее читайте в Перечислениях на Java .

37. Как использовать метод forEach ()?

Метод forEach() предоставляет ярлык для выполнения действия со всеми элементами итерируемого объекта. Допустим, нам нужно перебрать элементы списка и распечатать его.

List list = new ArrayList<>();

Iterator it = list.iterator();

while (it.hasNext()) {
	System.out.println(it.next());
}

Мы можем использовать метод forEach() с лямбда-выражением, чтобы уменьшить размер кода.

List list = new ArrayList<>();

list.forEach(System.out::print);

38. Написать интерфейс со стандартным и статическим методом?

Java 8 представила стандартные и статические методы в интерфейсах. Это позволило преодолеть разрыв между интерфейсами и абстрактными классами.

public interface Interface1 {
	
	// regular abstract method
	void method1(String str);
	
	default void log(String str){
		System.out.println("I1 logging::"+str);
	}
	
	static boolean isNull(String str) {
		System.out.println("Interface Null Check");

		return str == null ? true : "".equals(str) ? true : false;
	}
}

Подробнее читайте в разделе Изменения интерфейса Java 8 .

39. Как мы создаем функциональный интерфейс?

Интерфейс с ровно одним абстрактным методом называется функциональным интерфейсом. Добавлена аннотация @Functional Interface, чтобы мы могли пометить интерфейс как функциональный интерфейс.

Основное преимущество функциональных интерфейсов java 8 заключается в том, что мы можем использовать лямбда-выражения для их создания и избегать использования громоздкой реализации анонимного класса.

@FunctionalInterface
interface Foo {
	void test();
}

Дальнейшее чтение: Функциональные интерфейсы Java 8 .

40. Покажите пример использования лямбда-выражений в Java

Запускаемый-отличный пример функционального интерфейса. Мы можем использовать лямбда-выражения для создания выполнимого.

Runnable r1 = () -> System.out.println("My Runnable");

Вы можете узнать все о лямбда-выражениях в этом уроке .

41. Покажите примеры перегрузки и переопределения в Java

Когда класс содержит два или более методов с одинаковым именем, они называются перегруженными методами.

class Foo {

	void print(String s) {
		System.out.println(s);
	}

	void print(String s, int count) {
		while (count > 0) {
			System.out.println(s);
			count--;
		}
	}
}

Рекомендуемое чтение: Перегрузка методов в Java .

Когда метод суперкласса также реализован в дочернем классе, это случай переопределения.

class Base {
	void printName(){
		System.out.println("Base Class");
	}
}

class Child extends Base{
	@Override
	void printName(){
		System.out.println("Child Class");
	}
}

Рекомендуемые показания: Переопределение в Java и переопределение против перегрузки .

42-49. Угадайте выходные данные фрагментов кода

Давайте посмотрим на 8 фрагментов кода и угадаем их выходные данные.

  1. Вывод: ложь

    Пояснение: Вывод данных операторов будет “ложным”, потому что в java + приоритет оператора больше, чем. Таким образом, данное выражение будет оценено как “s1 is:abc”, т. е. ложно.

  2. Результат: наш

    Пояснение: Вывод данных утверждений будет “нашим”. Первый символ будет автоматически переведен в int. После этого, поскольку в java индекс первого символа равен 0, он будет начинаться с ” o “и печататься до “n”. Обратите внимание, что в функции строковой подстроки она оставляет конечный индекс.

  3. Выход: 100

    Пояснение: Размер самого короткого будет равен 100. Функция автобокса Java была введена в JDK 5, поэтому при добавлении короткого в HashSet<Короткий> он автоматически преобразует его в короткий объект. Теперь “i-1” будет преобразован в значение int во время оценки, и после этого он будет автоматически преобразован в объект Integer, но в наборе хэшей нет объекта Integer, поэтому он ничего не удалит из набора хэшей, и, наконец, его размер будет равен 100.

  4. Каким будет логическое значение “флага” для достижения конечного блока?

    Пояснение: Последний блок никогда не будет достигнут здесь. Если флаг будет ИСТИННЫМ, он войдет в бесконечный цикл, а если он будет ложным, он выйдет из JVM. Так что, наконец, блок никогда не будет достигнут здесь.

  5. Вывод: Исключение NullPointerException

    Пояснение: Данное утверждение печати вызовет java.lang.Исключение NullPointerException, поскольку при вычислении логического оператора OR он сначала вычислит оба литерала, а поскольку str равен нулю, метод .equals() выдаст исключение. Всегда рекомендуется использовать логические операторы короткого замыкания, т. е. “

  6. " и"&&", которые вычисляют значения литералов слева, и поскольку первый литерал вернет значение true, он пропустит оценку второго литерала.

    Вывод: abc

  7. Пояснение: x.concat(y) создаст новую строку, но она не назначена x, поэтому значение x не изменяется.

    Вывод: Ошибка во время выполнения Объяснение: Это сложный вопрос, похоже, что тест касается порядка выполнения математических операторов и синтаксиса основного метода будет упущен из виду. Это приведет к ошибке во время выполнения , потому что основной метод не является статическим

    , что-то вроде приведенного ниже.
  8. Вывод: Ошибка во Время компиляции

ОБНОВЛЕНИЕ: Перейдите к еще нескольким вопросам интервью по кодированию java .

50. Найдите 5 ошибок в следующем фрагменте кода

package com.journaldev.programming-interviews;

public class String Programs {

	static void main(String[10] args) {
		String s = "abc"
		System.out.println(s);
	}
}
  1. В имени пакета не может быть дефисов.
  2. В имени класса не может быть пробелов.
  3. Основной метод не является общедоступным, поэтому он не будет выполняться.
  4. Основной аргумент метода не должен указывать размер.
  5. Точка с запятой отсутствует в определении строки.

Вывод

Я изо всех сил старался включить в этот учебник как простые, так и немного сложные вопросы по программированию. Кроме того, я добавил фрагменты кода и вопросы, связанные с недавними изменениями в функциях Java.