Java言語の基本概念
オブジェクト指向の三大原則(カプセル化、継承、多相性)について説明してください。
カプセル化は、データとその操作メソッドをクラス内にまとめて内部状態を隠蔽し、外部からは制御されたインターフェース経由でのみアクセス可能にする仕組みです。継承は、既存クラス(スーパークラス)のフィールドやメソッドを新たなクラス(サブクラス)が引き継ぐことでコードの再利用を促進します。多相性は、同一のメソッド呼び出しに対して、実行時にオブジェクトの実際の型に応じて異なる動作を実現する機能で、主にメソッドのオーバーライドによって達成されます。
Javaのプリミティブ型とそのメモリ使用量を挙げてください。
Javaには8つのプリミティブ型があります:
- 整数型:byte(1バイト)、short(2バイト)、int(4バイト)、long(8バイト)
- 浮動小数点型:float(4バイト)、double(8バイト)
- 文字型:char(UTF-16エンコーディングで2バイト)
- 論理型:boolean(JVM実装依存だが、通常1バイト)
String、StringBuilder、StringBufferの違いは何ですか?
Stringは不変(immutable)であり、文字列操作のたびに新しいインスタンスが生成されるためパフォーマンスに影響します。StringBuilderとStringBufferは可変(mutable)で、内部バッファを直接操作します。両者の違いはスレッド安全性にあり、StringBufferはsynchronizedによりスレッドセーフですが、StringBuilderは非同期処理向けに高速です。
自動ボクシングとアンボクシングとは?
自動ボクシングはプリミティブ型から対応するラッパークラスへの自動変換(例:int → Integer)、アンボクシングはその逆(例:Integer → int)です。以下に例を示します:
// ボクシング
Integer value = 42;
// アンボクシング
int primitive = value;
Stringの内容比較にはどのようにすればよいですか?
== 演算子は参照の同一性を比較するため、文字列の内容比較にはequals()メソッドを使用します。例:
String a = "test";
String b = new String("test");
if (a.equals(b)) {
System.out.println("内容一致");
}
コレクションフレームワーク
HashMapとTreeMapの主な違いは何ですか?
HashMapはハッシュテーブルに基づき、キーの順序を保証しませんが、平均O(1)の高速な操作を提供します。一方、TreeMapは赤黒木を用いてキーをソート順に保持し、操作コストはO(log n)です。TreeMapはComparableまたはComparatorによる順序付けをサポートします。
ArrayListとVectorの違いを説明してください。
両者は配列ベースのList実装ですが、Vectorはすべてのメソッドがsynchronizedされておりスレッドセーフです。これに対し、ArrayListは非同期処理向けに設計され、パフォーマンスが優れていますがスレッド安全ではありません。
スレッドセーフなListをどう実現しますか?
Collections.synchronizedList()を使用してラップします:
List<String> rawList = new ArrayList<>();
List<String> safeList = Collections.synchronizedList(rawList);
HashSetが重複を防ぐ仕組みを説明してください。
HashSetは内部でHashMapを利用し、要素をキーとして格納します。追加時にhashCode()でバケット位置を決定し、equals()で既存要素との等価性を確認します。両方のメソッドが適切に実装されていることが重複防止の鍵です。
IteratorとListIteratorの違いは何ですか?
IteratorはCollection全般で使える単方向イテレータ(hasNext(), next(), remove())。ListIteratorはList専用で双方向走査(previous(), hasPrevious())や要素の追加・更新(add(), set())も可能です。
並行処理とマルチスレッド
Javaでスレッドを作成する方法を挙げてください。
主に以下の3通りがあります:
1. Threadクラスを継承しrun()をオーバーライド
2. Runnableインタフェースを実装し、Threadコンストラクタに渡す
3. Callableインタフェースを実装し、FutureTask経由で結果を取得可能にする(call()メソッドは戻り値と例外をサポート)
スレッドセーフとは何か、またその実現方法を述べてください。
スレッドセーフとは、複数スレッドが共有リソースにアクセスしても整合性が保たれる状態を指します。実現手段には、synchronizedキーワードによる排他制御、volatile変数、java.util.concurrentパッケージの原子的クラス(AtomicIntegerなど)、ロック機構(ReentrantLock)、あるいは不変オブジェクトの利用などが含まれます。