자바에서는 데이터를 저장하고 조작하기 위한 자료구조를 Collection으로 제공합니다. 앞서 살펴봤던 선형구조의 자료구조뿐만 아니라
Set
,Map
등도 살펴볼 예정입니다.
-
: 연관관계) value
를 나열하며, Map은 key-value
쌍으로 이루어져 있습니다.기본 자료형 (pirmitive type)
- 문자형 :
char
- 정수형 :
byte
,short
,int
,long
- 실수형 :
float
,double
- 논리형 :
boolean
Wrapper Class
로 기본 자료형을 참조 자료형의 형태로 변환
- 문자형 :
Character
(특수)- 정수형 :
Byte
,Short
,Integer
(특수),Long
- 실수형 :
Float
,Double
- 논리형 :
Boolean
ArrayList
Vector
LinkedList
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
ArrayList<Integer> arrayList = new ArrayList<>();
ArrayList<Integer> arrayListFixedSize = new ArrayList<>(5); // 크기 고정(배열)
ArrayList<> arrayList1 = new ArrayList<Integer>(); // 오류1
ArrayList<int> arrayList2 = new ArrayList<int>(); // 오류2
}
}
오류1 : 선언시 객체 타입을 명시해야 합니다.
오류2 : 기본 자료형을 사용할 수 없습니다.
import java.util.ArrayList;
public class ListExample {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(3);
arrayList.add(2);
arrayList.add(4);
arrayList.add(1);
arrayList.add(5);
System.out.println("-------------확장 for문-------------");
for (int data : arrayList) {
System.out.println(data);
}
arrayList.remove((Integer) 4); // 2)방법
arrayList.remove(2); // 1)방법
System.out.println("-------------정수 예제-------------");
for (int index = 0; index < arrayList.size(); index++) {
System.out.println("인덱스 [" + index + "]의 값 " + arrayList.get(index));
}
System.out.println("-------------String 예제-------------");
ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("a");
stringArrayList.add("c");
stringArrayList.add("b");
stringArrayList.add("c");
stringArrayList.add("c");
stringArrayList.remove("c"); // 2)방법
stringArrayList.remove(0); // 1)방법
for (int index = 0; index < stringArrayList.size(); index++) {
System.out.println("인덱스 [" + index + "]의 값 " + stringArrayList.get(index));
}
}
}
-------------확장 for문-------------
1
3
2
4
1
5
-------------정수 예제-------------
인덱스 [0]의 값 1
인덱스 [1]의 값 3
인덱스 [2]의 값 1
인덱스 [3]의 값 5
-------------String 예제-------------
인덱스 [0]의 값 b
인덱스 [1]의 값 c
인덱스 [2]의 값 c
확장 for문 : 데이터를 앞에서 부터 순차적으로 탐색합니다.
int
, Integer
등 기본 자료형, 참조 자료형 모두 사용 가능합니다.remove()
: 데이터를 삭제하는 ArrayList 메서드
index
를 활용한 삭제Object
값을 활용한 삭제synchronized
를 포함한 메서드로 구현되어 있기 때문에 두 개 이상의 쓰레드에서 같은 메서드를 실행할 때, 하나의 쓰레드에서 사용을 마친 뒤 다른 쓰레드에서 사용할 수 있게 된다.import java.util.Stack;
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
Vector<Integer> v = new Stack<>();
stack.add(1);
stack.add(2);
stack.add(3);
stack.add(4);
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
4
3
2
1
Queue
의 구현에 많이 사용된다.import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class LinkedListExample {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
LinkedList<Integer> linkedList = new LinkedList<>();
Queue<Integer> queue = new LinkedList<>();
list.add(1);
list.add(2);
// list.offer(3); //오류
System.out.println("-------------List-----------");
for (int num : list) {
System.out.println(num);
}
linkedList.add(1);
linkedList.add(2);
linkedList.offer(3);
linkedList.poll();
linkedList.remove();
System.out.println("-------------LinkedList-----------");
for (int num : linkedList) {
System.out.println(num);
}
queue.add(1);
queue.add(2);
queue.offer(3);
queue.poll();
queue.remove();
System.out.println("-------------Queue-----------");
for (int num : queue) {
System.out.println(num);
}
}
}
-------------List-----------
1
2
-------------LinkedList-----------
3
-------------Queue-----------
3
List
로 선언시, offer()
, poll()
, peek()
등의 메서드를 사용할 수 없습니다. 즉, LinkedList
만의 메서드가 있습니다.<메서드 차이점> : 위의 메서드는
null
에 대해서boolean
값으로 처리하지만, 기존의add()
,remove()
는 예외 처리를 합니다.
HashSet
TreeSet
LinkedHashSet
Set
의 구현체HashTable
에 자료 저장package set;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetExample {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(0);
hashSet.add(4);
hashSet.add(5);
hashSet.add(5);
hashSet.add(2);
hashSet.add(1);
hashSet.add(3);
Iterator<Integer> it = hashSet.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
0
1
2
3
4
5
중복된 값을 넣어도 오류는 발생하지 않지만, 하나의 데이터만 저장된 모습을 볼 수 있습니다.
iterator
를 활용하고 hasNext() : boolean
과 next() : Object
를 사용합니다.
//...
HashSet<String> stringHashSet = new HashSet<>();
stringHashSet.add("a");
stringHashSet.add("b");
if (stringHashSet.contains("a")) {
System.out.println("존재");
}
if (!stringHashSet.contains("c")) {
System.out.println("존재 x");
}
//...
존재
존재 x
데이터의 존재 유무를 확인할 때 유용하다. ⇒ 시간복잡도 O(1)
Set
은 순서가 유지가 되지 않지만, TreeSet
의 값은 내부 정렬 알고리즘으로 인해 정렬됩니다.red-black tree
타입으로 값이 저장 (레드-블랙 트리 참조)HashSet
보다 성능은 좋지 않습니다.import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("a"); //97
treeSet.add("A"); //65
treeSet.add("b"); //98
treeSet.add("c"); //99
treeSet.add("0"); //48
Iterator<String> it = treeSet.iterator();
while (it.hasNext()) {
String next = it.next();
System.out.println(next + " " + (int) next.charAt(0));
}
}
}
0 48
A 65
a 97
b 98
c 99
Collection
은 데이터를 값(value)으로 표하는 것에 반해, Map
은 키-값(key-value)으로 표현됩니다.HashMap
HashTable
TreeMap
Map
의 구현체null
허용 (HashTable, TreeMap과의 차이점)import java.util.*;
public class HashMapExample {
public static void main(String[] args) {
Map<Integer, String> hm = new HashMap<>();
Map<Integer, String> ht = new Hashtable<>();
hm.put(1, "a");
hm.put(null, "b");
//ht.put(null, "b"); // 1)
hm.put(3, "c");
hm.put(4, "d");
hm.put(5, "e");
hm.put(3, "f"); // 2)
hm.put(0, "aa");
if (hm.containsKey(1)) { // 3)
System.out.println(hm.get(1));
}
if (!hm.containsKey(6)) { // 4)
System.out.println(hm.get(6));
}
System.out.println("-------------hm.keySet()-----------");
for (Integer integer : hm.keySet()) {
System.out.println(integer);
}
System.out.println("-------------hm.values()-----------");
for (String value : hm.values()) {
System.out.println(value);
}
System.out.println("-------------hm.entrySet()-----------");
for (Map.Entry<Integer, String> entry : hm.entrySet()) {
System.out.println(entry);
}
System.out.println("-------------갯수 관련 알고리즘에 자주 사용되는 메서드(getOrDefault())-----------");
HashMap<String, Integer> hmCnt = new HashMap<>();
ArrayList<String> strs = new ArrayList<>();
strs.add("one");
strs.add("two");
strs.add("three");
strs.add("three");
for (String str : strs) {
hmCnt.put(str, hmCnt.getOrDefault(str, 0) + 1);
}
for (Map.Entry<String, Integer> entry : hmCnt.entrySet()) {
System.out.println(entry);
}
}
}
a
null
-------------hm.keySet()-----------
null
0
1
3
4
5
-------------hm.values()-----------
b
aa
a
f
d
e
-------------hm.entrySet()-----------
null=b
0=aa
1=a
3=f
4=d
5=e
-------------갯수 관련 알고리즘에 자주 사용되는 메서드(getOrDefault())-----------
one=1
two=1
three=2
NullPointerException
발생3 - “c”
→ 3 - "f"
)로 삽입됩니다.containsKey(K)
null
리턴HashMap
의 정보를 나열하는 메서드입니다.TreeMap
은 레드-블랙 트리로 값이 저장됩니다. 또한, TreeMap
, HashTable
은 null 처리를 못하고 예외가 발생합니다. (따로 예제는 없습니다.)