白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

List<Integer>をremoveするとどうなる?

こんばんは。

だいぶ涼しくなってきましたね。
その分朝に布団から出るのがつらくなってきました。


さて、割と有名かもしれませんが、Listのremoveのお話です。

これを実行すると、

List<String> list1 = new ArrayList<>(Arrays.asList("hoge", "fuga", "piyo"));
list1.remove("fuga");
System.out.println(list1);

こうなります。

[hoge, piyo]


同じように、これを実行すると、

List<Integer> list2 = new ArrayList<>(Arrays.asList(1, 2, 3));
list2.remove(2);
System.out.println(list2);

こうなります。

[1, 2]

あれっ。
なんかイメージと違う…?


ところで、これを実行すると、

List<Integer> list3 = new ArrayList<>(Arrays.asList(1, 2, 3));
list3.remove(Integer.valueOf(2));
System.out.println(list3);

こうなります。

[1, 3]


どういうことかというと、
Collectionインタフェースには、boolean remove(Object o)というメソッドが定義されています。
Listインタフェースにはこれに加えて、E remove(int index)というメソッドが定義されています。

前者はコレクションをイテレートして、引数の値が要素の値と一致すれば削除します。
後者は指定したインデックスの要素を削除します。

引数がint型かInteger型かで呼び出されるメソッドが変わるのでこんなことになるんですね。
ややこしや。