ArrayList
имеет две реализации для remove
:
public boolean remove(Object o)
public E remove(int index)
Когда вы вызываете его:
list.remove(Character)
вы звоните
public boolean remove(Object o)
, чтобы он мог добиться успеха.
Но когда вы звоните по телефону:
list.remove('y');
char y
будет преобразовано в int 121
(попробуйте это System.out.println((int) 'y');
), вы косвенно звоните
public E remove(121)
, поэтому вы получаете IndexOutOfBoundsException