ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Java Map の基本
Java で連想配列 (キーと値のペア) を扱うには java.util.Map インタフェースを使います。具体的な実装クラスをいくつか選びます:
import java.util.*;
// 1. HashMap (順序なし、最速、一般用途)
Map<String, Integer> map = new HashMap<>();
map.put("apple", 100);
map.put("banana", 200);
map.put("cherry", 300);
System.out.println(map.get("apple")); // 100
System.out.println(map.size()); // 3
// 2. LinkedHashMap (挿入順を保持)
Map<String, Integer> linked = new LinkedHashMap<>();
linked.put("a", 1);
linked.put("b", 2);
linked.put("c", 3);
// 反復順: a, b, c (常に挿入順)
// 3. TreeMap (キーでソート)
Map<String, Integer> tree = new TreeMap<>();
tree.put("cherry", 3);
tree.put("apple", 1);
tree.put("banana", 2);
// 反復順: apple, banana, cherry (キー昇順)
// 4. Map.of (Java 9+, 不変)
Map<String, Integer> immut = Map.of("a", 1, "b", 2, "c", 3);
// immut.put("d", 4); // UnsupportedOperationException
// 10 ペア以上は Map.ofEntries
Map<String, Integer> many = Map.ofEntries(
Map.entry("a", 1),
Map.entry("b", 2),
Map.entry("c", 3)
);
主な操作メソッド
| メソッド | 動作 | 戻り値 |
|---|---|---|
put(k, v) | キーと値を追加/上書き | 旧値 (なければ null) |
get(k) | キーで値取得 | 値 (なければ null) |
getOrDefault(k, def) | 取得 or デフォルト | 値 or def |
remove(k) | キーで削除 | 削除した値 (なければ null) |
containsKey(k) | キー存在チェック | boolean |
containsValue(v) | 値存在チェック (遅い: O(n)) | boolean |
size() | 件数 | int |
isEmpty() | 空チェック | boolean |
clear() | 全削除 | void |
keySet() | キーの Set | Set<K> |
values() | 値の Collection | Collection<V> |
entrySet() | エントリの Set | Set<Map.Entry<K,V>> |
putIfAbsent(k, v) | 無いときだけ追加 | 旧値 |
compute(k, fn) | 関数で値計算更新 | 新値 |
merge(k, v, fn) | あればマージ関数 | 新値 |
反復処理
Map<String, Integer> map = new HashMap<>();
map.put("apple", 100);
map.put("banana", 200);
// 1. entrySet (推奨: キーと値両方)
for (Map.Entry<String, Integer> e : map.entrySet()) {
System.out.println(e.getKey() + " = " + e.getValue());
}
// 2. forEach (Java 8+, ラムダ)
map.forEach((key, val) -> System.out.println(key + " = " + val));
// 3. keySet (キーだけ)
for (String key : map.keySet()) {
System.out.println(key);
}
// 4. values (値だけ)
for (Integer val : map.values()) {
System.out.println(val);
}
// 5. Stream API
map.entrySet().stream()
.filter(e -> e.getValue() > 100)
.forEach(e -> System.out.println(e.getKey()));
compute / merge / putIfAbsent パターン
// 単語の出現回数カウント (定番パターン)
Map<String, Integer> count = new HashMap<>();
String[] words = {"apple", "banana", "apple", "cherry", "apple"};
// ❌ 冗長
for (String w : words) {
if (count.containsKey(w)) {
count.put(w, count.get(w) + 1);
} else {
count.put(w, 1);
}
}
// ✅ merge (推奨)
for (String w : words) {
count.merge(w, 1, Integer::sum);
}
// ✅ compute も使える
for (String w : words) {
count.compute(w, (k, v) -> v == null ? 1 : v + 1);
}
// 配列を値にする (グルーピング)
Map<String, List<String>> grouped = new HashMap<>();
for (String item : List.of("a1", "b1", "a2", "b2", "a3")) {
String key = item.substring(0, 1);
grouped.computeIfAbsent(key, k -> new ArrayList<>()).add(item);
}
// {a=[a1,a2,a3], b=[b1,b2]}
// Stream.collect なら 1 行
var byPrefix = Stream.of("a1", "b1", "a2", "b2", "a3")
.collect(Collectors.groupingBy(s -> s.substring(0, 1)));
実装クラスの選び方
| 用途 | 推奨実装 | 計算量 (get/put) |
|---|---|---|
| 一般用途 | HashMap | O(1) |
| 挿入順を保ちたい | LinkedHashMap | O(1) |
| LRU キャッシュ | LinkedHashMap (accessOrder=true) | O(1) |
| キーでソート | TreeMap | O(log n) |
| 範囲検索 | TreeMap (subMap/headMap/tailMap) | O(log n) |
| 並行処理 | ConcurrentHashMap | O(1) 並列性高い |
| 不変 (定数 Map) | Map.of / Map.copyOf | O(1) |
ConcurrentHashMap (スレッドセーフ)
import java.util.concurrent.ConcurrentHashMap;
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// 通常の Map と同じ API
map.put("a", 1);
map.put("b", 2);
// 並列カウントは atomic に
map.merge("a", 1, Integer::sum); // スレッドセーフに +1
// 並列 forEach
map.forEachEntry(1, e -> System.out.println(e.getKey() + "=" + e.getValue()));
// compute は atomic
map.compute("counter", (k, v) -> v == null ? 1 : v + 1);
// ⚠️ HashMap を複数スレッドから put すると、まれに無限ループになることがある (Java 7 以前)
// → 並列ならば必ず ConcurrentHashMap
null キー / null 値の扱い
| 実装 | null キー | null 値 |
|---|---|---|
| HashMap | 1 個まで OK | OK |
| LinkedHashMap | 1 個まで OK | OK |
| TreeMap | NG (NullPointerException) | OK |
| ConcurrentHashMap | NG | NG |
| Map.of | NG | NG |
不変 Map と防御コピー
// 不変 Map (Java 9+)
Map<String, Integer> immut = Map.of("a", 1, "b", 2);
// immut.put("c", 3); // UnsupportedOperationException
// 既存 Map を不変にコピー (Java 10+)
Map<String, Integer> copy = Map.copyOf(originalMap);
// Collections.unmodifiableMap (ビュー、元が変わると見える)
Map<String, Integer> view = Collections.unmodifiableMap(originalMap);
// Stream で不変 Map 構築
Map<String, Integer> built = Stream.of("apple", "banana")
.collect(Collectors.toUnmodifiableMap(
s -> s,
String::length
));
FAQ
Q: map.get("x") が null を返す → キーが無い? 値が null?
A: 区別できないので containsKey() を併用、または getOrDefault でデフォルト値を返す設計に。
Q: HashMap の初期容量は指定したほうがいい?
A: 大量データ (1 万件以上) を入れると分かっているなら new HashMap<>(expectedSize / 0.75 + 1) でリハッシュを防げます。
Q: HashMap と Hashtable の違いは?
A: Hashtable は古い同期版で、現在は使わない。スレッドセーフが必要なら ConcurrentHashMap を使うこと。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?