Javaパフォーマンス最適化とコアコンセプトの徹底解説

文字列操作のパフォーマンス最適化

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)で根本的に設計が異なります。

特性ElementGroupKeyValueMap
データ構造単一要素の集合キー/値のペア
主な実装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で明示的な指定が必要です。コンストラクタ注入が推奨されるのは、不変性確保とテスト容易性のためです。

タグ: java-core collection-framework mysql-indexing rest-api-design spring-mvc

6月8日 20:21 投稿