この記事は 2026 年 9 月 24 日に投稿しました。

目次
- はじめに
- DartのLinkedHashMapでキーの同一性を判定する
- identityコンストラクタの基本的な使い方
- 同じ内容でも異なるオブジェクトをキーにする
- identityコンストラクタを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのLinkedHashMapで利用できるidentityコンストラクタについてです。
LinkedHashMap.identity()を使用すると、キーの等価性ではなく、オブジェクトが同一インスタンスかどうかでキーを判定するLinkedHashMapを作成できます。
通常のMapでは同じと判定されるオブジェクトを、別々のキーとして管理したい場合に便利です。
2. DartのLinkedHashMapでキーの同一性を判定する
DartのLinkedHashMapは、キーを追加した順序で反復できるMapの実装です。
通常のLinkedHashMapは、キーの==とhashCodeを使ってキーの等価性を判定します。
一方、identityコンストラクタで作成したMapは、キーが同じオブジェクトであるかをidentical()で判定します。
形式は以下になります。
LinkedHashMap<K, V>.identity()
Kにはキーの型、Vには値の型を指定します。
引数は受け取らず、空のLinkedHashMapが作成されます。
import 'dart:collection'; void main() { final map = LinkedHashMap<Object, String>.identity(); final key = Object(); map[key] = '値'; print(map[key]); // 値 }
3. identityコンストラクタの基本的な使い方
LinkedHashMap<K, V>.identity()を呼び出すと、キーの同一性を使って比較する空のMapを作成できます。
final firstKey = Object(); final secondKey = Object(); final map = LinkedHashMap<Object, int>.identity(); map[firstKey] = 10; map[secondKey] = 20; print(map.length); // 2
作成後のMapには、通常のLinkedHashMapと同じように要素を追加・取得できます。
また、要素を追加した順序も保持されます。
4. 同じ内容でも異なるオブジェクトをキーにする
==が同じでも別のキーとして扱う
identityコンストラクタの特徴を確認するため、==とhashCodeを上書きしたクラスを使用します。
class UserKey { const UserKey(this.id); final int id; @override bool operator ==(Object other) => other is UserKey && other.id == id; @override int get hashCode => id.hashCode; } void main() { final first = UserKey(1); final second = UserKey(1); final map = LinkedHashMap<UserKey, String>.identity(); map[first] = '最初のオブジェクト'; map[second] = '別のオブジェクト'; print(first == second); // true print(identical(first, second)); // false print(map.length); // 2 }
firstとsecondは==では同じですが、別々に作成されたオブジェクトです。
そのため、identity Mapでは2つのキーとして登録されます。
通常のLinkedHashMapとの違い
通常のLinkedHashMapでは、==とhashCodeが同じキーを登録すると、既存の値が更新されます。
identity Mapは、オブジェクトのインスタンスごとに状態を紐付けたい場合に利用できます。
5. identityコンストラクタを使用する場合の注意点
dart:collectionのimportが必要
LinkedHashMapはdart:collectionで定義されています。
使用するファイルの先頭にimportを記述してください。
import 'dart:collection';
キーの同一性で判定される
identity Mapでは、キーの==やhashCodeが同じでも、別のインスタンスであれば別のキーになります。
同じオブジェクトを使わないと、登録した値を取得できません。
final firstKey = Object(); final secondKey = Object(); final map = LinkedHashMap<Object, String>.identity(); map[firstKey] = '値'; print(map[firstKey]); // 値 print(map[secondKey]); // null
値の内容に基づいてキーを比較する場合は通常のLinkedHashMapを使用し、オブジェクトのインスタンスそのものを識別したい場合にLinkedHashMap.identity()を使用します。
リファレンス
6. おわりに
DartのLinkedHashMapでidentityコンストラクタを使用すると、キーの==やhashCodeではなく、オブジェクトの同一性でキーを判定するMapを作成できます。
同じ内容を持つオブジェクトでも、異なるインスタンスであれば別のキーとして管理できます。
オブジェクトごとの状態を保持したい場合など、キーの同一性を重視する用途ではLinkedHashMap.identity()を利用してみてください。
私が技術者として所属している ニューラルでは、組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
また、iOS(Swift/SwiftUI)やWindows(C#)をはじめとしたアプリケーション開発、Webシステムの開発などにも対応しています。
ソフトウェア開発に関するご相談や、一緒に開発に取り組んでいただける技術者の募集については、お気軽にお問い合わせください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688