remove와 removeAll은 List나 Set 같은 컬렉션에서 원소를 제거하는 메서드입니다.
remove(Object o)
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.remove("5");
list.remove("3");
list.remove("1");
System.out.println("list = " + list);
인자로 받은 Object와 일치하는 원소를 제거합니다.
remove를 실행하면 내부에서는 Object 클래스의 equals 메서드를 사용하여 일치 여부를 판별합니다.
add 메소드와 마찬가지로 리턴타입은 boolean입니다.
List에는 remove 메서드가 하나 더 존재합니다.
remove(int index)로, 인자가 Object가 아니라 int인 메소드가 존재합니다.
만약 Integer List를 remove 한다면 원소를 Object로 간주하지 않고 인덱스로 간주하게 됩니다.
그래서 리스트의 원소지만, 리스트의 범위를 벗어난 숫자를 remove 하게 되면 IndexOutOfBoundException 예외가 발생합니다.
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.remove(20);
System.out.println("list = " + list);
인덱스로 제거하는 메서드는 List에만 있는 것 같습니다.
Set과 Map에는 존재하지 않습니다.
만약 Integer로 구성된 리스트에서 remove(Object o)를 사용하고 싶다면 다음과 같이 사용하면 됩니다.
Collection<Integer> collection = new ArrayList<>();
collection.add(10);
collection.add(20);
collection.add(30);
collection.remove(20);
System.out.println("collection = " + collection);
Collection 클래스를 직접 사용하면 됩니다.
remove(Object o)는 Collection의 메서드고, remove(int index)는 List의 메서드기 때문입니다.
remove 메소드를 쓸 때 주의할 점이 foreach와 같은 iterator형 반복문 내부에서는 사용하면 안됩니다.
Collection remove 사용 시 ConcurrentModificationException 발생
removeAll(Collection<?> c)
removeAll은 컬렉션 단위로 파라미터를 받아서 여러개의 원소들을 제거해 줍니다.
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(3);
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
list.removeAll(set);
System.out.println("list = " + list);
사용방법은 addAll과 같습니다.
위의 예시처럼 List 클래스에 removeAll로 Set 클래스를 넣는, 서로 다른 컬렉션 클래스를 사용해도 원소들을 제거할 수 있습니다.
remove와 removeAll 메서드도 add 메서드와 마찬가지로 컬렉션에 변화가 생기면 true, 변화가 없으면 false를 반환합니다.
addAll과 마찬가지로 리턴타입은 boolean입니다.