TIL-12 컬렉션 Set, Map, List, ArrayList, Queue, Stack
컬렉션
자바에서 굉장히 중요한 개념 중 하나!
자바에서 제공하는 배열은 여러가지 한계가 있다 이러한 한계(크기 자동조정, 추가, 삭제, 순회, 필터 등)를 넘을 수 있는 자료구조가 필요한 셈이다.
컬렉션은 여러가지 종류가 있고, 각각의 데이터를 넣고 빼는 방법이 다 다르기 때문에
어떤 컬렉션들이 있고 어떻게 사용하는지 알아보자.
컬렉션의 종류
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("삼"));