1

Java で考えると、次のようになります。

AbstractList から読み取り専用リストを作成するには、get() と size() を実装する必要があります。

それは私を混乱させました、コードは以下の通りです:

 public class CountingIntegerList
extends AbstractList<Integer> {
  private int size;
  public CountingIntegerList(int size) {
    this.size = size < 0 ? 0 : size;
  }
  public Integer get(int index) {
    return Integer.valueOf(index);
  }
  public int size() { return size; }
  public static void main(String[] args) {
    List list = new CountingIntegerList(30);
  }
}

リストは読み取り専用リストですか? なんで?

わかりました、答えはイエスです。私は延長し、 orが呼び出された場合AbstractListにスローします。unmodifiableList を取得したい場合は、良い選択です。ただし、どちらも完全に不変というわけではないことに注意してください。UnsupportedOperationExceptionsetandCollections.unmodifiableList()

      List<StringBuilder> list = new ArrayList<StringBuilder>();
      StringBuilder sb = new StringBuilder();
      sb.append("hello");
      list.add(sb);
      System.out.println(list);
      list = Collections.unmodifiableList(list);
      sb.append("world");
      System.out.println(list);

ありflyweight patternますCountingIntegerList。毎回get()呼び出されるため、次のソース コードである Integer からキャッシュを取得しますvalueOf()

   public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

ですよね?

4

5 に答える 5

5

will はas willaddをスローするため、読み取り専用 (不変であっても)です。UnsupportedOperationExceptionremove

AbstractListイテレータの作成、ハッシュコードの計算、等価性のすべての作業を処理します。とても役に立ちます。でラップする必要はまったくありませんunmodifiableList

後で、AbstractList主に変更不可能なリストを作成するために使用されるかどうかを尋ねます。実際には、あらゆる種類のランダム アクセス リストを作成するために使用されます。データ構造の私のコースでは、このような抽象クラスを使用して、リスト クラスを実装する作業のほとんどを節約します。インターフェイスにもCollection13 個のメソッドがあり、そのうちの 2 つを除いてすべて によって実装されていAbstractCollectionます。

AbstractSequentialListランダム アクセスではないリスト (リンクされたリストなど) を作成するのに役立つ関連クラスがあります。

于 2013-04-24T13:33:57.670 に答える
4

set実装されていない場合、UnsupportedOperationException がスローされるためです。APIを参照

于 2013-04-24T13:31:19.173 に答える
4

リストをUnmodifiableListでラップできます

List readOnlyList = Collections.unmodifiableList(yourList)
于 2013-04-24T13:32:55.663 に答える
1

ArrayList をCollections.unmodifiableList()に渡します

指定されたリストの変更不可能なビューを返します。この方法により、モジュールはユーザーに内部リストへの「読み取り専用」アクセスを提供できます。返されたリストに対するクエリ操作は、指定されたリストを「読み取り」、直接または反復子を介して返されたリストを変更しようとすると、UnsupportedOperationException が発生します。指定されたリストがシリアライズ可能な場合、返されるリストはシリアライズ可能になります。同様に、指定されたリストが RandomAccess を実装している場合、返されるリストは RandomAccess を実装します。

于 2013-04-24T13:32:34.133 に答える
0

これは少しトリッキーです。リストは変更できませんか、および/または要素も変更できますか? ;)

StringBuilder builder = new StringBuilder();
    builder.append("Hello");
    List<StringBuilder> list = new ArrayList<StringBuilder>();
    list.add(builder);

    Collection<StringBuilder> canNotChange = Collections.unmodifiableCollection(list);
    builder.append(" World");
    System.out.println(canNotChange.iterator().next());
于 2013-04-24T13:54:08.423 に答える