public class ArrayExample {
public static void main(String[] args) {
// 배열 초기화
int[] arr = {1, 2, 3, 4, 5};
// 원소 접근
System.out.println(arr[2]); // 3
// 배열 크기
System.out.println(arr.length); // 5
// 배열 수정
arr[2] = 10;
System.out.println(arr[2]); // 10
// 배열 순회
for (int num : arr) {
System.out.print(num + " "); // 1 2 10 4 5
}
}
}
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
// 스택 초기화
Stack<Integer> stack = new Stack<>();
// 삽입 (push)
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack); // [1, 2, 3]
// 제거 (pop)
int topElement = stack.pop();
System.out.println(topElement); // 3
System.out.println(stack); // [1, 2]
// 스택 최상단 원소 확인 (peek)
System.out.println(stack.peek()); // 2
// 스택이 비었는지 확인 (isEmpty)
System.out.println(stack.isEmpty()); // false
}
}
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
// 큐 초기화
Queue<Integer> queue = new LinkedList<>();
// 삽입 (offer)
queue.offer(1);
queue.offer(2);
queue.offer(3);
System.out.println(queue); // [1, 2, 3]
// 제거 (poll)
int frontElement = queue.poll();
System.out.println(frontElement); // 1
System.out.println(queue); // [2, 3]
// 큐의 첫 번째 원소 확인 (peek)
System.out.println(queue.peek()); // 2
// 큐가 비었는지 확인 (isEmpty)
System.out.println(queue.isEmpty()); // false
}
}
import java.util.Deque;
import java.util.LinkedList;
public class DequeExample {
public static void main(String[] args) {
// 덱 초기화
Deque<Integer> deque = new LinkedList<>();
// 앞쪽 삽입 (addFirst)
deque.addFirst(1);
deque.addFirst(2);
System.out.println(deque); // [2, 1]
// 뒤쪽 삽입 (addLast)
deque.addLast(3);
System.out.println(deque); // [2, 1, 3]
// 앞쪽 제거 (removeFirst)
int front = deque.removeFirst();
System.out.println(front); // 2
System.out.println(deque); // [1, 3]
// 뒤쪽 제거 (removeLast)
int back = deque.removeLast();
System.out.println(back); // 3
System.out.println(deque); // [1]
// 첫 번째 원소 확인 (peekFirst)
System.out.println(deque.peekFirst()); // 1
// 마지막 원소 확인 (peekLast)
System.out.println(deque.peekLast()); // 1
// 덱이 비었는지 확인 (isEmpty)
System.out.println(deque.isEmpty()); // false
// 순회
deque.addFirst(2);
deque.addLast(3);
for (int num : deque) {
System.out.print(num + " "); // 2 1 3
}
}
}
데이터를 링크로 연결해서 관리하는 자료구조
자료의 순서는 정해져 있지만, 메모리상 연속성이 보장되지는 않음
연결 리스트의 장점
열결 리스트의 단점
연결 리스트 기본 구조
연결 리스트 기본 연산
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
// 연결 리스트 초기화
LinkedList<Integer> linkedList = new LinkedList<>();
// 삽입 (add)
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
System.out.println(linkedList); // [1, 2, 3]
// 특정 위치에 삽입 (add(index, value))
linkedList.add(1, 10);
System.out.println(linkedList); // [1, 10, 2, 3]
// 삭제 (remove)
linkedList.remove(1); // 인덱스 1의 원소 제거
System.out.println(linkedList); // [1, 2, 3]
// 첫 번째 요소 확인 (getFirst)
System.out.println(linkedList.getFirst()); // 1
// 마지막 요소 확인 (getLast)
System.out.println(linkedList.getLast()); // 3
// 크기 확인 (size)
System.out.println(linkedList.size()); // 3
// 순회
for (int num : linkedList) {
System.out.print(num + " "); // 1 2 3
}
}
}
import java.util.HashMap;
public class HashTableExample {
public static void main(String[] args) {
// 해시 테이블 초기화
HashMap<String, Integer> map = new HashMap<>();
// 삽입 (put)
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);
// 값 접근 (get)
System.out.println(map.get("Alice")); // 25
// 키 존재 여부 확인 (containsKey)
System.out.println(map.containsKey("Bob")); // true
// 값 존재 여부 확인 (containsValue)
System.out.println(map.containsValue(40)); // false
// 원소 제거 (remove)
map.remove("Charlie");
System.out.println(map); // {Alice=25, Bob=30}
// 모든 키와 값 순회
for (String key : map.keySet()) {
System.out.println(key + " -> " + map.get(key));
}
}
}