JAVA 컬렉션 프레임웍 List Set Map
컬렉션 프레임웍: 다수의 객체를 다루기 위한 표준화된 프로그래밍 방식
List<E> | 순서O 데이터의 집합으로, 데이터의 중복O (허용함.) ex)대기자 명단 |
Vector, ArrayList, LinkedList, Stack, Queue |
Set<E> | 순서X 데이터의 집합으로, 데이터의 중복X (허용하지 않음.) ex)소수의 집합, 네발동물 집합 |
HashSet, TreeSet |
Map<K, V> | 키와 값의 한 쌍으로 이루어지는 데이터의 집합으로, 순서가 없음. 키-중복X 값-중복O ex)우편번호, 지역번호(전화번호) |
HashMap, TreeMap, Hashtable, Properties |
Collection인터페이스 메서드
메서드 | 설명 |
boolean add(Object o) boolean addAll(Collectionc) |
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가한다. |
void clear() | Collection의 모든 객체를 삭제한다. |
boolean contains(Object o) boolean containsAll(Collection c) |
지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다. |
boolean equals(Object o) | 동일한 Collection인지 비교한다. |
int hashCode() | Collection의 hash code를 반환한다. |
boolean isEmpty() | Collection이 비어있는지를 확인한다. |
Iterator iterator() | Collection의 Iterator를 얻어서 반환한다. |
boolean remove(Object o) | 지정된 객체를 삭제한다. |
boolean removeAll(Collection c) | 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제한다. 이 작업으로 인해 Collection에 변화가 있으면 true를 그렇지 않으면 false를 반환한다. |
int size() | Collection에 저장된 객체의 개수를 반환한다. |
Object[] toArray() | Collection에 저장된 객체를 객체배열(Object[])로 반환한다. |
Object[] toArray(Object[] a) | 지정된 배열에 Collection의 객체를 저장해서 반환한다. |
List인터페이스 메서드(순서O, 중복O)
메서드 | 설명 |
void add(int index, Object element) boolean addAll(int index, Collection c) |
지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가한다. |
Object get(int index) | 지정된 위치(index)에 있는 객체를 반환한다.(읽기) |
int indexOf(Object o) | 지정된 객체의 위치(index)를 반환한다.(검색) (List의 첫 번째 요소부터 순방향으로 찾는다.) |
int lastIndexOf(Object o) | 지정된 객체의 위치(index)를 반환한다.(검색) (List의 마지막 요소부터 역방향으로 찾는다.) |
ListIterator listIterator() ListIterator listIterator(int index) |
List의 객체에 접근할 수 있는 ListIterator를 반환한다. |
Object remove(int index) | 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환한다. |
Object set(int index, Object element) | 지정된 위치(index)에 객체(element)를 저장한다.(변경) |
void sort(Comparator c) | 지정된 비교자(comparator)로 List를 정렬한다. |
List subList(int fromIndex, int toIndex) | 지정된 범위(fromIndex부터 toIndex)에 있는 객체를 반환한다.(from~to) |
Vector
동기화O
ArrayList
동기화X, 배열기반, 접근성이 뛰어나지만 중간지점에서의 추가, 삭제에 불리

LinkedList
연결기반(기차모양),접근성은 떨어지지만 비순차적 추가,삭제에 유리
Stack
LIFO 구조. 마지막에 저장된 것을 제일 먼저 꺼내게 된다.객체생성
(수식 계산, 수식 괄호 검사, undo/redo, 뒤로/앞으로(웹브라우저))
boolean empty() | Stack이 비어있는지 알려준다. |
Object peek() | Stack의 맨 위에 저장된 객체를 반환. pop()과 달리 Stack에서 객체를 꺼내지는 않음. |
Object pop() | Stack의 맨 위에 저장된 객체를 꺼낸다.(삭제) |
Object push(Object item) | Stack에 객체(item)를 저장한다. |
int search(Objecy o) | Stack에서 주어진 객체(o)를 찾아서 그 위치를 반환. 못찾으면 -1을 반환한다 |
Queue
FIFO 구조. 제일 먼저 저장한 것을 제일 먼저 꺼내게 된다.
인터페이스로, 객체생성이 아니라
(최근 사용 문서, 인쇄 작업 대기목록, 버퍼(buffer))
boolean add(Object o) | 지정된 객체를 Queue에 추가한다. |
Object remove() | Queue에서 객체를 꺼내 반환. 비어있으면 예외발생(=>try-catch) |
Object element() | 삭제없이 요소를 읽어 온다. |
boolean offer(Object o) | Queue에 객체를 저장. |
Object poll() | Queue에서 객체를 꺼내서 반환. 비어있으면 null반환 |
Object peek() | 삭제없이 요소를 읽어 온다.(그냥 보는거) |
Set인터페이스 메서드(순서X, 중복X)
메서드 | 설명 |
boolean add(Object o) | 지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가한다. |
void clear() | Collection의 모든 객체를 삭제한다. |
boolean contains(Object o) | 지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다. |
boolean equals(Object o) | 동일한 Collection인지 비교한다. |
int hashCode() | Collection의 hash code를 반환한다. |
boolean isEmpty() | Collection이 비어있는지를 확인한다. |
Iterator iterator() | Collection의 Iterator를 얻어서 반환한다. |
boolean remove(Object o) | 지정된 객체를 삭제한다. |
int size() | Collection에 저장된 객체의 개수를 반환한다. |
Object[] toArray() | Collection에 저장된 객체를 객체배열(Object[])로 반환한다. |
Object[] toArray(Object[] a) | 지정된 배열에 Collection의 객체를 저장해서 반환한다. |
- 집합과 관련된 메서드(Collection에 변화가 있으면 true, 아니면 false를 반환)
메서드 | 설명 |
boolean addAll(Collection c) | 지정된 Collection(c)의 객체들을 Collection에 추가한다 (합집합) |
boolean containsAll(Collection c) | 지정된 Collection의 객체들이 Collection에 포함되어 있는지 확인한다 (부분집합) |
boolean removeAll(Collection c) | 지정된 Collection에 포함된 객체들을 삭제한다 (차집합) |
boolean retainAll(Collection c) | 지정된 Collection에 포함된 객체만을 남기고 나머지는 Collection에서 삭제한다 (교집합) |
HashSet
순서X, 중복X
저장 전에 같은 객체 있는지 확인해줘야 함(있으면 저장X)
이때, equals()와 hashCode()로 확인해줘야 하기 때문에 둘다 오버라이딩 해주기.

import java.util.*;
class Ex11_11 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("abc"); //저장O
set.add("abc"); //저장X(중복이라서)
set.add(new PersonA("David",10));//저장O
set.add(new PersonA("David",10));//저장O //오버라이딩 후 저장X
//=>중복 안댈라면 equals()와 hashCode()를 오버라이딩 해야함
System.out.println(set);
}
}
class PersonA {
String name;
int age;
@Override
public int hashCode() {
// int hash(Object... values); =>가변인자
return Objects.hash(name, age);
//iv비교! 객체를 구별하는 기준이 iv이므로.
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof PersonA)) return false;
PersonA p = (PersonA)obj;
//나자신(this)의 이름과 나이를 p와 비교
//Object에는 name,age가 없기때문에 Person으로 형변환 해서 비교해주는거임
return this.name.equals(p.name) && this.age==p.age;
}
PersonA(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
import java.util.*;
class Ex11_12 {
public static void main(String args[]) {
HashSet setA = new HashSet(); //=>12345
HashSet setB = new HashSet(); //=>45678
HashSet setHab = new HashSet();
HashSet setKyo = new HashSet();
HashSet setCha = new HashSet();
setA.add("1"); setA.add("2"); setA.add("3");
setA.add("4"); setA.add("5");
System.out.println("A = "+setA);
setB.add("4"); setB.add("5"); setB.add("6");
setB.add("7"); setB.add("8");
System.out.println("B = "+setB);
//교집합
Iterator it = setB.iterator();//반복하면서 데이터에 접근하게 해줌
while(it.hasNext()) { //읽어올 요소가 있는지 확인
Object tmp = it.next(); //하나씩 꺼냄
if(setA.contains(tmp)) //setA에 4가 포함되어있으면
setKyo.add(tmp); //setKyo에 넣음
}
//차집합
it = setA.iterator();
while(it.hasNext()) {
Object tmp = it.next();
if(!setB.contains(tmp)) //setB에 4가 포함되어있지 않으면
setCha.add(tmp); //저장
}
//합집합(걍 다 넣음)
it = setA.iterator();
while(it.hasNext())
setHab.add(it.next());
it = setB.iterator();
while(it.hasNext())
setHab.add(it.next());
System.out.println("A ∩ B = " + setKyo);
System.out.println("A U B = " + setHab);
System.out.println("A - B = " + setCha);
}
}
TreeSet
중복X
범위 검색과 정렬에 유리.(이진트리로 구현됨)
주요 생성자와 메서드
생성자 또는 메서드 | 설명 |
TreeSet() | 기본 생성자 |
TreeSet(Collection c) | 주어진 컬렉션을 저장하는 TreeSet을 생성 |
TreeSet(Comparator comp) | 주어진 정렬 기준으로 정렬하는 TreeSet을 저장 |
Object first() | 정렬된 순서에서 첫 번째 객체를 반환한다. |
Object last() | 정렬된 순서에서 마지막 객체를 반환한다. |
Object ceilling(Object o) | 지정된 객체와 같은 객체를 반환. 없으면 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환. 없으면 null |
Object floor(Object o) | 지정된 객체와 같은 객체를 반환. 없으면 작은 값을 가진 객체 중 제일 가까운 값의 객체를 봔한. 없으면 null |
Object higher(Obejct o) | 지정된 객체보다 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환. 없으면 null |
Object lower(Obejct o) | 지정된 객체보다 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환. 없으면 null |
SortedSet subSet(Obejct fromElement, Object toElement) | 범위 검색(fromElement와 toElement사이)의 결과를 반환한다. 끝 범위인 toElelment는 범위에 포함되지 않음) |
SortedSet headSet(Object toElement) | 지정된 객체보다 작은 값의 객체들을 반환한다. |
SortedSet tailSet(Object fromElement) | 지정된 객체보다 큰 값의 객체들을 반환한다. |
범위 검색 subSet(), headSet(), tailSet()
메서드 | 설명 |
SortedSet subSet(Object fromElement, Object toElement) | 범위 검색(fromElement와 toElement사이)의 결과를 반환한다. (끝 범위인 toElement는 범위에 포함되지 않음) |
SortedSet headSet(Object toElement) | 지정된 객체보다 작은 값의 객체들을 반환한다. |
SortedSet tailSet(Object fromElement) | 지정된 객체보다 큰 값의 객체들을 반환한다. |
import java.util.*;
class Ex11_13 {
public static void main(String[] args) {
// Q.()에 정렬기준이 없는데도 어떻게 비교해서 리턴해주는겨?
Set set = new TreeSet(); //정렬 되어있음
// Set set = new HashSet(); //정렬 따로 해야됨.
for (int i = 0; set.size() < 6 ; i++) {
int num = (int)(Math.random()*45) + 1;
// A.Integer가 이미 Comparable을 갖고있는애라서.
set.add(num); // set.add(new Integer(num));
}
System.out.println(set);
}
}
Map인터페이스 메서드(순서X,중복-키X/값O)
메서드 | 설명 |
void clear() | Map의 모든 객체를 삭제한다. |
boolean containsKey(Object key) | 지정된 key 객체와 일치하는 Map의 key 객체가 있는지 확인한다.(검색) |
boolean containsValue(Object value) | 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인한다.(검색) |
Set entrySet() | Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환한다.(읽기) |
boolean equals(Object o) | 동일한 Map인지 비교한다. |
Object get(Object key) | 지정한 key 객체에 대응하는 value객체를 찾아서 반환한다.(검색) |
int hashCode() | 해시코드를 반환한다. |
boolean isEmpty() | Map이 비어있는지 확인한다. |
Set keySet() | Map에 저장된 모든 key객체를 반환한다.(읽기-key) |
Object put(Object key, Object value) | Map에 value객체를 key객체에 연결(mapping)하여 저장한다.(추가) |
void putAll(Map t) | 지정된 Map의 모든 key-value쌍을 추가한다. |
Object remove(Object key) | 지정한 key객체와 일치하는 key-value객체를 삭제한다. |
int size() | Map에 저장된 key-value쌍의 개수를 반환한다. |
Collection values() | Map에 저장된 모든 value객체를 반환한다.(읽기-value) |
HashMap<K, V>
key 중복X / value 중복O
해싱기법으로 데이터를 저장함.(키와 값을 쌍으로 저장)
배열장점+링크드리스트 장점, 검색기능이 향상됨. 동기화X

import java.util.*;
class Ex11_16 {
public static void main(String[] args) {
HashMap map = new HashMap();
// 키값이 같은걸 또 넣는다고 에러가 뜨진 않고, 그냥 새로 변경되어 저장됨
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234");
System.out.println("map= "+map);
Scanner s = new Scanner(System.in); // 화면으로부터 라인단위로 입력받는다.
while(true) {
System.out.println("id와 password를 입력해주세요.");
System.out.print("id :");
String id = s.nextLine().trim();//trim()으로 앞뒤 공백제거
System.out.print("password :");
String password = s.nextLine().trim();
System.out.println();
// id가 없으면
if(!map.containsKey(id)) {
System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
continue;
}
// 내가 asdf를 입력했으면 get()메서드는 1234를 반환한다.
// 이때, 1234랑 입력받은 password가 다르면!
if(!(map.get(id)).equals(password)) {
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
} else {
System.out.println("id와 비밀번호가 일치합니다.");
break;
}
} // while
} // main의 끝
}
Hashtable<K, V>
해싱함수로 데이터가 저장되는 곳.
TreeMap<K, V>
Comparator와 Comparable
객체를 정렬하는 데 필요한 메서드를 정의한 인터페이스(정렬 기준을 제공)
Comparable 기본 정렬 기준을 구현하는 데 사용->자기 자신과 매개변수 객체를 비교
-구현방법 : 정렬할 객체에 Comparable interface를 implements 후, compareTo() 메서드를 오버라이드하여 구현한다.
-compareTo() 메서드 작성법
현재 객체 < 파라미터로 넘어온 객체: 음수 리턴
현재 객체 == 파라미터로 넘어온 객체: 0 리턴
현재 객체 > 파라미터로 넘어온 객체: 양수 리턴
음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 바뀐다.
Comparator 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용->두 매개변수 객체를 비교
-구현방법 : Comparator interface를 implements 후 compare() 메서드를 오버라이드한 myComparator class를 작성한다.
@Override
public int compareTo(StudentA s) {
return name.compareTo(s.name);
}
import java.util.*;
class Ex11_7 {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
// strArr정렬. 사전순,대문자가 우선임
Arrays.sort(strArr); // String가 Comparable(기본정렬기준)을 가지고 있어서 정렬기준 없이도 정렬가능한.
System.out.println("strArr=" + Arrays.toString(strArr));
// sort(정렬대상, 정렬기준)
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); //대소문자 구분안함
System.out.println("strArr=" + Arrays.toString(strArr));
Arrays.sort(strArr, new Descending()); //역순 정렬
System.out.println("strArr=" + Arrays.toString(strArr));
}
}
class Descending implements Comparator { //Comparator구현해줘야 함.
public int compare(Object o1, Object o2){
if( o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
// 기본정렬기준 * -1
return c1.compareTo(c2) * -1 ; //-1을 곱해서 기본 정렬방식의 역으로 변경한다.(음수,양수 바뀜)
//또는 c2.compareTo(c1)와 같이 순서를 바꿔도 된다.
}
return -1;
}
}
Iterator
컬렉션에 저장된 데이터를 접근하는 데 사용되는 인터페이스(Enumeration, Iterator, ListIterator)
Map에는 interator()가 없기때문에 keySet(), sentrySet(), values()를 호출해야 한다.
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다. |
Object next() | 다음 요소를 읽어온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다. |
void remove() | next()로 읽어온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야 한다.(선택적 기능) |
void forEachRemaining(Consumer<? super E> action) | 컬렉션에 남아 있는 요소들에 대해 지정된 작업(action)을 수행한다. 람다식을 사용하는 디폴트 메서드. (JDK1.8부터 추가) |
import java.util.*;
public class Ex11_5 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
// 하나씩 읽어오기
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
// 또 읽는건 안됨. 이미 한번 읽어서 false뜸
// 다 읽었으면 다시 얻어와야돼 iterator는 1회용이야
it = list.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
// 이렇게 읽으면 소모 없이 동작하긴 하는데
// iterator를 HashSet으로 바꾸면 hashSet에는 get이 없어서 동작하지 않게됨
for(int i=0; i<list.size(); i++) {
Object obj = list.get(i);
System.out.println(obj);
}
}
}
Collections
컬렉션을 위한 메서드 제공.
동기화 할 때 사용하는 메서드
static Collection synchronizedCollection(Collection c)
static List synchronizedList(List list)
static Set synchronizedSet(Set set)
static Map synchronizedMap(Map map)
static SortedSet synchronizedSortedSet(SortedSet s)
static SortedMap synchronizedSortedMap(SortedMap m)
// 사용방법
List syncList = Collections.synchronizedList(New ArrayList(...));
//List 동기화된리스트 = Collections.synchronizedList(동기화 되지 않은 리스트);
한 종류의 객체만 저장하는 컬렉션 만들기
static Collection checkedCollection(Collection c, Class type)
static List checkedList(List list, Class type)
static Set checkedSet(Set s, Class type)
static Map checkedMap(Map m, Class keyType, Class valueType)
static Queue checkedQueue(Queue queue, Class type)
static NavigableSet checkedNavigableSet(NavigableSet s, Class type)
static SortedSet checkedSortedSet(SortedSet s, Class type)
static NavigableMap checkedNavigableMap(NavigableMap m, Class keyType, Class valueType)
static SortedMap checkedSortedMap(SortedMap m, Class keyType, Class valueType)
List list = new ArrayList();
List checkedList = checkedList(list, String.class); //list에 String만 저장 가능
checkedList.add("abc");
checkedList.add(new Integer(3)); //에러. ClassCastException 발생