java.util.ListでUnsupportedOperationException

JavaList<String>String[]を変換する際に、表題のUnsupportedOperationExceptionが発生しました。

 

やりたかったことはString[]からList<String>への変換です。以下のようなコードを書きました。

String[] array = {"hoge", "fuga"};
List<String> list = Arrays.asList(array);
list.add("piyo");

一見、特におかしな部分は見当たりませんが、実行すると「UnsupportedOperationException」となります。

回避方法自体は以下の記事に記載されていました。

Java:List操作時のUnsupportedOperationExceptionについて - Kinopyo Blog

List<String>のをしっかりと行うことで回避できるようです。

String[] array = {"hoge", "fuga"};
List<String> list = new ArrayList<String>();
list = Arrays.asList(array);
list.add("piyo");

 

少し調べてみると、new ArrayList<String>()の引数無しコンストラクタでは、内部のsizeに10を与えてインスタンス化するようです。

ところが、new ArrayList<String>(Collection)だとコンストラクタで引数として渡したコレクション要素のサイズがそのままsizeとなり、addで溢れるようです。IndexOutOfBoundExceptionになりそうな気もしますが。

もう少し詳しく調べたら記事更新しておきます。