Collections
Arrays.asList: 配列を共有する固定長 List
Arrays.asList は配列をコピーせず、要素の置換は共有しながら追加・削除を許可しません。
SourceArrayBackedLists.java
Java 21
package examples.list;
import java.util.Arrays;
import java.util.List;
public final class ArrayBackedLists {
private ArrayBackedLists() {}
public static List<String> from(String[] values) {
return Arrays.asList(values);
}
}TestArrayBackedListsTest.java
Java 21
package examples.list;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.List;
import org.junit.jupiter.api.Test;
class ArrayBackedListsTest {
@Test
void ArraysAsListで変更した要素は元の配列にも反映される() {
var values = new String[] {"A", "B"};
var list = ArrayBackedLists.from(values);
list.set(0, "X");
assertEquals("X", values[0]);
}
@Test
void ArraysAsListが返すListには要素を追加できない() {
List<String> list = ArrayBackedLists.from(new String[] {"A"});
assertThrows(UnsupportedOperationException.class, () -> list.add("B"));
}
}01Assertion
このテストで確認できること
- set で置き換えた要素は元の配列にも反映される
- add は UnsupportedOperationException になる
Arrays.asList は可変な ArrayList でも完全な不変 List でもありません。配列を背後に持つ固定長のビューです。
OBSERVED RESULT
expected: values[0] → X
actual: X
expected exception: UnsupportedOperationException