文字列操作のパフォーマンス最適化
Javaにおける文字列操作では、ImmutableText(String相当)とMutableTextBuffer(StringBuffer/Builder相当)の選択がパフォーマンスに直結します。
ImmutableTextは内部状態が変更不能なため、連結操作ごとに新しいオブジェクトが生成されます。大量の文字列操作ではメモリ効率が悪化します。
var baseText = new ImmutableText("initial");
baseText = baseText.concat("modified"); // 新規オブジェクト生成
対してMutableTextBufferは内部バッファを再利用し、オブジェクト生成を回避します。ThreadSafeBuffer(StringBuffer相当)はスレッドセーフですが、SingleThreadBuffer(StringBuilder相当)はシングルスレッド専用で高速です。
var buffer = new SingleThreadBuffer("initial");
buffer.append("modified"); // 同一オブジェクトを変更
選択基準:
- 小規模操作:ImmutableText
- マルチスレッド環境:ThreadSafeBuffer
- シングルスレッド大量処理:SingleThreadBuffer
コレクションフレームワークの内部構造
JavaコレクションはElementGroup(Collection)とKeyValueMap(Map)で根本的に設計が異なります。
| 特性 | ElementGroup | KeyValueMap |
|---|---|---|
| データ構造 | 単一要素の集合 | キー/値のペア |
| 主な実装 | DynamicArray(ArrayList) LinkedChain(LinkedList) | HashBasedMap(HashMap) |
| 重複許可 | DynamicArray:可 UniqueSet:不可 | 値は可/キーは不可 |
DynamicArrayは配列ベースのため要素アクセスが高速ですが、LinkedChainはノード連結構造で挿入/削除に優れます。スレッドセーフが必要な場合はSynchronizedListを使用します。
HTTPメソッドのセマンティクス
RESTful設計においてメソッドの意味論が重要です:
- RETRIEVE(GET相当):リソース取得。冪等性あり。URLパラメータで条件指定
- REPLACE(PUT相当):完全置換。冪等性あり。既存リソースの上書き
- CREATE(POST相当):新規作成。冪等性なし。リクエストボディにデータ含む
- REMOVE(DELETE相当):削除。冪等性あり
セキュリティ上の注意:RETRIEVEリクエストのパラメータはURLに露出するため、機密情報の伝送に不適です。
MySQLインデックスの戦略的設計
インデックスの物理構造は主に2種類:
Bツリーインデックス:範囲検索やソートに最適。左最適則を遵守する必要があります。例:(user_id, name)インデックスではuser_idを含むクエリでのみ有効です。
ハッシュインデックス:等値比較に特化。メモリエンジンでのみ使用可能。範囲検索や部分一致はサポートしません。
複合インデックスの設計ポイント:
- 高選択性のカラムを先頭に配置
- WHERE句で使用されるカラムを優先
- OR条件はインデックス効果を低下させる
フルテキスト検索が必要な場合はFULLTEXTインデックスを使用しますが、大量データでは構築コストが高くなります。
オブジェクト比較の深層メカニズム
Javaの比較操作はデータ型によって振る舞いが異なります:
- プリミティブ型:
==で値比較 - 参照型:
==はメモリアドレス比較 equals():デフォルトでアドレス比較だが、Text(String)等のクラスでオーバーライドされ内容比較に
var textA = new Text("content");
var textB = new Text("content");
System.out.println(textA == textB); // false(別インスタンス)
System.out.println(textA.equals(textB)); // true(内容一致)
カスタムクラスでequals()を使用する場合は、hashCode()のオーバーライドが必須です。
Springフレームワークのコントローラ設計
レスポンス形式に応じたアノテーション選択:
@WebController:JSP/HTMLレンダリング。ビュー解決器が必要@RestController:JSON/XML直接出力。@ResponseBodyが暗黙的
フロントエンド分離アーキテクチャでは@RestControllerが標準ですが、従来のサーバーサイドレンダリングには@WebControllerを使用します。
MyBatisのSQLインジェクション対策
パラメータバインド方法の違い:
#{}:プリペアドステートメント使用。値は自動クォートされ安全${}:文字列置換。SQLインジェクション脆弱性あり
// 安全な例
SELECT * FROM users WHERE id = #{userId}
// 危険な例(絶対避ける)
SELECT * FROM users WHERE id = ${userId}
動的ソート等で${}が必須の場合は、入力値のホワイトリスト検証が不可欠です。
Springの依存性注入メカニズム
コンポーネント検索戦略の違い:
@Autowired:型ベース検索 → 名前ベース絞り込み@Resource:名前ベース検索 → 型ベースフォールバック
複数実装クラスが存在する場合は、@Qualifierで明示的な指定が必要です。コンストラクタ注入が推奨されるのは、不変性確保とテスト容易性のためです。