JAVA

TIL-12 컬렉션 Set, Map, List, ArrayList, Queue, Stack

다오__ 2023. 5. 23. 12:02

컬렉션

자바에서 굉장히 중요한 개념 중 하나!

자바에서 제공하는 배열은 여러가지 한계가 있다 이러한 한계(크기 자동조정, 추가, 삭제, 순회, 필터 등)를 넘을 수 있는 자료구조가 필요한 셈이다.

 

컬렉션은 여러가지 종류가 있고, 각각의 데이터를 넣고 빼는 방법이 다 다르기 때문에

어떤 컬렉션들이 있고 어떻게 사용하는지 알아보자.

 

컬렉션의 종류

List : 순서가 있는 데이터의 집합(데이터 중복 허용) - 배열과 비슷

 

Queue : 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합 = 선입선출, FIFO

 

Set : 순서가 없는 데이터의 집합(데이터 중복 허용 안함) - 순서없고 중복없는 배열

 

Map : 순서가 없는(Key Value) 쌍으로 이루어진 데이터들의 집합(Key값 중복 허용 안함)

 

Stack : 원통안에 데이터를 쌓아 넣는 것처럼 마지막으로 넣은 데이터가 가장 먼저 나온다 = 후입선출, LIFO

 

Collectoin은 기본형 변수가 아닌 참조형 변수를 저장한다.

Integer, Long, Double, String 등

 

 

List

순서가 있는 데이터의집합 -> Array: 최초 길이를 알아야함

처음에 길이를 몰라도 만들 수 있음

 

Array- > 정적 배열

List(ArrayList)->동적배열(크기가 가변)

생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아 놓는다.

값이 추가 될 때 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장하니까 상관없다.

ArrayList<Integer>intList=newArrayList<>();
intList.add(1);intList.add(2);intList.add(3);
Integernum=intList.get(0);
System.out.println(num);

//2번째있는값을바꿔보자.
intList.set(1,10);
System.out.println(intList.get(1));

//삭제
intList.remove(0);
System.out.println(intList.get(0));

//전체삭제
intList.clear();
System.out.println(intList.toString());

Linkedlist

메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아 놓는다.

실제 값이 있는 주소 값으로 목록을 구성하고 저장하는 자료 구조.

노드와 간선으로 되어있음

 

기본적기능은 -> ArrayList와 동일

linkedList는 값 -> 여기저기 나누어서 조회하는 속도가 느리다

대신에 값을 추가 하거나, 삭제 할 때는 빠르다.

LinkedList<Integer>linkedList=newLinkedList<>();
linkedList.add(1);
linkedList.add(5);
linkedList.add(10);

System.out.println(linkedList.get(0));
System.out.println(linkedList.get(1));

Stack

수직으로 값을 쌓아 놓고, 넣었다가 뺀다 LIFO

push, peek, pop

최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용

Stack<Integer>intStack=newStack<>();

intStack.push(10);
intStack.push(15);
intStack.push(1);

//다 지워질 때까지 출력
while(!intStack.isEmpty()){
//1, 15, 10순으로 출력 될 것
System.out.println(intStack.pop());
}

//다시 추가
intStack.push(10);
intStack.push(15);
intStack.push(1);

//peek:가장 위에 있는 값출 력
System.out.println(intStack.peek());

//size: 크기
System.out.println(intStack.size());

Queue

Queue: FIFO

add, peek, poll(꺼내기)

Queue: 생성자가 없는 인터페이스 <- 선언방법이 다름

Queue<Integer>intQueue=newLinkedList<>();

intQueue.add(1);
intQueue.add(5);
intQueue.add(9);

while(!intQueue.isEmpty()){
System.out.println(intQueue.poll());
}

//추가
intQueue.add(1);
intQueue.add(5);
intQueue.add(9);

//peek
System.out.println(intQueue.peek());

//size
System.out.println(intQueue.size());

Set

Set집합: 순서 없고, 중복 없음

순서가 보장 되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조

 

Set-> 그냥 쓸 수도 있음, 그러나, HashSet,TreeSet등으로 응용해서 같이 사용 가능

Set은 생성자가 없는 껍데기 <- 선언 방법이 다름

생성자가 존재하는 HashSet을 이용해서 Set을 구현해 볼 수 있다.

Set<Integer>intSet=newHashSet<>();

intSet.add(1);intSet.add(5);intSet.add(12);intSet.add(5);

for(Integervalue:intSet){
//중복된 것은 한번만 출력된다.
System.out.println(value);
}

//contains:Set내 요소 검사.
System.out.println(intSet.contains(2));
System.out.println(intSet.contains(5));

Map

Map: key - value pair -> json!!!

Key라는 값으로 unique 하게 보장이 되어야 함

Map -> HashMap, TreeMap 으로 응용

Map<String,Integer> intMap = new HashMap <>();

//키값
intMap.put("일",11);
intMap.put("이",12);
intMap.put("삼",13);
intMap.put("사",14);
intMap.put("오",15);
intMap.put("오",15);

//key값전체출력
for(Stringkey:intMap.keySet()){
System.out.println(key);
}
//value값전체출력
for(Integervalue:intMap.values()){
System.out.println(value);
}

//키가"삼"인값을출력
System.out.println(intMap.get("삼"));