- 요소의 저장 순서가 유지된다.
- 같은 요소의 중복 저장을 허용한다.
- 대표적인 List컬렉션 클래스에 속하는 클래스로는 ArrayList, LinkedList, Vector, Stack 가 있다.
- 크기가 가변적으로 변하는 선형리스트이다.
- 배열을 이용하기 때문에 인덱스를 이용해 배열 요소에 빠르게 접근할 수 있다.
- 요소의 추가 및 삭제 작업에 걸리는 시간이 매우 길어지는 단점이 있다.
ArrayList list = new ArrayList();//타입 미설정 Object로 선언
ArrayList<Member> members = new ArrayList<Member>();//타입설정 Member객체만 사용가능
ArrayList<Integer> num = new ArrayList<Integer>();//타입설정 int타입만 사용가능
ArrayList<Integer> num2 = new ArrayList<>();//new에서 타입 파라미터 생략가능
ArrayList<Integer> num3 = new ArrayList<Integer>(10);//초기 용량(capacity)지정
ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1,2,3));//생성시 값추가
ArrayList<Integer> list = new ArrayList<Integer>();//ArrayList생성
list.add(3); //값 추가
list.add(null); //null값도 add가능
list.add(0,10); //인덱스0에 10 삽입
System.out.println(list.size()); //list 크기 : 3
ArrayList<Member> members = new ArrayList<Member>();//ArrayList생성
Member member = new Member(name,age);
member.add(student);
member.add(new Member("홍길동",15));
list.remove(1); //인덱스 1 제거
list.clear(); //모든 값 제거
🔎 add(idx,val) 메소드에서 인덱스를 생략하면 리스트 맨 뒤에 데이터가 추가가 되며, 중간에 값을 추가하면 해당 인덱스 부터 마지막 인덱스까지 모두 하나씩 밀려난다.
🔎 데이터가 늘어날 수록 성능에 악영향을 주기 때문에 이러한 경우엔 LinkedList를 활용하도록 하자!
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));//ArrayList 생성
System.out.println(list.get(0)); //인덱스0 값 출력
System.out.println(list); //전체출력 [1,2,3]
for(Integer i : list) { //for문을 통한 전체출력
System.out.println(i);
}
Iterator iter = list.iterator(); //Iterator 선언
while(iter.hasNext()){//다음값이 있는지 체크
System.out.println(iter.next()); //값 출력
}
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));//ArrayList 생성
System.out.println(list.contains(2)); //list에 2이 있는지 검색 : true
System.out.println(list.indexOf(2)); //2가 있는 index반환 없으면 -1
- ArrayList클래스가 배열을 이용하여 요소를 저장함으로써 발생하는 단점을 극복하기 위함이다.
- 연결 리스트는 저장된 요소가 비순차적으로 분포한다.
- 이러한 요소들 사이를 링크(link)로 연결한다.
-> 객체를 추가/삭제 하면 앞뒤 링크만 변경해주면 된다.- 단일 연결 리스트: 다음 요소를 가리키는 참조만을 가진다. 저장과 삭제 작업이 아주 빠르지만 현재 요소에서 이전 요소로 접근하기가 매우 어렵다.
이중 연결 리스트 : 이전 요소를 가리키는 참조도 가진다.
->이 둘의 차이는 내부적으로 요소를 저장하는 방법에 있다.- 인덱스가 없기에 특정 요소에 순차탐색으로 접근 가능하다.
LinkedList list = new LinkedList();//타입 미설정 Object로 선언
LinkedList<Member> members = new LinkedList<Member>();//타입설정 Member객체만 사용가능
LinkedList<Integer> list = new LinkedList<Integer>();//타입설정 int타입만 사용가능
LinkedList<Integer> list1 = new LinkedList<>();//new에서 타입 파라미터 생략가능
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1,2,3));//생성시 값추가
- ArrayList와는 다르게 초기 크기를 미리 생성할 수는 없다.
LinkedList<Integer> list = new LinkedList<Integer>();//LinkedList 생성
list.addFirst(1);//가장 앞에 데이터 추가
list.addLast(2);//가장 뒤에 데이터 추가
list.add(3);//데이터 추가
list.add(1, 10);//index 1에 데이터 10 추가
System.out.println(list.size()); //list 크기 : 4
LinkedList<Member> memebers = new LinkedList<Member>();
Member student = new Member(name,age);
members.add(student);
members.add(new Member("홍길동",77));
list.removeFirst(); //가장 앞의 데이터 제거
list.removeLast(); //가장 뒤의 데이터 제거
list.remove(); //생략시 indext 0 제거
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3));//LinkedList 생성
System.out.println(list.get(2));//2번째 index 출력
for(Integer i : list) { //for문을 통한 전체출력
System.out.println(i);
}
Iterator<Integer> iter = list.iterator(); //Iterator 선언
while(iter.hasNext()){//다음값이 있는지 체크
System.out.println(iter.next()); //값 출력
}
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3));//LinkedList 생성
System.out.println(list.contains(1)); //list에 1이 있는지 검색 : true
System.out.println(list.indexOf(1)); //1이 있는 index반환 없으면 -1
List 인터페이스는 Collection 인터페이스를 상속받으므로, Collection 인터페이스에서 정의한 메소드 모두 사용 가능
메서드 | 설명 |
---|---|
boolean add(E e) | 해당 리스트(list)에 전달된 요소를 추가 |
void clear() | 모든 요소를 제거 |
boolean contains(Object o) | 전달된 객체를 포함하고 있는지를 확인함 |
boolean equals(Object o) | 전달된 객체가 같은지를 확인 |
boolean isEmpty() | 해당 리스트가 비어있는지를 확인 |
Iterator iterator() | 반복자(iterator)를 반환 |
boolean remove(Object o) | 전달된 객체를 제거 |
int size() | 요소의 총 개수를 반환 |
Object[] toArray() | 모든 요소를 Object 타입의 배열로 반환 |