본문 바로가기
JAVA/[JAVA] 바구니

[JAVA] List Collection

by oncerun 2020. 4. 28.
반응형

List Collection

List Collection은 List interface를 구현한 컬렉션을 이야기합니다.

 

특징

  • 인덱스로 관리를 합니다  

  • 중복해서 객체를 저장할 수 있습니다.

 

객체의 주소가 저장됩니다.

같은 인덱스가 같은 객체를 저장할 수 있습니다.

즉 인덱스로 객체를 관리하는데 중복해서 객체 저장이 가능합니다.

 

구현 클래스

  • ArrayList

  • Vector

  • LinkedList

 

주요 메서드

기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 맨끝에 추가합니다.
void add(int index, E element) 주어진 인덱스에 객체를 추가합니다.
set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 변경합니다.
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어있는지 확인합니다.
E get(int index) 주어진 인덱스에 저장된 객체를 리턴합니다.
isEmpty() 컬렉션이 비어 있는지 확인합니다.
int size 저장되어있는 전체 객체의 수를 리턴합니다.
객체 삭제 void clear() 저장된 모든 객체를 삭제합니다.
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제합니다.
boolean remove(Object o) 주어진 객체를 삭제합니다.

 

 

ArrayList

List <E> list = new ArrayList <E>();

E : 타입 파라미터 

저장할 수 있는 객체의 타입을 지정합니다.

 

저장 용량

초기 : 10개의 저장공간이 만들어집니다.

초기 용량을 지정할 수 있습니다.

저장 용량을 초과한 객체들이 들어오면 자동적으로 ArrayList의 크기가 늘어납니다.

9개의 인덱스에서 객체가 들어오면 또 10개의 인덱스를 생성합니다.

 

객체 제거

만약 중간 인덱스의 객체를 remove()로 삭제시켰다면 바로 뒤 인덱스부터 앞으로 1씩 당겨집니다.

 

 

고정 객체 ArrayList생성

 

객체들이 고정되어있다면 add()로 추가하는 것이 비효율적일 수 있습니다.

Arrays.asList()로써 고정된 객체들로 구성된 List를 생성할 수 있습니다.

 

 

package list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListProgram {

public static void main(String[] args) {

List<String> list = new ArrayList<String>();

list.add("Jsp");//0번째인덱스에 JSP스트링객체저장
list.add("Servlet");//1번째
list.add("Java");//3번째
list.add(2, "JDBC"); //2번째 인덱에저장되므로 "Java"를 저장한 스트링객체가 3번인덱스에 저장됩니다.
list.add("iBATIS"); //4번째

int size = list.size();
System.out.println("총  ArrayList에 저장된 객체수 : " + size);

String check = list.get(2);
System.out.println("index 2인 문자열 : "+check);

for(int i= 0; i <list.size(); i++)
System.out.println(i+"번째 객체"+list.get(i));

System.out.println();
for(String st : list)
System.out.println(st);
System.out.println();
list.remove(2);

for(int i= 0; i <list.size(); i++)
System.out.println(i+"번째 객체"+list.get(i));

고정된 객체생성하기
List <Integer> aslist = Arrays.asList(1, 2,3);
for(int st : aslist)
System.out.println(st);
}
}




 

Vector

 

List <E> list = new Vector <E>();

E : 타입 파라미터 

저장할 수 있는 객체의 타입을 지정합니다.

 

 

vector는 스레드 동기화가 되어 있기 때문에
복수의 스레드가 동시에 vector에 접근해서 객체를 추가, 삭제하더라도 스레드 사용이 안전합니다

 

ArrayList와 차이점
add() 메서드의 선언부에서의 차이점이 존재합니다.

 

ArrayList
public boolean add {..}

Vector
public synchronized boolean add {...}


synchronized 메서드가 되면 여러 스레드가 실행되는 환경에서 하나의 스레드가 add()를 실행하고 있으면 다른 스레드는 사용할 수 없습니다.

동시에 접근해 add() 메서드를 호출하면 문제가 발생하므로 스레드에 안전한 Vector를 사용해야 합니다.

다만 싱글 스레드인 경우 ArrayList가 Vector보다 좋은 성능을 냅니다.

 

package list;

public class VectorParam {
String a;
String b;
String c;

public VectorParam(String a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}

@Override
public String toString() {
return "VectorParam [a=" + a + ", b=" + b + ", c=" + c + "]";
}

}
package list;

import java.util.*;

public class VectorProgram {

public static void main(String[] args) {


List<VectorParam> list = new Vector<VectorParam>();

list.add(new VectorParam("안녕0","하세0" , "요0"));
list.add(new VectorParam("안녕1","하세1" , "요1"));
list.add(new VectorParam("안녕2","하세2" , "요2"));
list.add(new VectorParam("안녕3","하세3" , "요3"));
list.add(new VectorParam("안녕4","하세4" , "요4"));

list.remove(2);
list.remove(3);

for(VectorParam vpar : list)
System.out.println(vpar);

}

}

2번째 3번째 인덱스를 지우고 콘솔 창에 객체를 출력하겠습니다

toString을 재정의해서 필드 값으로 자신의 인덱스를 반환하도록 했습니다.

먼저 2번째 인덱스를 remove 함으로써 3번째 인덱스가 2번째 인덱스로 변경되고 4번째가 3번째 인덱스로 변경되었습니다. 그런 뒤 3번째 인덱스를 지운 결괏값입니다.

 

 

 

LinkedList

List <E> list = new LinkedList <E>();

E : 타입 파라미터 

저장할 수 있는 객체의 타입을 지정합니다.

 

인접 참조를 링크해서 체인처럼 관리하며

특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞뒤 링크만 변경됩니다.

빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능을 발휘합니다.

 

ArrayList와 LinkedList의 성능 비교

 

package list;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class LinkedListProgram {

public static void main(String[] args) {

List<String> list1 = new ArrayList<String>();
List<String> list2 = new LinkedList<String>();

long startTime;
long endTime;

startTime = System.nanoTime();
for(int i =0; i <10000; i++) {
list1.add(0,String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList가 걸린시간 :"+ (endTime-startTime));

startTime = System.nanoTime();
for(int i =0; i <10000; i++) {
list2.add(0,String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList가 걸린 시간 : "+(endTime-startTime));
}

}

 

 

ArrayList는 삭제나 추가 시 뒤에 있는 인덱스가 앞으로 당겨지거나 뒤로 밀리기 되지만

LinkedList는 참조만 끊고 새로 생성된 객체와 연결만을 하여 다른 인덱스를 영향을 받지 않기 때문에 빈번하게 객체가 추가, 삭제되는 환경에서는 성능이 더 뛰어납니다.

반응형

'JAVA > [JAVA] 바구니' 카테고리의 다른 글

[JAVA] Map Colletion  (0) 2020.05.03
[JAVA] Set Collection  (0) 2020.05.02
[JAVA] Collection FrameWork  (0) 2020.04.28
[JAVA] System Class  (0) 2020.04.22
[JAVA] Reflection  (0) 2020.04.21

댓글