그 이름도 유명한 리스트 인터페이스를 학습해보자.
package java.util; ... public interface List<E> extends Collection<E> { int size(); ... }
List
- Ordered collection 혹은 sequence 임.
- 각 원소들이 삽입되는 위치에 대한 정확한 컨트롤을 해야함
- integer index 를 사용해 각 원소에 접근할 수 있음
Set과 달리 일반적으로 중복 원소를 허용함- formally,
e1.equals(e2)가true인 경우
- 역시 일반적으로 multiple
null원소를 허용함
Collction에 정의 된iterator,add,remove,equals, andhashCode메소드를 포함하여 추가적인 기능을 선언함
- Lists 는 Java 배열과 마찬가지로 zero based임
- List 인터페이스는 인덱스를 사용해 list의 원소에 접근하는 네가지 메서드를 제공함
- 리스트의 몇몇 구현에서 원소에 접근하는 연산은
O(n)임 - e.g.)
Linkedlist - 따라서
List구현체의 내부 구현을 자세히 모른다면 list 를 깡으로 iterating 하는 것은 삼가해야함
List인터페이스는 특별한 iterator인ListIterator를 제공함
List인터페이스는 특정 index이후의 iterator를 제공하는 api를 제공하기도 함
List인터페이스는 특정 객체를 조회하는 메서드를 두가지 제공함- 퍼포먼스적 측면에서 이 메서드는 조심해서 사용해야함, 대부분의 구현에서 그냥 선형 탐색을함
List인터페이스는 임의의 인덱스의 인련의 원소에 대한 효율적인 삽입, 삭제 메서드를 두가지 제공함
List의List를 가지는 것은 허용되지만 매우 주의해서 사용해야함, eqauls and hashCode 메소드는 그런List에 대해서 잘 정의되지 않음
Unmodifiable Lists
List.of, List.copyOf - unmodifiable list 를 생성하는 정적 팩토리 메서드- 원소를 add, remove, replace 하는 어떠한 종류의 메서드도 허용되지 않음
UnsupportedOperationException
- null 을 담을 수 없음
NullPointerException
- 모든 element가 serializable → 얘네도 serializable
- (일반적으로 상수타임의) 빠른 인덱스 접근을 지원하는
List를 random access list 라고함 - 그렇지 않은 List 는 sequential access list 라고 부름
RandomAccess라는 마커 인터페이스를 통해 램덤 액세르를 지원하는 것을 동네방네 자랑할 수 있음
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { ... }
RandomAccess 인터페이스를 확인 하여 제네릭으로 index 접근 알고리즘을 제공할 수 있음