モジュール java.base
パッケージ java.util

クラスHashtable<K,​V>

  • 型パラメータ:
    K - このマップで保持されるキーの型
    V - マップされる値の型
    すべての実装されたインタフェース:
    Serializable, Cloneable, Map<K,​V>
    直系の既知のサブクラス:
    Properties, UIDefaults

    public class Hashtable<K,​V>
    extends Dictionary<K,​V>
    implements Map<K,​V>, Cloneable, Serializable
    このクラスは、ハッシュ表(キーを値にマップ)を実装します。 nullオブジェクト以外であれば、どのオブジェクトでもキーや値に使用することができます。

    ハッシュ表にオブジェクトを格納したり、そこから取り出したりするには、キーとして使用するオブジェクトに、hashCodeメソッドとequalsメソッドが実装されていなければなりません。

    Hashtableのインスタンスには、その性能に影響を与える2つのパラメータである初期容量および負荷係数があります。 容量はハッシュ表のバケット数であり、初期容量は単純にハッシュ表が作成された時点での容量です。 ハッシュ表はオープンであることに注意してください。ハッシュの衝突という、1つのバケットが複数のエントリを格納する現象があり、その場合それらのエントリはシーケンシャル・サーチされることになります。 負荷係数は、ハッシュ表がどの程度いっぱいになると、その容量が自動的に増加されるかの基準です。 初期容量と負荷係数パラメータは、実装のヒントに過ぎません。 rehashメソッドがいつ呼び出されるか、および呼び出されるかどうかは、実装により異なります。

    通常、デフォルトの負荷係数(.75)では、時間コストとスペース・コストの釣合いを取ります。 この値を大きくするとスペースのオーバーヘッドは減少しますが、エントリを参照するための時間のコストは増加し、getおよびputを含むほとんどのHashtableオペレーションが影響を受けます。

    初期容量により、浪費スペースと(時間のかかる) rehashオペレーションの需要との間の釣合いが制御されます。 初期容量が、Hashtableの格納するエントリの最大数を負荷係数で割った値より大きい場合、rehashオペレーションは起こりません ただし、初期容量を高く設定しすぎると、スペースの浪費になります。

    Hashtableに多くのエントリを入れる場合は、この表を十分に大きな容量で作成する方が、必要に応じてハッシュを自動的にやり直して表を大きくするよりも、エントリを効率的に挿入することができます。

    この例は、数値のハッシュ表を作成します。 この例では、数値の名前をキーとして使います。

       
       Hashtable<String, Integer> numbers
         = new Hashtable<String, Integer>();
       numbers.put("one", 1);
       numbers.put("two", 2);
       numbers.put("three", 3);

    数値を取り出すには、次のコードを使います。

       
       Integer n = numbers.get("two");
       if (n != null) {
         System.out.println("two = " + n);
       }

    このクラスのすべてのコレクション・ビュー・メソッドによって返されるコレクションのiteratorメソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でHashtableが構造的に変更されると、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。 Hashtable keysおよびelementsメソッドによって返される列挙型は、高速ではありません。列挙型が作成された後にいつでもHashtableが構造的に変更された場合、列挙型の結果は未定義です。

    通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。

    このクラスは、Java 2プラットフォームv1.2の時点でMapインタフェースを実装するように改良された結果、Java Collections Frameworkのメンバーとなりました。 新しいコレクションの実装とは異なり、Hashtableは同期をとります。 スレッドセーフな実装が必要ない場合は、Hashtableの代わりにHashMapを使用することをお薦めします。 スレッドセーフで高度な並列実装が必要な場合は、Hashtableの代わりにConcurrentHashMapを使用することをお薦めします。

    導入されたバージョン:
    1.0
    関連項目:
    Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, 直列化された形式
    • コンストラクタのサマリー

      コンストラクタ 
      コンストラクタ 説明
      Hashtable()
      デフォルトの初期容量(11)と負荷係数(0.75)で新規の空のハッシュ表を生成します。
      Hashtable​(int initialCapacity)
      指定された初期容量およびデフォルトの負荷係数(0.75)で新しい空のハッシュ表を生成します。
      Hashtable​(int initialCapacity, float loadFactor)
      指定された初期容量と負荷係数で新しい空のハッシュ表を生成します。
      Hashtable​(Map<? extends K,​? extends V> t)
      指定されたMapと同じマッピングで新しいハッシュ表を生成します。
    • メソッドのサマリー

      すべてのメソッド インスタンス・メソッド 具象メソッド 
      修飾子と型 メソッド 説明
      void clear()
      このハッシュ表を消去して、キーがない状態にします。
      Object clone()
      ハッシュ表のコピーを作成します。
      V compute​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
      指定されたキーと現在マップされている値に対するマッピングの計算を試みます(現在のマッピングが存在しない場合はnull)。
      V computeIfAbsent​(K key, Function<? super K,​? extends V> mappingFunction)
      指定されたキーがまだ値に関連付けられていない(またはnullにマップされている)場合、指定されたマッピング関数を使用してその値の計算を試行し、nullでない場合はそれをこのマップに入力します。
      V computeIfPresent​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
      指定されたキーの値が存在していてnull以外の場合、キーと現在マップされている値から新しいマッピングの計算を試みます。
      boolean contains​(Object value)
      指定された値にマップされているキーが、ハッシュ表にあるかどうかを判定します。
      boolean containsKey​(Object key)
      指定されたオブジェクトが、ハッシュ表のキーかどうかを判定します。
      boolean containsValue​(Object value)
      このハッシュ表が1つまたは複数のキーをこの値にマッピングする場合にtrueを返します。
      Enumeration<V> elements()
      ハッシュ表にある値のリストを返します。
      Set<Map.Entry<K,​V>> entrySet()
      このマップに含まれるマッピングのSetビューを返します。
      boolean equals​(Object o)
      Mapインタフェースでの定義に従って、指定されたObjectとこのMapを比較して等しいかどうかを判定します。
      V get​(Object key)
      指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。
      int hashCode()
      Mapインタフェースの定義に従って、このMapのハッシュ・コード値を返します。
      boolean isEmpty()
      値にマップされているキーが、ハッシュ表にあるかどうかを判定します。
      Enumeration<K> keys()
      ハッシュ表にあるキーのリストを返します。
      Set<K> keySet()
      このマップに含まれるキーのSetビューを返します。
      V merge​(K key, V value, BiFunction<? super V,​? super V,​? extends V> remappingFunction)
      指定されたキーがまだ値と関連付けられていないかnullと関連付けられている場合、指定されたnull以外の値に関連付けます。
      V put​(K key, V value)
      このハッシュ表で、指定されたkeyを指定されたvalueにマップします。
      void putAll​(Map<? extends K,​? extends V> t)
      指定したマップからこのハッシュ表にすべてのマッピングをコピーします。
      protected void rehash()
      ハッシュ表の容量を増やし、それを内部的に再編成して、エントリを調整してアクセスをより効率的にします。
      V remove​(Object key)
      キー(およびそれに対応する値)をハッシュ表から削除します。
      int size()
      ハッシュ表にあるキーの数を返します。
      String toString()
      このHashtableオブジェクトの文字列表現を、ASCII文字(カンマとスペース)で区切り、カッコで囲んだ一連のエントリの形式で返します。
      Collection<V> values()
      このマップに含まれる値のCollectionビューを返します。
    • コンストラクタの詳細

      • Hashtable

        public Hashtable​(int initialCapacity,
                         float loadFactor)
        指定された初期容量と負荷係数で新しい空のハッシュ表を生成します。
        パラメータ:
        initialCapacity - ハッシュ表の初期容量。
        loadFactor - ハッシュ表の負荷係数。
        例外:
        IllegalArgumentException - 初期容量がゼロよりも小さい場合、または負荷係数が正でない場合。
      • Hashtable

        public Hashtable​(int initialCapacity)
        指定された初期容量およびデフォルトの負荷係数(0.75)で新しい空のハッシュ表を生成します。
        パラメータ:
        initialCapacity - ハッシュ表の初期容量。
        例外:
        IllegalArgumentException - 初期容量が0よりも小さい場合。
      • Hashtable

        public Hashtable()
        デフォルトの初期容量(11)と負荷係数(0.75)で新規の空のハッシュ表を生成します。
      • Hashtable

        public Hashtable​(Map<? extends K,​? extends V> t)
        指定されたMapと同じマッピングで新しいハッシュ表を生成します。 指定されたMapのマッピングを保持するのに十分な初期容量、およびデフォルトの負荷係数(0.75)で、ハッシュ表は作成されます。
        パラメータ:
        t - マッピングがこのマップに配置されるマップ。
        例外:
        NullPointerException - 指定されたマップがnullの場合。
        導入されたバージョン:
        1.2
    • メソッドの詳細

      • size

        public int size()
        ハッシュ表にあるキーの数を返します。
        定義:
        インタフェースMap<K,​V>内のsize
        定義:
        クラスDictionary<K,​V>size
        戻り値:
        ハッシュ表にあるキーの数。
      • isEmpty

        public boolean isEmpty()
        値にマップされているキーが、ハッシュ表にあるかどうかを判定します。
        定義:
        インタフェースMap<K,​V>内のisEmpty
        定義:
        クラスDictionary<K,​V>isEmpty
        戻り値:
        値にマップされているキーがハッシュ表にない場合はtrue、ある場合はfalse
      • keys

        public Enumeration<K> keys()
        ハッシュ表にあるキーのリストを返します。 返されたオブジェクトのEnumerationメソッドを使用して、キーを順番に取得します。 ハッシュテーブルがキーの上で列挙している間に構造的に変更されている場合、列挙型の結果は未定義です。
        定義:
        クラスDictionary<K,​V>keys
        戻り値:
        ハッシュ表にあるキーのリスト。
        関連項目:
        Enumeration, elements(), keySet(), Map
      • elements

        public Enumeration<V> elements()
        ハッシュ表にある値のリストを返します。 これらの要素を順次に取り出すには、Enumerationのメソッドを使用します。 値を列挙型しながらハッシュテーブルが構造的に変更された場合、列挙型の結果は未定義です。
        定義:
        クラスDictionary<K,​V>elements
        戻り値:
        ハッシュ表にある値のリスト。
        関連項目:
        Enumeration, keys(), values(), Map
      • contains

        public boolean contains​(Object value)
        指定された値にマップされているキーが、ハッシュ表にあるかどうかを判定します。 この操作は、containsKeyメソッドよりも負荷がかかります。

        このメソッドは、機能の点でcontainsValue (コレクション・フレームワークのMapインタフェースの一部)と同じです。

        パラメータ:
        value - 検索する値
        戻り値:
        あるキーが、equalsメソッドで決められている、ハッシュ表のvalue引数にマッピングする場合はtrue、そうでない場合はfalse
        例外:
        NullPointerException - 値がnullの場合
      • containsValue

        public boolean containsValue​(Object value)
        このハッシュ表が1つまたは複数のキーをこの値にマッピングする場合にtrueを返します。

        このメソッドは、機能の点でcontains (Mapインタフェースに先行する)と同じです。

        定義:
        インタフェースMap<K,​V>内のcontainsValue
        パラメータ:
        value - ハッシュ表にあるかどうかを判定される値
        戻り値:
        このマップが1つまたは複数のキーを指定された値にマッピングしている場合はtrue
        例外:
        NullPointerException - 値がnullの場合
        導入されたバージョン:
        1.2
      • containsKey

        public boolean containsKey​(Object key)
        指定されたオブジェクトが、ハッシュ表のキーかどうかを判定します。
        定義:
        インタフェースMap<K,​V>内のcontainsKey
        パラメータ:
        key - 使用可能なキー
        戻り値:
        equalsメソッドで決められているように、指定されたオブジェクトがこのハッシュ表のキーである場合はtrue、そうでない場合はfalse
        例外:
        NullPointerException - キーがnullの場合
        関連項目:
        contains(Object)
      • get

        public V get​(Object key)
        指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合はnullを返します。

        つまり、このメソッドは、(key.equals(k))となるキーkから値vへのマッピングがこのマップに含まれている場合はvを返し、それ以外の場合はnullを返します。 このようなマッピングは1つのみ存在できます。

        定義:
        インタフェースMap<K,​V>内のget
        定義:
        クラスDictionary<K,​V>get
        パラメータ:
        key - 関連付けられた値が返される鍵
        戻り値:
        指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合はnull
        例外:
        NullPointerException - 指定されたキーがnullである場合
        関連項目:
        put(Object, Object)
      • rehash

        protected void rehash()
        ハッシュ表の容量を増やし、それを内部的に再編成して、エントリを調整してアクセスをより効率的にします。 ハッシュ表にあるキーの数がハッシュ表の容量と負荷係数を超えると、このメソッドが自動的に呼び出されます。
      • put

        public V put​(K key,
                     V value)
        このハッシュ表で、指定されたkeyを指定されたvalueにマップします。 キーや値はnullにすることはできません。

        valueを取得するには、元のkeyに等しいkeyを指定してgetメソッドを呼び出します。

        定義:
        インタフェースMap<K,​V>内のput
        定義:
        クラスDictionary<K,​V>put
        パラメータ:
        key - ハッシュ表キー
        value - 値
        戻り値:
        ハッシュ表の指定されたキーの前の値。それがない場合はnull
        例外:
        NullPointerExceptionキーまたは値がnullの場合
        関連項目:
        Object.equals(Object), get(Object)
      • remove

        public V remove​(Object key)
        キー(およびそれに対応する値)をハッシュ表から削除します。 そのキーがハッシュ表にない場合は、何も行いません。
        定義:
        インタフェースMap<K,​V>内のremove
        定義:
        クラスDictionary<K,​V>remove
        パラメータ:
        key - 削除するキー
        戻り値:
        ハッシュ表でそのキーにマップされている値。マップされている値がない場合はnull
        例外:
        NullPointerException - キーがnullの場合
      • putAll

        public void putAll​(Map<? extends K,​? extends V> t)
        指定したマップからこのハッシュ表にすべてのマッピングをコピーします。 これにより、ハッシュ表が指定されたマップ内に現在あるキーのすべてに対して持っていたマッピングが置き換えられます。
        定義:
        インタフェースMap<K,​V>内のputAll
        パラメータ:
        t - このマップに格納されるマッピング
        例外:
        NullPointerException - 指定されたマップがnullの場合
        導入されたバージョン:
        1.2
      • clear

        public void clear()
        このハッシュ表を消去して、キーがない状態にします。
        定義:
        インタフェースMap<K,​V>内のclear
      • clone

        public Object clone()
        ハッシュ表のコピーを作成します。 ハッシュ表の構造自体はすべてコピーされますが、キーおよび値は複製されません。 これは、比較的負担の大きい操作です。
        オーバーライド:
        clone、クラス: Object
        戻り値:
        ハッシュ表の複製
        関連項目:
        Cloneable
      • toString

        public String toString()
        このHashtableオブジェクトの文字列表現を、ASCII文字(カンマとスペース)で区切り、カッコで囲んだ一連のエントリの形式で返します。 各エントリはキー、等符号=、および関連した要素として描画され、toStringメソッドはキーおよび要素を文字列に変換するために使用されます。
        オーバーライド:
        toString 、クラス:  Object
        戻り値:
        このハッシュ表の文字列表現
      • keySet

        public Set<K> keySet()
        このマップに含まれるキーのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されていません(イテレータ自身のremoveオペレーションを除く)。 セットは要素の削除をサポートします。Iterator.removeSet.removeremoveAllretainAll、およびclearオペレーションで対応するマッピングをマップから削除します。 addまたはaddAll操作はサポートされていません。
        定義:
        インタフェースMap<K,​V>内のkeySet
        戻り値:
        マップに含まれているキーのセット・ビュー
        導入されたバージョン:
        1.2
      • entrySet

        public Set<Map.Entry<K,​V>> entrySet()
        このマップに含まれるマッピングのSetビューを返します。 セットはマップと連動しているので、マップに対する変更はセットに反映され、また、セットに対する変更はマップに反映されます。 セットの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーション、またはイテレータにより返されるマップ・エントリに対するsetValueオペレーションを除く)。 セットは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.removeSet.removeremoveAllretainAll、およびclearオペレーションを通して行います。 addまたはaddAll操作はサポートされていません。
        定義:
        インタフェースMap<K,​V>内のentrySet
        戻り値:
        マップ内に保持されているマッピングのセット・ビュー
        導入されたバージョン:
        1.2
      • values

        public Collection<V> values()
        このマップに含まれる値のCollectionビューを返します。 コレクションはマップと連動しているので、マップに対する変更はコレクションに反映され、またコレクションに対する変更はマップに反映されます。 コレクションの反復処理中にマップが変更された場合、反復処理の結果は定義されません(イテレータ自身のremoveオペレーションを除く)。 コレクションは要素の削除をサポートしており、対応するマッピングをマップから削除できます。削除は、Iterator.removeCollection.removeremoveAllretainAll、およびclearオペレーションを通して行います。 addまたはaddAll操作はサポートされていません。
        定義:
        インタフェースMap<K,​V>内のvalues
        戻り値:
        マップ内に含まれている値のコレクション・ビュー
        導入されたバージョン:
        1.2
      • equals

        public boolean equals​(Object o)
        Mapインタフェースでの定義に従って、指定されたObjectとこのMapを比較して等しいかどうかを判定します。
        定義:
        インタフェースMap<K,​V>内のequals
        オーバーライド:
        equals 、クラス:  Object
        パラメータ:
        o - Hashtableと等しいかどうかを比較するオブジェクト
        戻り値:
        指定されたObjectがこのMapと等しい場合はtrue
        導入されたバージョン:
        1.2
        関連項目:
        Map.equals(Object)
      • hashCode

        public int hashCode()
        Mapインタフェースの定義に従って、このMapのハッシュ・コード値を返します。
        定義:
        インタフェースMap<K,​V>内のhashCode
        オーバーライド:
        hashCode 、クラス:  Object
        戻り値:
        このオブジェクトのハッシュ・コード値。
        導入されたバージョン:
        1.2
        関連項目:
        Map.hashCode()
      • computeIfAbsent

        public V computeIfAbsent​(K key,
                                 Function<? super K,​? extends V> mappingFunction)
        指定されたキーがまだ値に関連付けられていない(またはnullにマップされている)場合、指定されたマッピング関数を使用してその値の計算を試行し、nullでない場合はそれをこのマップに入力します。

        マッピング関数がnullを返した場合、マッピングは記録されません。 マッピング関数自体が(unchecked)例外をスローすると、例外は再スローされ、マッピングは記録されません。 もっとも一般的な用途は、次のように初期のマップされた値またはメモ化された結果として機能する新しいオブジェクトを構築することです。

         
         map.computeIfAbsent(key, k -> new Value(f(k)));
         

        または、1つのキーで複数の値をサポートする複数値マップMap<K,Collection<V>>を実装することです。

         
         map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
         

        マッピング関数は、計算中にこのマップを変更すべきではありません。

        このメソッドは、ベスト・エフォート・ベースで、マッピング関数が計算中にこのマップを変更した場合にConcurrentModificationExceptionをスローします。

        定義:
        インタフェースMap<K,​V>内のcomputeIfAbsent
        パラメータ:
        key - 指定された値が関連付けられるキー
        mappingFunction - 値をコンピュートするマッピング関数
        戻り値:
        指定されたキーに関連付けられている現在の(既存の、または計算された)値。計算された値がnullである場合はnull
        例外:
        ConcurrentModificationException - マップ機能がこのマップを変更したことが検出された場合
      • computeIfPresent

        public V computeIfPresent​(K key,
                                  BiFunction<? super K,​? super V,​? extends V> remappingFunction)
        指定されたキーの値が存在していてnull以外の場合、キーと現在マップされている値から新しいマッピングの計算を試みます。

        リマッピング関数がnullを返した場合、マッピングは削除されます。 再マップ関数自体が(unchecked)例外をスローすると、例外が再スローされ、現在のマッピングは変更されません。

        再マップ関数は、計算中にこのマップを変更すべきではありません。

        このメソッドは、リマップ関数が計算中にこのマップを変更した場合、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。

        定義:
        インタフェースMap<K,​V>内のcomputeIfPresent
        パラメータ:
        key - 指定された値が関連付けられるキー
        remappingFunction - 値をコンピュートするための再マップ関数
        戻り値:
        指定されたキーに関連付けられる新しい値。存在しない場合はnull
        例外:
        ConcurrentModificationException - リマッピング機能がこのマップを変更したことが検出された場合
      • compute

        public V compute​(K key,
                         BiFunction<? super K,​? super V,​? extends V> remappingFunction)
        指定されたキーと現在マップされている値に対するマッピングの計算を試みます(現在のマッピングが存在しない場合はnull)。 たとえば、次のように、値のマッピングにString msgを作成または追加します。
         
         map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
        (このような目的で使用するmerge()メソッドは、多くの場合、より単純です。)

        再マッピング関数がnullを返した場合、マッピングは削除されます。(最初に欠席した場合は不在のままです)。 再マップ関数自体が(unchecked)例外をスローすると、例外が再スローされ、現在のマッピングは変更されません。

        再マップ関数は、計算中にこのマップを変更すべきではありません。

        このメソッドは、リマップ関数が計算中にこのマップを変更した場合、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。

        定義:
        インタフェースMap<K,​V>内のcompute
        パラメータ:
        key - 指定された値が関連付けられるキー
        remappingFunction - 値をコンピュートするための再マップ関数
        戻り値:
        指定されたキーに関連付けられる新しい値。存在しない場合はnull
        例外:
        ConcurrentModificationException - リマッピング機能がこのマップを変更したことが検出された場合
      • merge

        public V merge​(K key,
                       V value,
                       BiFunction<? super V,​? super V,​? extends V> remappingFunction)
        指定されたキーがまだ値と関連付けられていないかnullと関連付けられている場合、指定されたnull以外の値に関連付けます。 それ以外の場合は、指定された再マッピング関数の結果で関連する値を置換し、結果がnullの場合は削除します。 このメソッドは、1つのキーに対する複数のマップされた値を結合するときに使用できます。 たとえば、次のように、値のマッピングにString msgを作成または追加します。
         
         map.merge(key, msg, String::concat)
         

        リマッピング関数がnullを返した場合、マッピングは削除されます。 再マップ関数自体が(unchecked)例外をスローすると、例外が再スローされ、現在のマッピングは変更されません。

        再マップ関数は、計算中にこのマップを変更すべきではありません。

        このメソッドは、リマップ関数が計算中にこのマップを変更した場合、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。

        定義:
        インタフェースMap<K,​V>内のmerge
        パラメータ:
        key - 結果値が関連付けられるキー
        value - キーに関連付けられた既存の値にマージされるnull以外の値。既存の値がない場合、またはキーにnull値が関連付けられている場合は、キーに関連付けられるnull以外の値
        remappingFunction - 存在する場合に値を再計算するための再マッピング関数
        戻り値:
        指定されたキーに関連付けられた新しい値。キーに値が関連付けられなかった場合はnull
        例外:
        ConcurrentModificationException - リマッピング機能がこのマップを変更したことが検出された場合