그 이름도 유명한 리스트 인터페이스를 학습해보자.
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 접근 알고리즘을 제공할 수 있음