[Java] 자바 #34, List 인터페이스 계열 컬렉션(ArrayList, LinkedList, Vector) & ArrayList vs LinkedList 예제

List 계열 컬렉션

- 선형구조로 이루어진 컬렉션 구조(순서에 의미가 있음)

- ArrayList

- LinkedList

- Vector


ArrayList 

https://sas-study.tistory.com/73 <<< 이곳을 참조하시기 바랍니다^^


Vector


- ArrayList와 유사한 사용법 및 쓰임새

- 차이는 쓰레드 작업 시 동기화 지원 유무(지금은 그냥 비슷하다정도만 알면 된다.)


ArrayList<Integer> nums1 = new ArrayList<Integer>();

Vector<Integer> nums2 = new Vector<Integer>();


nums1.add(100);

nums1.add(200);

nums1.add(300);


nums2.add(400);

nums2.add(500);

nums2.add(600);


System.out.println(nums1.get(0));

System.out.println(nums2.get(0));


모든 컬렉션들은 toString() 오버라이딩 되어있다.

System.out.println(nums1.toString());

System.out.println(nums1);


그냥 객체생성

ArrayList<String> list1= new ArrayList<String>();

Vector<String> list2 = new Vector<String>();

업캐스팅을 통한 객체생성

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

List<String> list4 = new Vector<String>();


LinkedList


 - Queue의 구현 클래스로 사용하기도 한다.

 - ArrayList와 사용법이 유사하다. > 사용 목적도 유사하다.


LinkedList의 종류

 1. 기본 LinkedList

 2. DoubleLinkedList

 3. Double Circular LinkedList


ArrayList vs LinkedList

 - 둘다 같은 목적으로 사용한다.

 - 길이가 가변인 배열 용도로 사용한다.


ArrayList

 - 장점 : 모든 컬렉션중 요소에 대한 접근속도가 가장 빠르다.

 - 단점 : 요소의 추가나 삭제작업시 비용

LinkedList

 - 장점 : 요소의 추가/삭제작업시 비용 발생이 저렴(빠르다)

 - 단점 : 요소에 대한 접근속도가 느리다.


ArrayList<Integer> aList = new ArrayList<Integer>();

int[] n = new int[10];

LinkedList<Integer> lList = new LinkedList<Integer>();


각각 배열들 값 넣기

aList.add(100);

n[0] = 100;

aList.add(200);

n[1] = 200;

aList.add(300);

n[2] = 300;


lList.add(1000);

lList.add(2000);

lList.add(3000);


추가하는 방법 똑같다.

aList.add(1, 400);

lList.add(1, 4000);


제거하는 방법 똑같다.

aList.remove(0);

lList.remove(0);


// aList.remove(200);

// lList.remove(2000);


aList.remove(new Integer(200));   해당 객체들과 같은 값을 가지는 객체요소를 삭제할것임.

lList.remove(new Integer(2000));



1. 순차적으로 데이터 추가.(Append)

- 설명 : ArrayList 객체와 LinkedList 객체에 각각 1000000개의 값을 add 할 것인데 과연 누가더 빠를까???


long begin = 0;

long end = 0;


begin = System.currentTimeMillis(); ArrayList 작업 시작시간

//ArrayList add 작업

for (int i = 0; i < 1000000; i++) {

aList.add(i);

}

end = System.currentTimeMillis(); ArrayList 작업 종료시간

System.out.printf("작업 소요시간 : %ds\n", end - begin); 이 값과


begin = System.currentTimeMillis();LinkedList 작업 시작시간

//LinkedList add 작업

for (int i = 0; i < 10000; i++) {

lList.add(i);

}

end = System.currentTimeMillis(); LinkedList 작업 시작시간작업 종료시간

System.out.printf("작업 소요시간 : %ds\n", end - begin); 이값을 비교해보세요.


2. 중간에 데이터 추가하기 + shift 발생

- 중간에 1000개의 데이터를 추가해보았다. 과연 어떤 객체의 작업이 더 빠르게 수행되었을까??


begin = System.currentTimeMillis();

//중간에 삽입 작업(ArrayList)

for (int i = 0; i < 1000; i++) {

aList.add(100, i);

}

end = System.currentTimeMillis();

System.out.printf("작업 소요시간 : %ds\n", end - begin);   이 값과


begin = System.currentTimeMillis();

// 중간에 삽입 작업(LinkedList)

for (int i = 0; i < 10000; i++) {

lList.add(100, i);

}

end = System.currentTimeMillis();

System.out.printf("작업 소요시간 : %ds\n", end - begin);이값을 비교해보세요.

3. 순차적으로 데이터 삭제하기

- 설명 : 순차적으로 데이터를 삭제해보았다 과연 어떤 객체의 작업이 더 빠르게 수행되었을까?


begin = System.currentTimeMillis();


// 직업

for (int i = aList.size()-1; i >= 0; i--) {

aList.remove(i);

}

end = System.currentTimeMillis();

System.out.printf("작업 소요시간 : %ds\n", end - begin);

begin = System.currentTimeMillis();

// 직업

for (int i = lList.size()-1; i >= 0; i--) {

lList.remove(i);

}

end = System.currentTimeMillis();

System.out.printf("작업 소요시간 : %ds\n", end - begin);


5. 순차적으로 데이터에 접근하기(위에서 삭제했지만 다시 넣고 진행하세요.)

// 직업

for (int i = 0; i < 100000; i++) {

aList.get(i);

}

end = System.currentTimeMillis();

System.out.printf("작업 소요시간 : %ds\n", end - begin);

begin = System.currentTimeMillis();

// 직업

for (int i = 0; i < 100000; i++) {

lList.get(i);

}

end = System.currentTimeMillis();

System.out.printf("작업 소요시간 : %ds\n", end - begin);


결론 : 순차적으로 값을 넣는 경우(즉, 중간에 add(4,값) 이렇게 넣는 형태가 아닌)는 ArrayList가 빠르다. 왜냐하면 옆자리에 그냥 바로 넣으면 되기 때문이다. 하지만 값을 수정하거나 제거하거나 중간에 배열이 수정(삭제, 수정, 중간에삽입)이 일어나게 되는 경우에는 LinkedList가 수행속도가 더 빠르다.


Arrays 유틸클래스를 이용한 List를 만드는 여러가지 방법


List<Integer> list5 = Arrays.asList(10,20,30); 이런식으로 List를 만들 수 있다.(input : Integer 객체들)

System.out.println(list5);

List<String> list6=Arrays.asList("홍길동","아무개","테스트"); 이런식으로 List를 만들 수 있다2(input : String객체들)

System.out.println(list6);

Integer[] nums = {100,200,300};

List<Integer> list7=Arrays.asList(nums); 이런식으로 List를 만들 수 있다3 (input : 순수배열)

댓글

Designed by JB FACTORY