Javaプログラミングの面接でよく聞かれる50の質問のトップ

あいさつ

もしJavaのプログラミングの役割の面接を受けるならば、おそらくあなたのコーディングスキルがテストされます。Javaの初心者であろうと、エキスパートプログラマであろうと、この記事はいくつかの一般的なJavaの面接の質問と回答を提供し、準備を支援します。

Javaで文字列を逆にする方法はどうすればいいですか?

Stringクラスにはreverse()というユーティリティメソッドはありません。しかし、文字列から文字配列を作成し、後ろから先頭に向かってイテレートすることができます。文字を文字列ビルダーに追加し、最終的に逆さまの文字列を返すことができます。

以下のサンプルコードは、文字列を反転させる方法の一つを示しています。

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から始まるため、forループではchars.length – 1から開始する必要があります。

2. Javaを使用せずに、二つの数字を入れ替える方法はありますか?

三つの変数を使用せずに数値を交換する方法は、コードで視覚的に表現されるとより理解しやすい三段階のプロセスです。

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)

次の例コードは、数値の交換メソッドを実装する一つの方法を示しています。

public class SwapNumbers {

public static void main(String[] args) {
	int a = 10;
	int b = 20;

    System.out.println("a is " + a + " and b is " + b);

	a = a + b;
	b = a - b;
	a = a - b;

    System.out.println("After swapping, a is " + a + " and b is " + b);
    }

}

出力結果は整数値が入れ替わったことを示しています。

Output

a is 10 and b is 20 After swapping, a is 20 and b is 10

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].*");
	}

}

与えられた数が素数であるかどうかを確認するための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に対して、2から√N(Nの平方根)の間に、それで均等に割り算できる素数Mが存在する場合、Nは素数ではないと考えてください。

5. 再帰を使用してフィボナッチ数列を印刷するためのJavaプログラムを作成してください。

フィボナッチ数列は、各数が前の2つの数の合計である数列です。この例では、数列は0と1で始まります。次のコードの例は、forループを使用してフィボナッチ数列を表示する方法を示しています。

public class PrintFibonacci {

	public static void printFibonacciSequence(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;
		}
	}

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

}
Output

0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

フィボナッチ数列を出力するために再帰も使用することができます。なぜなら、フィボナッチ数は直前の二つの数を足すことで生成されるからです。

F(N) = F(N-1) + F(N-2)

以下の例題クラスは、10個の数字からなるフィボナッチ数列を再帰を使って計算する方法を示しています。

public class PrintFibonacciRecursive {

    public static int fibonacci(int count) {
		if (count <= 1)
			return count;

		return fibonacci(count - 1) + fibonacci(count - 2);
	}

	public static void main(String args[]) {
    	int seqLength = 10;

    	System.out.print("A Fibonacci sequence of " + seqLength + " numbers: ");

    	for (int i = 0; i < seqLength; i++) {
      	    System.out.print(fibonacci(i) + " ");
    	}
  	}

}
Output

A Fibonacci sequence of 10 numbers: 0 1 1 2 3 5 8 13 21 34

6. Javaで整数のリストが奇数のみを含んでいるかをチェックする方法は何ですか?

「各要素が奇数であるかどうかを確認するために、forループを使用することができます。」

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

	return true;
}

リストが大きい場合は、次の例のコードに示すように、高速な処理のために並列ストリームを使用することができます。

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

整数が奇数かどうかを決定する数学的な原理について詳しく学びたい場合は、Wikipediaの剰余演算を参照してください。

7. Javaで文字列が回文かどうかをチェックする方法は何ですか?

回文(かいぶん)とは、文字列を逆から読んでも同じになる文字列のことです。回文をチェックするためには、入力された文字列を逆にして結果が入力と同じかどうかを確認することができます。以下の例題コードは、StringクラスのcharAt(int index)メソッドを使用して回文文字列をチェックする方法を示しています。

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. Javaで文字列からスペースを削除するには、どのようにすればいいですか?

以下の例コードは、Character.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();
}

Javaで文字列からスペースや他の文字を取り除く方法について詳しく学びましょう。

9. Java で文字列から前後のスペースを取り除く方法は何ですか?

日本語で一つのオプションで以下を言い換えます:

Stringクラスには、先頭と末尾の空白を削除するための2つのメソッドがあります: trim()とstrip()。strip()メソッドはJava 11でStringクラスに追加されました。strip()メソッドは、文字が空白かどうかを確認するためにCharacter.isWhitespace()メソッドを使用します。このメソッドはUnicodeコードポイントを使用しますが、trim()メソッドはコードポイント値がU+0020以下の任意の文字を空白文字として認識します。

strip()メソッドは、Unicode標準を使用して空白を削除するための推奨される方法です。以下のコード例は、strip()メソッドを使用して空白を削除する方法を示しています。

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

文字列はイミュータブル(変更不可能)なので、strip()の結果を文字列に割り当てる必要があります。

10. Javaで配列をソートする方法はなんですか?

Arraysユーティリティクラスには、プリミティブ配列とオブジェクト配列の両方をソートするための多重定義されたsort()メソッドがあります。もし自然な順序でプリミティブ配列をソートしたい場合は、以下の例に示すように、Arrays.sort()メソッドを使用することができます。

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

Arrays.sort(array);

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

しかし、オブジェクトの配列をソートしたい場合は、オブジェクトがComparableインターフェースを実装している必要があります。ソート基準を指定したい場合は、ソートロジックにComparatorを渡すことができます。JavaのComparableとComparatorについて詳しく学びましょう。

11. Javaでプログラム上でデッドロックシナリオを作成する方法は何ですか?

デッドロックとは、マルチスレッドのJava環境で、2つ以上のスレッドが永遠にブロックされてしまう状況を指します。デッドロックの状況は、2つ以上のスレッドがやり取りを行う場合に発生します。次のコード例では、デッドロックの状況を作り出します。

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();
        }
    }

}

以下の文を日本語で一つのオプションで言い換えます:
最初のオブジェクトのロックを3つのスレッドすべてが取得することができます。しかし、彼らは共有リソースを使用し、二つ目のオブジェクトのロックを無期限に待ち続けるように開始されています。デッドロックを検出するためにJavaスレッドダンプを使用することができます。Javaでのデッドロックについて詳しく学びましょう。

12. Javaで整数の階乗を求める方法はどのようなものですか?

整数の階乗は、与えられた数から1までのすべての数を掛け合わせることで計算されます。

F(n) = F(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. Javaでリンクリストを逆にする方法は何ですか? (Java de rinkurisuto o gyaku ni suru hōhō wa nan desu ka?)

LinkedListのdescendingIterator()は、要素を逆の順序で反復するイテレータを返します。以下の例コードは、このイテレータを使用して要素が逆順にリストされた新しいLinkedListを作成する方法を示しています。

LinkedList<Integer> ll = new LinkedList<>();

ll.add(1);
ll.add(2);
ll.add(3);

System.out.println(ll);

LinkedList<Integer> ll1 = new LinkedList<>();

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

System.out.println(ll1);

データ構造とアルゴリズムの観点から、連結リストの逆転についてもっと学びましょう。

14. Javaで2分探索を実装する方法はどうですか? (Java de nibun tansaku o jisshō suru hōhō wa dō desu ka?)

配列の要素は、バイナリサーチを実装するためにソートされている必要があります。バイナリサーチアルゴリズムは以下の条件に基づいています。

  • If the key is less than the middle element, then you now need to search only in the first half of the array.
  • If the key is greater than the middle element, then you need to search only in the second half of the array.
  • If the key is equal to the middle element in the array, then the search ends.
  • Finally, if the key is not found in the whole array, then it should return -1. This indicates that the element is not present.

次の例コードは、二分探索を実装しています。

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で文字のピラミッドを作成できますか?

パターンプログラムは非常に人気のある面接のトピックです。このタイプの質問は、面接者の論理的思考能力を理解するために使用されます。さまざまな方法でピラミッドパターンを作成する例については、Javaのピラミッドパターンプログラムを参照してください。

17.同じ要素を含むかどうかを確認するJavaプログラムを作成してください。

2つの配列が同じ要素を含んでいるかを確認するには、まず、両方の配列から要素のセットを作成し、それからこれらのセット内の要素を比較して、両方のセットに存在しない要素があるかどうかを見つける必要があります。次の例のコードは、2つの配列が共通の要素のみを含んでいるかどうかを確認する方法を示しています。

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<Object> uniqueElements1 = new HashSet<>(Arrays.asList(array1));
		Set<Object> 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;
	}

}
Output

true false

18. Javaで整数の配列の要素の合計を算出する方法は何ですか?

配列要素を繰り返し処理し、合計を取得するために、forループを使用することができます。

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

int sum = 0;

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

System.out.println(sum);

19. Javaで配列内の2番目に大きい数を見つける方法はどうですか?

この問題を解決するためには様々な方法があります。配列を自然な昇順で整列させ、2番目に大きい値を取る方法があります。ただし、整列はコストがかかります。また、次の例に示すように、単一の繰り返しで2番目に大きい値を見つけるために2つの変数を使用する方法もあります。

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で配列をシャッフルするにはどうすればいいですか?

以下のサンプルコードは、ランダムなインデックス番号を生成し、要素をシャッフルするためにRandomクラスを使用する方法を示しています。

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. Javaでテキストファイル内の文字列を見つける方法はどのようにしますか?

以下の例題コードは、Scannerクラスを使用してファイルの内容を行単位で読み込み、その後、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. Javaで特定の形式で日付を印刷するにはどうすればよいですか?

以下の例では、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で2つのリストをマージする方法はどのようになりますか?

以下の例は、Javaで複数のリストをマージするためにaddAll()メソッドを使用する方法を示しています。

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

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

24. 値でHashMapをソートするJavaプログラムを作成してください。

HashMapは順序付けられたコレクションではありません。以下の例のコードは、値に基づいてエントリーをソートし、挿入の順序を維持するLinkedHashMapに格納する方法を示しています。

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<String, Integer> 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<String, Integer> sortByValue(Map<String, Integer> scores) {
		Map<String, Integer> sortedByValue = new LinkedHashMap<>();

		// get the entry set
		Set<Entry<String, Integer>> entrySet = scores.entrySet();
		System.out.println(entrySet);

		// create a list since the set is unordered
		List<Entry<String, Integer>> 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<String, Integer> e : entryList)
			sortedByValue.put(e.getKey(), e.getValue());

		return sortedByValue;
	}

}

25. Javaで入力された文字列から指定された文字のすべての出現を削除するには、どうすればよいですか?

Stringクラスには文字を削除するためのメソッドがありません。次の例コードでは、replace()メソッドを使用して指定された文字のない新しい文字列を作成する方法を示しています。

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

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

Javaでは、文字列は変更不可能です。すべての文字列操作メソッドは新しい文字列を返し、それを別の変数に割り当てる必要があるためです。Javaで文字列から文字を削除する方法について詳しく学びましょう。

「Javaで文字列内の異なる文字とその個数を取得するには、どのようにすれば良いですか?」

文字列から文字の配列を作成することができます。それから、それを繰り返し処理し、文字をキーとその数を値とするHashMapを作成できます。次の例のコードは、文字列の文字を抽出して数える方法を示しています。

String str1 = "abcdABCDabcd";

char[] chars = str1.toCharArray();

Map<Character, Integer> 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. Javaにおいて、Stringオブジェクトがプログラム上で変更不可能であることを証明できますか?

以下の例のコードは、Stringオブジェクトが不変であることを証明する方法を示しています。コード内のコメントは各ステップを説明しています。

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

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

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

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

//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. Javaで継承を示すためのいくつかのコードを書くことができますか?

以下のサンプルコードは、extendsキーワードを使用してAnimalクラスのサブクラスを作成する方法を示しています。新しいCatクラスは、Animalクラスから変数を継承し、Catクラスにのみ属する追加のコードを追加します。

class Animal {
	String color;
}

class Cat extends Animal {
	void meow() {
		System.out.println("Meow");
	}
}

29. Javaにおいて、多重継承によるダイヤモンド問題をどのように示しますか?

以下のように日本語で言い換えます。一つのオプションで良いです。

ダイヤモンド問題は、あるクラスが複数のクラスから継承される場合に発生し、どのクラスのメソッドを実行するかが明確でない場合に曖昧性が生じます。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();
	}
}

30. Javaでのtry-catchの例をどのように説明しますか?

以下のコードは、try-catchの例を示しています。

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

Java 7以降では、次の例に示すように、1つの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を表示するためのJavaプログラムを書いてください。

もしヌルに対して関数を呼び出す場合、以下の例のコードでは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 16では、レコードは標準機能として追加されました。レコードを使用すると、最小限のコードでPOJOクラスを作成することができます。レコードは、hashCode()、equals()、getterメソッド、およびtoString()メソッドのコードを自動生成します。レコードはfinalであり、暗黙的にjava.lang.Recordクラスを拡張します。次の例のコードは、レコードを作成する方法の一つを示しています。

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

Javaのレコードについて詳しく学びましょう。POJOに関する詳細については、Wikipediaの「Plain old Java object」を参照してください。

33. Javaでテキストブロックを作成するには、どのようにしますか?

Java 15では、テキストブロック機能が追加されました。テキストブロックを使って、複数行の文字列を作成することができます。複数行の文字列は、以下の例に示すように、トリプルダブルクォートのペアの中に記述する必要があります。

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

「Hi\\nHello\\nYes」というような文字列を作成するのと同じです。

34. Javaでのスイッチ式と複数ラベルのケースステートメントの例を示してください。

スイッチ式は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クラスをコンパイルして実行するには、どのようにしますか?

この例は、以下のJavaファイルに言及しています。

public class Test {

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

}

あなたのターミナルで以下のコマンドを使用して、それをコンパイルすることができます。

  1. javac Test.java

 

クラスを実行するには、ターミナルで以下のコマンドを使用してください。

  1. java Test

 

最新のリリースでは、クラスファイルが存在しない場合でも、javaコマンドはプログラムをコンパイルします。クラスがcom.exampleのようなパッケージにある場合、それはcom/exampleというフォルダ内にある必要があります。コンパイルと実行するコマンドは次の通りです:

  1. java com/example/Test.java

 

クラスのコンパイルと実行に追加のJARファイルが必要な場合は、java -cpオプションを使用することができます。例えば:

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

 

36. Javaでenumを作成するには、どのようにしますか?

以下の例コードは、基本的な列挙型を作成する方法を示しています。

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

ThreadStatesとは、定数フィールドであるSTART、RUNNING、WAITING、DEADを持つ列挙型です。すべての列挙型は、自動的にjava.lang.Enumクラスを継承し、SerializableとComparableインターフェースを実装します。列挙型は、メソッドを持つこともできます。Javaでの列挙型について詳しく学びましょう。

37. JavaのforEach()メソッドはどのように使いますか?

forEach()メソッドは、イテラブルのすべての要素にアクションを実行するためのショートカットを提供します。以下の例コードは、リストの要素を繰り返し表示する方法を示しています。

List<String> list = new ArrayList<>();

Iterator<String> it = list.iterator();

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

次の例のように、forEach()メソッドをラムダ式と組み合わせて使用することで、コードのサイズを縮小することができます。

List<String> 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. 関数型インターフェースを作成する方法は何ですか?(Kanshugata intāfēsu o sakusei suru hōhō wa nan desu ka?)

ただ1つの抽象メソッドを持つインターフェースは、関数型インターフェースと呼ばれます。関数型インターフェースの主な利点は、ラムダ式を使用してインスタンス化できるため、大きな匿名クラスの実装を避けることができることです。@FunctionalInterfaceアノテーションは、次の例のコードに示されているように、関数型インターフェースを示します。

@FunctionalInterface
interface Foo {
	void test();
}

40. Javaでラムダ式を使用した例を示してください。

ランナブルは、関数型インターフェースの優れた例です。次のコードの例に示すように、ランバダ式を使用してランナブルを作成することができます。

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

41. Javaでのオーバーロードとオーバーライドの例を示してください。 (Java de no overroado to overraido no rei o shimeshite kudasai.)

同じ名前を持つ2つ以上のメソッドがクラスにある場合、それらはオーバーロードされたメソッドと呼ばれます。次の例のコードは、オーバーロードされたメソッドprintを示しています。

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

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

}

親クラスのメソッドが子クラスでも実装されている場合、それはオーバーライドと呼ばれます。以下の例では、両クラスに実装されているprintname()メソッドに注釈を付ける方法を示しています。

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

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

Javaにおけるオーバーライドとオーバーロードについてもっと学びましょう。

42. What do you think the output will be?
出力はどうなるか、何か予想はある?

43. Can you guess what the output would look like?
出力はどういう風になると思いますか?

44. Take a guess at the expected output.
予測される出力を推測してみてください。

45. Do you have an idea of what the output will be?
出力の予想はありますか?

46. Give it a shot and predict the output.
チャレンジして、出力を予測してみてください。

47. Make an educated guess about the output.
出力について教養のある予想を立ててください。

48. Could you hazard a guess as to what the output might be?
出力はどのようなものになるか、推測してみていただけますか?

49. Take a stab at what you think the output will be.
出力がどうなるか、予測してみてください。

以下のコードスニペットの出力を予測して、自分自身をテストしてみてください。


String s1 = "abc";
String s2 = "abc";

System.out.println("s1 == s2 is:" + s1 == s2);
出力
偽与えられた文の出力は偽です。なぜなら、+演算子は==演算子よりも優先度が高いからです。そのため、与えられた式は「s1 == s2 is:abc」と「abc」という値を比較した結果、「偽」となります。


String s3 = "JournalDev";
int start = 1;
char end = 5;

System.out.println(s3.substring(start, end));
出力
ourn与えられたステートメントの出力はournです。最初の文字は自動的にint型にキャストされます。その後、最初の文字のインデックスが0であるため、oからnまで印刷されます。なお、Stringのsubstringメソッドは、startインデックスからend – 1の文字までを含むsubstringを作成します。


HashSet shortSet = new HashSet();

	for (short i = 0; i < 100; i++) {
    shortSet.add(i);
    shortSet.remove(i - 1);
}

System.out.println(shortSet.size());
出力
100shortSetのサイズは100です。Javaのオートボクシング機能により、プリミティブ型のshortを持つ式iがShortオブジェクトに変換されます。同様に、式i – 1はプリミティブ型のintであり、Integerオブジェクトにオートボクシングされます。HashSetにIntegerオブジェクトがないため、何も削除されず、サイズは100です。


try {
	if (flag) {
  		while (true) {
   		}
   	} else {
   		System.exit(1);
   	}
} finally {
   	System.out.println("In Finally");
}
出力
出力はありません。このコードは、フラグがtrueの場合には無限ループになり、フラグがfalseの場合にはプログラムが終了します。finallyブロックは決して到達されません。

String str = null;
String str1="abc";

System.out.println(str1.equals("abc") | str.equals(null));
出力
例外スレッド “main” で java.lang.NullPointerException が発生しました: “” が null なので “String.equals(Object)” を呼び出すことができません。与えられた印刷文は、Java.lang.NullPointerException をスローします。なぜなら、OR論理演算子は両方のリテラルを評価してから結果を返すからです。strが null のため、.equals() メソッドが例外をスローします。常に、左から右にリテラル値を評価するショートサーキット論理演算子、つまり || や && を使用することをお勧めします。この場合、最初のリテラルが true を返すため、2番目のリテラルの評価はスキップされます。


String x = "abc";
String y = "abc";

x.concat(y);

System.out.print(x);
出力
abcx.concat(y) は新しい文字列を作成しますが、x に割り当てられていないため、x の値は変更されません。


public class MathTest {

 	public void main(String[] args) {  		
   		int x = 10 * 10 - 10;
   		
   		System.out.println(x);
   	}
   
}
出力
エラー: クラスMathTest内のmainメソッドは静的ではありません。メインメソッドを次のように定義してください:
public static void main(String[] args)数学演算子の実行順序についての質問のように思われるかもしれませんが、この質問は実際にはmainメソッドが静的に宣言されていなかったことに気付くことに関してのものです。


public class Test {
   
  	public static void main(String[] args) {
   		try {
   			throw new IOException("Hello");
   		} catch(IOException | Exception e) {
   			System.out.println(e.getMessage());
   		}
   	}
}
出力
Test.java:5: エラー: シンボルが見つかりません
throw new IOException(“Hello”);
^
symbol: クラス IOException
location: クラス Test
Test.java:6: エラー: シンボルが見つかりません
}catch(IOException | Exception e) {
^
symbol: クラス IOException
location: クラス Test
2エラーこのコードはコンパイル時エラーを引き起こします。例外IOExceptionは代替例外Exceptionによって既にキャッチされています。

以下のコードスニペットには5つの間違いがあります。探してください。

package com.digitalocean.programming-interviews;

public class String Programs {

	static void main(String[10] args) {
		String s = "abc"
		System.out.println(s);
	}
}
パッケージ名にはハイフンを使えません。
クラス名にはスペースを使えません。
メインメソッドはパブリックではないので、実行されません。
メインメソッドの引数でサイズを指定する必要はありません。
文字列の定義にセミコロンが抜けています。

結論

この50のJavaプログラミングのインタビュー問題集は、初心者から上級者までの問題を含んでおり、インタビューの準備をサポートします。

おすすめの読書:

  • Java Tricky Interview Questions
  • Java String Interview Questions
コメントを残す 0

Your email address will not be published. Required fields are marked *