List
- 중복을 허용하면서 저장순서
ArrayList
- ArrayList 크기는 가변적으로 변함
- ArrayList에 지정한 Capacity 이상을 저장하려고 할 때 메모리에 추가로 할당합니다.
List<Integer> list = new ArrayList<>()
Integer형태의 배열 생성된다.- 배열 크기가 넘어가는 데이터가 들어오면 사이즈가 2배로 늘어난다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Example05 {
public static void main(String[] args) {
System.out.println("### list1 ###");
List<String> list = new ArrayList();
list.add("red");
list.add("green");
list.set(0,"white");
list.add("blue");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}
System.out.println("### remove white element ###");
list.remove("white");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}
System.out.println("### contains green element");
System.out.println( list.contains("green") );
}
}
set을 통해 List해당 자리의 값을 변경할 수 있고, remove를 통해 해당 값을 list에서 삭제할수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Example06 {
private static final int ARRAY_MAX_SIZE = 10000000;
public static void main(String[] args) {
long start = System.currentTimeMillis();
int[] arr = new int[ARRAY_MAX_SIZE];
for(int i=0; i<ARRAY_MAX_SIZE; i++) arr[i]=i;
long end = System.currentTimeMillis();
long result = end - start;
System.out.println("array-run-time: "+result);
start = System.currentTimeMillis();
ArrayList<Integer> arr2 = new ArrayList<>();
for(int i=0;i<ARRAY_MAX_SIZE;i++) arr2.add(i);
end = System.currentTimeMillis();
result = end -start;
System.out.println("arrayList-run-time: "+result);
}
}
ArrayList의 경우 사이즈가 늘어날때 마다 크기를 늘리기 때문에 list와 비교했을때 15배 이상 시간이 소요되는 것을 알 수 있다.
1
2
array-run-time: 20
arrayList-run-time: 307
- 타입을 적는 이유
1 2 3 4 5 6 7 8 9 10 11 12 13 14
public class Test{ public static void main(String[] args) { List list = new ArrayList<>(); User user = new User("name",20); list.add(user); list.add(10); } } class User{ String name; int age; //... Getter , Constructor }
- 위와 같이 list 타입을 선언 안할 경우 어떤 타입이든 모두 넣을 수 있다. 그러면 왜 타입을 지정하는가?
- 타입을 지정하지 않으면 모든 타입을 넣을수 있어서 좋아 보일 수 있다.
- 하지만 User에 있는 Getter를 list를 통해 호출할려고 하면 할수가 없다. 그이유는 User라는 타입으로 저장되는 것이 아닌 Object 타입으로 저장되기 때문이다.
Vactor
- Vector Collection Framework가 추가되기전 추가된 레거시 클래스 입니다.
- Vector는 재너릭을 사용할 수 있도록 설계 되었습니다.
- Arraylist와 유사함, 크기가 가변적으로 변경됨
- Multi-Thread 환경에서 안전함
- 동기화 비용에 발생하여 ArrayList 보다 성능이 떨어진다.
- Multi-Thread 환경에서 안전함
Stack
- Stack은 Vector를 상속한 클래스
- Stack은 나중에 입력된 데이터가 가장 먼저 나오는 LIFO 구조를 가지고 있다.
Comparable
- Java에서 객체는 Comparable 인터페이스를 구현하면 비교할 수 있습니다.