최근 알고리즘에서 또는 JPA는 자바에서 기본으로 제공하는 Collection을 지원하고 있기 때문에 한번 정리할 필요성을 느꼈다.
List Collection
색인(Index)을 사용하여 특정 위치에 요소를 삽입하거나 접근할 수 있으며 중복 요소를 허용한다.
ArrayList&Vector
방식의 차이만 있을 뿐 사용방법은 거의 동일하다.
ArrayList | Vector |
비동기 방식이다. 동기방식을 사용하더라도 Collections 클래스의 synchronized로 구현한다. |
동기 방식이다. 데이터의 안정화를 보장하나 성능적인 측면에서 많이 부족하다. |
ArrayList vs Array
ArrayList | Array |
사이즈가 동적이다. 추가시 메모리가 재할당되어 속도가 느리다. 다차원 구현이 불가능 하다. |
사이즈가 고정이다. 초기화시 메모리에 할당되어 속도가 빠르다. 다차원 배열을 구현할 수 있다. |
public class Main {
public static void main(String[] args) {
// Array
System.out.println("==== Array ====");
String[] strings = {"g", "f", "e", "d", "c", "b", "a", "1", "2", "3", "4"};
// sort - 전
System.out.print("sort - 전 : ");
for (String str : strings) {
System.out.print(str);
}
System.out.println();
Arrays.sort(strings);
// sort - 후
System.out.print("sort - 후 : ");
for (String str : strings) {
System.out.print(str);
}
System.out.println();
// ArrayList
System.out.println("==== ArrayList ====");
List<String> list = Arrays.asList(strings);
Collections.reverse(list);
// foreach - 1
System.out.print("foreach - 1 : ");
for (String s : list) {
System.out.print(s);
}
System.out.println();
Collections.sort(list);
// foreach - 2
System.out.print("foreach - 2 : ");
list.forEach((s) -> System.out.print(s));
}
}
==== Array ====
sort - 전 : gfedcba1234
sort - 후 : 1234abcdefg
==== ArrayList ====
foreach - 1 : gfedcba4321
foreach - 2 : 1234abcdefg
LinkedList
ArrayList는 정말로 순차적인 묶음으로 자료를 저장한다고 생각하면 되고, LinkedList는 떨어져 있는 데이터들에게 주소를 서로 연결만 시켜줬다고 생각하면 이해하기가 수월하겠다. 즉 Index 2번째 데이터를 가져오려고 한다면 ArrayList는 한 번에 2번째 데이터를 가져온다. 그러나 LinkedList는 순차적으로 데이터에 접근하기 때문에 0번째, 1번째 데이터를 다 접근한 후 2번째 데이터를 가져온다. 순차적인 것이 보장된다면 LinkedList가 성능적으로 좋을 것이고, 순차적이지 않다면 ArrayList가 더 좋다고 보면 된다. LinkedList는 순차적으로 접근하기 때문에 First In First Out인 Queue를 구현하는데 많이 사용한다.
public class Main {
public static void main(String[] args) {
// linkedList
LinkedList<String> linkedList = new LinkedList<String>();
linkedList.add(0, "첫째 - 1");
linkedList.addFirst("첫째 - 2");
linkedList.addLast("둘째 - 1");
linkedList.offer("첫째 - 3");
linkedList.add(3, "첫째 - 4");
System.out.println("==== linkedList - 1 ====");
linkedList.forEach((s) -> System.out.println(s));
System.out.println();
System.out.println("peek : " + linkedList.peek()); // 첫번째 넣은 요소 리턴
System.out.println("pop : " + linkedList.pop()); // 첫번째 넣은 요소 리턴 후 삭제
System.out.println();
System.out.println("==== linkedList - 2 ====");
linkedList.forEach((s) -> System.out.println(s));
}
}
==== linkedList - 1 ====
첫째 - 2
첫째 - 1
둘째 - 1
첫째 - 4
첫째 - 3
peek : 첫째 - 2
pop : 첫째 - 2
==== linkedList - 2 ====
첫째 - 1
둘째 - 1
첫째 - 4
첫째 - 3
'BackEnd > Java' 카테고리의 다른 글
[Java] 더 자바, Java 8 이야기 1부 - 함수형 인터페이스 & 람다 (0) | 2020.09.20 |
---|---|
[Java] 컬렉션 프레임워크(collection framework) 이야기 2부 - Set (0) | 2020.09.18 |
[Java] JUnit5 애플리케이션을 테스트하는 다양한 방법 이야기 1부 - Assertion (0) | 2020.09.15 |
[Java] 가비지 컬렉션(GC, Garbage Collection) 이란? (0) | 2020.09.10 |
[Java] 자바 가상 머신(JVM, Java Virtual Machine) 이란? (0) | 2020.09.08 |
댓글