1.ArrayList
어레이 리스트는 배열과 똑같이 0번방부터 시작해서 자료가 들어오는대로 1, 2, 3, ~ 늘어나는 구조이다.
배열을 쓰다가 ArrayList를 배운다면 배열을 잘 쓰지 않게 될 것이다.
배열과 달리 크기를 따로 지정할 필요 없고 add를 통해 언제든지 값을 추가 또는 삽입할 수 있다.
하지만 메모리 저장 구조상 어레이 리스트는 삽입과 삭제를 남발한다면 자원이 낭비될 수 있다.
만약 메모리에 ㅁㅁㅁㅁㅁㅁㅂㅁㅁㅁㅁㅁㅁㅁ와 같이 저장되 있다고 할 때에
'ㅂ'자리에 자료를 추가한다면 뒤에 있는 자료를 하나씩 순서를 다 밀어줘야 하기 때문에 느려지게 된다.
ArrayList는 다양한 기능을 가지고 있는데 아래의 예제를 통해 확인해보자
package chap09.exam01.arrList; import java.util.ArrayList; public class ArrayList01 { public static void main(String[] args) { // ArrayList는 크기 지정을 할 필요가 없다. // ArrayList<String>list = new ArrayList<String>(); // 방 크기를 지정한다면 메모리 공간 확보에 좋음 ArrayList<String>list = new ArrayList<String>(3); list.add("collection"); // 0번 인덱스 list.add("thread"); // 1번 인덱스 list.add("java io"); //2번 인덱스 list.add("network"); // 배열 같으면 예외가 발생 list.add(3, "lambda"); // [3] = lambda, [4] = network로 밀림 // bool값 반환은 값이 성공적으로 삽입됫다는 뜻 // 크기 반환 System.out.println(list.size()); // 특정 인덱스의 값 확인 System.out.println(list.get(3)); System.out.println(list.get(4)); System.out.println("--------------------------------"); // for문을 이용하여 모든 값 출력 for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("--------------------------------"); // 삭제하기 // 중간의 인덱스 삭제 삽입은 메모리 사용에 비효율적이라 남발하는건 안좋음 System.out.println(list.remove("thread")); System.out.println(list.size()); System.out.println(list.remove(2)); System.out.println(list.size()); } }
package chap09.exam01.arrList; import java.util.ArrayList; import java.util.Arrays; public class ArrayList02 { // 배열의 값을 ArrayList로 public static void main(String[] args) { // 배열 String[] arr = {"list", "set", "map"}; // array -> List : 조회는 되지만 변경은 불가능 java.util.List<String> list = Arrays.asList(arr); System.out.println(list.size()); System.out.println(list.get(1)); // ArrayList.addAll은 Collection 타입을 인자로 받음 // List -> ArrayList : 일괄적으로 List의 값을 ArrayList에 부어줌 ArrayList<String> arrlist = new ArrayList<String>(); arrlist.addAll(list); arrlist.add("collection"); System.out.println(); for(String item : arrlist) { System.out.println(item); } } }
package chap09.exam01.arrList; import java.util.ArrayList; public class ArrayList03 { public static void main(String[] args) { ArrayList<Integer> score = new ArrayList<Integer>(); score.add(70); // 0 score.add(80); // 1 score.add(50); // 2 score.add(90); // 3 score.add(100);// 4 score.add(90); // 5 // 데이터 갯수 반환 System.out.println(score.size() + "\n"); // 데이터 수정 : 특정 인덱스의 값을 변경 score.set(3, 95); System.out.println(score.get(3) + "\n"); // 값 유무 확인 : 해당 값의 유무를 참/거짓으로 반환 System.out.println(score.contains(30) + "\n"); // 위치 확인 System.out.println(score.indexOf(90) + "\n"); // 비우기 score.clear(); // 비움상태 확인 System.out.println(score.isEmpty());; System.out.println(score.size()); } }
2.LinkedList
링크드 리스트는 어레이 리스트와 매우 유사하다.
하지만 메모리 저장 방법이 어레이 리스트와 다르다.
자료마다 전에 저장한 자료, 다음 자료의 위치가 저장되고 어레이 리스트의 단점인 중간에 자료를 넣을 경우
앞의 자료와 뒤의 자료의 저장 위치만 살짝 수정하면 해결되기 때문에 훨씬 빠르다.
다음 예제를 직접 실행해보아 시간 차이를 확인해보자.
startTime = System.currentTimeMillis(); 을 통해서 작업 시작했을 때의 시간을 넣고
endTime = System.currentTimeMillis();을 통해서 작업이 끝났을 때의 시간을 넣는다.
그리고 endTime - startTime으로 시간 차를 비교하여 출력
Mill은 1초를 1000으로 나눈 값이다.
package chap09.exam02.linkList; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListBenchMark { public static void main(String[] args) { // 선수 준비 List<String> arr = new ArrayList<String>(); List<String> link = new LinkedList<String>(); // 조건 for(int i = 1; i <= 100; i++) { arr.add("datadatadatadatadata"); link.add("datadatadatadatadata"); } // 초시계(걸린시간 = 도착시간 - 출발시간) long endTime = 0; long startTime = 0; // 측정 // 어떤 구현이든 구현에는 순서를 생각해 놓는게 중요 /*ArrayList 체크*/ // 타임워치 시작 // 현재시간을 1/1000초로 환산 startTime = System.currentTimeMillis(); // 선수 달리기 for(int i = 1; i < 1000000; i++) { // 중간에 넣는 실험 // 뒤로 넣는 것을 시험하고 싶으면 index 값을 지운다. arr.add(55, "Add Data"); } // 타임워치 스톱 endTime = System.currentTimeMillis(); // 결과 확인 System.out.println("결과 : " + (endTime - startTime) + "mil"); /*LinkedList 체크*/ // 타임워치 시작 // 현재시간을 1/1000초로 환산 startTime = System.currentTimeMillis(); // 선수 달리기 for(int i = 1; i < 1000000; i++) { link.add(55, "Add Data"); } // 타임워치 스톱 endTime = System.currentTimeMillis(); // 결과 확인 System.out.println("결과 : " + (endTime - startTime) + "mil"); } }
'개념 및 코딩 > 07.Collection Framework' 카테고리의 다른 글
[JAVA]07-05.Stack, Queue (0) | 2018.09.04 |
---|---|
[JAVA]07-04.HashMap, HashTable (0) | 2018.09.04 |
[JAVA]07-03.Hashset (0) | 2018.09.04 |
[JAVA]07-01.Collection, Map (0) | 2018.09.04 |