紹介
Javaのプログラミングの役割の面接を受ける場合、おそらくあなたのコーディングスキルがテストされるでしょう。Javaの初心者でも、エキスパートプログラマでも、この記事では、準備を支援するための一般的なJavaの面接の質問と回答を提供します。
1. Javaで文字列を逆にする方法は?
String
クラスにはreverse()
ユーティリティメソッドはありません。しかし、文字列から文字配列を作成し、それを末尾から先頭に向かって反復処理することができます。文字を文字列ビルダーに追加し、最後に逆さまにした文字列を返すことができます。
次の例コードは、文字列を逆にする1つの方法を示しています:
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();
}
}
メソッド内のnull
チェックを追加し、文字を追加するためにStringBuilder
を使用するとボーナスポイントがもらえます。Javaのインデックスは0から始まるため、for
ループではchars.length - 1
から開始する必要があります。
2. 2つの数をJavaでサード変数を使用せずに入れ替える方法は?
サード変数を使用せずに数値を入れ替えるには、次の3つのステップがあり、コードでより視覚的に理解できます:
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);
}
}
出力には、整数値が入れ替えられていることが示されています:
Outputa 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].*");
}
}
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
に対して、2 から √N
(N の平方根)までの範囲に素数 M
が存在し、それが均等に割り切れる場合、N
は素数ではありません。
Java プログラムを作成して、再帰を使用してフィボナッチ数列を出力します。
A Fibonacci sequence is one in which each number is the sum of the two previous numbers. In this example, the sequence begins with 0
and 1
. The following example code shows how to use a for
loop to print a Fibonacci sequence:
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);
}
}
Output0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
また、再帰を使用してフィボナッチ数列を出力することもできます。フィボナッチ数は、前の2つの数をシーケンスに加えることで生成されます:
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) + " ");
}
}
}
OutputA 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() // 高速処理のための並行ストリーム
.anyMatch(x -> x % 2 != 0); // 条件に一致する要素が見つかったらすぐに戻ります
}
整数が奇数かどうかを判定する数学の詳細については、Wikipediaのモジュロ演算を参照してください。
7. Javaで文字列が回文かどうかを確認する方法は?
A palindrome string is the same string backwards or forwards. To check for a palindrome, you can reverse the input string and check if the result is equal to the input. The following example code shows how to use the String charAt(int index)
method to check for palindrome strings:
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()
メソッドを使用して文字列からスペースを削除する1つの方法を示しています:
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);
String
は不変なので、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つ以上のスレッドが関与する場合に発生します。次の例コードは、デッドロックシナリオを作成します:
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でのデッドロックの詳細については、Javaでのデッドロックを参照してください。
12. Javaで整数の階乗を見つける方法は?
整数の階乗は、与えられた数までのすべての数を掛け合わせて計算されます:
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で連結リストを逆にする方法は?
LinkedList descendingIterator()
は、要素を逆の順序で反復するイテレータを返します。次の例コードは、このイテレータを使用して要素が逆順にリストされた新しい連結リストを作成する方法を示しています:
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でバイナリ検索を実装する方法は?
配列要素はバイナリ検索を実装するためにソートされている必要があります。バイナリ検索アルゴリズムは次の条件に基づいています:
- キーが中央要素よりも小さい場合、配列の前半のみで検索する必要があります。
- キーが中央要素よりも大きい場合、配列の後半のみで検索する必要があります。
- キーが配列の中央要素と等しい場合、検索が終了します。
- 最後に、キーが配列全体に見つからない場合、
-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プログラムを記述します。
マージソートは、最も効率的なソートアルゴリズムの1つです。それは「分割して征服する」原則に基づいています。リストをいくつかのサブリストに分割し、各サブリストが単一の要素で構成されるまで分割し、その後、それらのサブリストをソートされたリストになるようにマージするアイデアに基づいています。次の例コードは、マージソートを使用する方法の一例を示しています。
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. 2つの配列が同じ要素を含んでいるかどうかを確認する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 (uniqueElements1.size() != uniqueElements2.size()) return false;
for (Object obj : uniqueElements1) {
// 両方に存在しない要素ですか?
if (!uniqueElements2.contains(obj)) return false;
}
return true;
}
}
Outputtrue
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番目に大きな値を取得することができます。ただし、ソートは高コストな操作です。また、1つの反復で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);
// ファイルを行ごとに読み取る
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つのリストをマージする方法は?
次の例コードは、addAll()
メソッドを使用してJavaで複数のリストをマージする方法を示しています:
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<>();
// エントリーセットを取得
Set<Entry<String, Integer>> entrySet = scores.entrySet();
System.out.println(entrySet);
// セットは順序がないため、リストを作成
List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
System.out.println(entryList);
// 値でリストをソート
entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
System.out.println(entryList);
// 新しいハッシュマップにデータを追加
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で文字列から文字を削除する方法を参照してください。
26. 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"文字列がプールに作成され、その参照がs1に割り当てられました
String s2 = s1; //s2も同じ参照をプール内の"Java"に持っています
System.out.println(s1 == s2); //s1とs2が同じ参照を持っていることの証明
s1 = "Python";
//上記の場合、s1の値が変更されたため、Stringが不変である方法は?
//上記の場合、新しいString "Python"がプールに作成されました
//s1は今、プール内の新しいStringを参照しています
//しかし、元のString "Java"は変更されず、プール内に残っています
//s2は依然としてプール内の元のString "Java"を参照しています
//s1とs2が異なる参照を持っていることの証明
System.out.println(s1 == s2);
System.out.println(s2);
//元のString値が変更されていないことを示す "Java"を出力し、したがってStringが不変であることをサポート
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 { // コンパイルされません
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以降では、次の例に示すように、単一のcatchブロックで複数の例外をキャッチすることもできます。すべてのcatchブロックで同じコードがある場合に便利です。
public static void foo(int x) throws IllegalArgumentException, NullPointerException {
// いくつかのコード
}
public static void main(String[] args) {
try {
foo(10);
} catch (IllegalArgumentException | NullPointerException e) {
System.out.println(e.getMessage());
}
}
31. 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());
}
}
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");
}
}
次のコマンドをターミナルで使用してコンパイルできます:
- javac Test.java
クラスを実行するには、次のコマンドをターミナルで使用します:
- java Test
最近のリリースでは、java
コマンドはクラスファイルが存在しない場合にもプログラムをコンパイルします。クラスがcom.example
のようなパッケージにある場合、com/example
フォルダー内にある必要があります。コンパイルおよび実行するコマンドは次のようになります:
- java com/example/Test.java
クラスが追加のJARファイルをコンパイルおよび実行に必要とする場合、java -cp
オプションを使用できます。例えば:
- java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java
36. Javaで列挙型を作成する方法は?
以下の例コードは基本的な列挙型を作成する方法を示しています:
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. default
およびstatic
メソッドを持つインタフェースをどのように書きますか?
Java 8では、インターフェースにデフォルトおよび静的メソッドが導入されました。これにより、インターフェースと抽象クラスのギャップが埋まりました。次の例コードは、default
およびstatic
メソッドを使用してインターフェースを記述する方法の一例を示しています:
public interface Interface1 {
//通常の抽象メソッド
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 インターフェースの変更でdefault
およびstatic
メソッドについて学習してください。
39. 関数型インターフェースを作成するにはどうすればよいですか?
正確に1つの抽象メソッドを持つインターフェースは、関数型インターフェースと呼ばれます。関数型インターフェースの主な利点は、ラムダ式を使用してそれらをインスタンス化し、かさばる匿名クラスの実装を回避できることです。@FunctionalInterface
アノテーションは、関数型インターフェースを示します。次の例コードに示すように:
@FunctionalInterface
interface Foo {
void test();
}
40. Javaでラムダ式を使用する例を示してください。
Runnable
は関数インターフェースの優れた例です。ラムダ式を使用して実行可能なものを作成できます。次の例コードに示すように:
Runnable r1 = () -> System.out.println("My Runnable");
41. Javaでのオーバーローディングとオーバーライドの例を示してください。
クラスに同じ名前のメソッドが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.-49. 出力を推測してください
次のコード断片の出力を推測してみてください。
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
Output
false
与えられた文の出力はfalse
です。なぜなら、+
演算子の方が==
演算子よりも優先順位が高いため、与えられた式は“s1 == s2 is:abc” == “abc”
と評価され、false
になるからです。
String s3 = "JournalDev";
int start = 1;
char end = 5;
System.out.println(s3.substring(start, end));
Output
ourn
与いわれた文の出力はourn
です。最初の文字は自動的にint
に型変換されます。その後、最初の文字のインデックスが0であるため、o
から始まり、n
まで印刷されます。 String substring
メソッドは、インデックスstart
で始まり、インデックスend - 1
の文字まで延長される部分文字列を作成します。
HashSet shortSet = new HashSet();
for (short i = 0; i < 100; i++) {
shortSet.add(i);
shortSet.remove(i - 1);
}
System.out.println(shortSet.size());
Output
100
shortSet
のサイズは100
です。 Javaのオートボクシング機能により、プリミティブ型short
を持つ式i
がShort
オブジェクトに変換されます。同様に、プリミティブ型int
を持つ式i - 1
はInteger
オブジェクトにオートボクシングされます。 HashSet
にInteger
オブジェクトがないため、何も削除されず、サイズは100
になります。
try {
if (flag) {
while (true) {
}
} else {
System.exit(1);
}
} finally {
System.out.println("In Finally");
}
Output
出力はありません。このコードは、フラグがtrue
の場合に無限ループになり、フラグがfalse
の場合にプログラムが終了します。 finally
ブロックには到達しません。
String str = null;
String str1="abc";
System.out.println(str1.equals("abc") | str.equals(null));
Output
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "<local1>" is null
指定されたプリント文はjava.lang.NullPointerException
をスローします。なぜなら、OR
論理演算子は結果を返す前に両方のリテラルを評価するからです。 str
がnull
であるため、.equals()
メソッドは例外をスローします。常に左から右にリテラル値を評価するような短絡論理演算子、例えば||
や&&
を使用することが推奨されます。 この場合、最初のリテラルがtrue
を返すため、2番目のリテラルの評価はスキップされます。
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
Output
abc
x.concat(y)
は新しい文字列を作成しますが、x
に割り当てられていないため、x
の値は変更されません。
public class MathTest {
public void main(String[] args) {
int x = 10 * 10 - 10;
System.out.println(x);
}
}
Output
Error: Main method is not static in class MathTest, please define the main method as:
public static void main(String[] args)
数学演算子の実行順序についての質問のように見えるかもしれませんが、実際の質問はmainメソッドがstatic
で宣言されていないことに気付くことです。
public class Test {
public static void main(String[] args) {
try {
throw new IOException("Hello");
} catch(IOException | Exception e) {
System.out.println(e.getMessage());
}
}
}
Output
Test.java:5: error: cannot find symbol
throw new IOException("Hello");
^
symbol: class IOException
location: class Test
Test.java:6: error: cannot find symbol
}catch(IOException | Exception e) {
^
symbol: class IOException
location: class Test
2 errors
このコードはコンパイル時エラーを引き起こします。例外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);
}
}
Answers
- パッケージ名にハイフンを含めることはできません。
- クラス名にはスペースを含めることはできません。
- mainメソッドが
public
ではないため、実行されません。 - mainメソッドの引数にサイズを指定するべきではありません。
- 文字列定義にセミコロンが抜けています。
結論
この50のJavaプログラミングインタビューの質問集には、初心者から上級者までの質問が含まれており、面接の準備に役立ちます。
おすすめの読み物:
Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions