컬렉션 프레임워크(Collection Framework)
많은 데이터들을 쉽고 효과적으로 관리할 수 있는
표준화된 방법을 제공하는 클래스 및 인터페이스의 집합
List extends Collection
구현 클래스
- ArrayList
- LinkedList
- Vector
Set extends Collection
구현 클래스
- HashSet
- TreeSet
ArrayList
컬렉션 클래스 중 가장 많이 사용되는 클래스
배열을 이용해서 값을 저장한다.
인덱스를 이용해서 각 요소에 빠르게 접근 가능하지만
크기를 변경시키기 위해서는 새로운 배열을 생성하고 기존의
값들을 옮겨야 하므로 느리다.
배열은 처음에 몇 칸을 할당할지 고정해야 하지만
ArrayList는 값을 넣는 만큼 자동으로 늘어난다.
package collection;
import java.util.ArrayList;
public class ArListTest1 {
public static void main(String[] args) {
ArrayList<String> arr1 = new ArrayList<String>();
arr1.add("Hello");
arr1.add("Java!");
arr1.add("Very");
arr1.add("Sleepy");
System.out.println(arr1);
arr1.set(3, "Happy");
System.out.println(arr1);
for (int i = 0; i < arr1.size(); i++) {
System.out.println(arr1.get(i));
}
arr1.remove(2);
System.out.println(arr1);
}
}
package collection;
import java.util.ArrayList;
public class ArListTest2 {
public static void main(String[] args) {
ArrayList<User> arr2 = new ArrayList<User>();
arr2.add(new User("apple"));
arr2.add(new User("banana"));
arr2.add(new User("cherry"));
arr2.add(new User("apple"));
System.out.println(arr2);
arr2.remove(new User("apple"));
System.out.println(arr2);
}
}
class User{
String userid;
public User(String userid) {
this.userid = userid;
}
@Override
public String toString() {
return "아이디 : " + this.userid;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof User) {
User target = (User)obj;
if(this.userid.equals(target.userid)) {
return true;
}
}
return false;
}
}
HashSet
Set은 집합이다.
집합은 중복되는 원소(요소, 값)를 담을 수 없다.
저장된 값들은 인덱스가 없기 때문에 저장 순서가 고정되어 있지 않다.
값의 중복 제거와, 유무 검사 목적이 있다.
.iterator()
순서가 없는 set 타입의 요소에 순서를 부여해주는 기능을 담당한다.
순서가 부여되면 값들을 .next()를 통해 하나씩 가져올 수 있다.
리턴타입은 Iterator<> 이다.
Set은 검색의 목적이 있기 때문에 순서 정보를 관리할 필요가 없다.
따라서 데이터의 크기에 상관없이 검색에 걸리는 시간이 매우 짧다.
반면 ArrayList는 인덱스를 관리해야 하기 때문에 상대적으로
시간이 오래 걸린다. 기능적으로 HashSet과 ArrayList로 구현한 것이
차이가 없다면 HashSet을 이용하는 것이 좋다.
package collection;
import java.util.HashSet;
import java.util.Iterator;
public class HSetTest {
public static void main(String[] args) {
HashSet<Integer> set1 = new HashSet<Integer>();
set1.add(10);
set1.add(20);
set1.add(30);
set1.add(40);
set1.add(50);
set1.add(50);
set1.add(50);
set1.add(50);
set1.add(50);
System.out.println(set1);
System.out.println(set1.size());
System.out.println(set1.contains(30));
set1.remove(30);
System.out.println(set1);
HashSet<User> set2 = new HashSet<User>();
set2.add(new User("apple"));
set2.add(new User("banana"));
set2.add(new User("apple"));
System.out.println(set2);
Iterator<Integer> iter = set1.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
iter = set1.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}
HashMap
Map구조 : Key(키)와 Value(값)가 쌍으로 저장되는 형태
Key Value
Entry fly 날다
Entry walk 걷다
Entry run 뛰다
Key와 Value가 한 쌍(Entry)으로 저장된다.
그러므로 검색에 용이하다.
Key는 중복이 불가능하며, Value는 가능하다.
따라서 Key는 Set타입이고, Value는 Collection 타입이다.
키 <-> 해쉬테이블 <-> 값
package collection;
import java.util.HashMap;
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "하나");
map.put(2, "둘");
map.put(3, "셋");
map.put(4, "넷");
map.put(5, "다섯");
map.put(2, "두울리");
System.out.println(map.get(2));
String duly = map.remove(2);
System.out.println(duly);
System.out.println(map);
System.out.println(map.remove(4, "넷"));
System.out.println(map.remove(5, "하나"));
System.out.println(map);
System.out.println(map.size());
}
}