0

ArrayList既存のリストに基づいて新しい を構築することについて質問を受けましたList。要素の値を検査するだけで変更しないため、要素をディープ クローンする必要はありません。

私の古い、動作中のコードは、私には少しハックのように見えるので、過去に問題があったと思います:

        Collections.sort(invoiceWordGroups, new WordGroup.WordGroupComparator());
        insertAttributes(topAttributeWords, invoiceWordGroups, templateId, templateAttributeManager, invoiceMarginDataVAT);
        Collections.reverse(invoiceWordGroups);
        insertAttributes(bottomAttributeWords, invoiceWordGroups, templateId, templateAttributeManager, invoiceMarginDataVAT);

もちろん、私の新しいコードもテストしますが、基本的な概念がうまくいかない場合は、それでもエラーが残る可能性があります。それで、これは同じ動作をしますか?

        Collections.sort(invoiceWordGroups, new WordGroup.WordGroupComparator());
        List<WordGroup> invoiceWordGroupsReverse = new ArrayList<>(invoiceWordGroups);
        Collections.reverse(invoiceWordGroupsReverse);
        insertAttributes(topAttributeWords, invoiceWordGroups, templateId, templateAttributeManager, invoiceMarginDataVAT);
        insertAttributes(bottomAttributeWords, invoiceWordGroupsReverse, templateId, templateAttributeManager, invoiceMarginDataVAT);

問題はinvoiceWordGroups、タイプのについてList<WordGroup>です。これを変更する理由は、リストを複数回使用する必要があり、常に逆にすることは明らかに良い選択肢ではないように思われるからです。

4

1 に答える 1

3

Java ソース コードを確認すると、ArrayList のコピー コンストラクターは、内部配列をコピーする新しいリスト オブジェクトを作成します (そのため、コピー コンストラクターという名前が付けられています)。 )。したがって、この内部配列オブジェクトは共有されず、特定のリストオブジェクトが実際に格納するものとその順序を担当するのはオブジェクトです。

   public ArrayList(Collection<? extends E> c) {
       elementData = c.toArray();
       size = elementData.length;
       // c.toArray might (incorrectly) not return Object[] (see 6260652)
       if (elementData.getClass() != Object[].class)
           elementData = Arrays.copyOf(elementData, size, Object[].class);
   }

したがって、1 つのリストを逆にしても、他のリストの順序には影響しません。リストから要素を追加/削除する場合も同様です。

それらは読み取り専用オブジェクトであると言いましたが、問題はありませんが、両方のリストが異なるオブジェクトであっても、同じ要素を指していることを覚えておいてください。そのため、list1 のオブジェクト X の状態の変更は、そのオブジェクト X にアクセスするときにも表示されます。リスト2で。

于 2013-10-14T07:38:27.147 に答える