Collection: 순서나 집합적인 저장공간
Map: 키와 값으로 데이터 핸들
특징: 순서를 유지하고 저장, 중복저장 가능
구현클래스: ArrayList, Vector, Stack, LinkedList 등
특징: 순서를 유지하지 않고 저장, 중복저장 불가능
구현클래스: HashSet, TreeSet 등
특징: 키(key)와 값(value)의 쌍으로 저장, 순서 유지하지 않음, 키는 중복저장 불가
구현클래스: HashMap, Hashtable, TreeMap, Properties 등
list 인터페이스는 객체를 일렬로 늘어놓은 구조이다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여된다.
객체를 인덱스로 검색,삭제할수 있는 기능을 제공한다.
ArrayList는 배열과 유사하지만 차이점은 크기이다. 배열은 크기가 고정되어있고 ArrayList는 저장용량을 초과할경우 자동으로 저장용량이 늘어난다.
List<타입 파라미터> 객체명 = new ArrayList<타입 파라미터>(초기 저장용량);
제네릭으로 되어있다.
List<String> container1 = new ArrayList<String>();
//String타입의 객체를 저장하는 ArrayList, 이때 초기 용량은 10개 객체 저장가능.
기본적으로 초기용량이 10개이지만 용량이 자동으로 늘어나기 때문에 용량의 크기를 적지않고 생성한다.
ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장됩니다. 그리고 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨집니다. 따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다는 이후에 배우게 되는 LinkedList를 사용하는 것이 좋습니다.
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java"); // String 객체 저장/추가
list.add("egg");
list.add("tree");
int size = list.size(); // 저장된 총 객체 수 얻기
String skill = list.get(0); // 0번 인덱스의 객체 얻기
for(int i = 0; i < list.size(); i++){// 저장된 총 객체 수 만큼 조회
String str = list.get(i);
System.out.println(i + ":" + str);
}
list.remove(0); // 0번 인덱스 객체 삭제
}
}
vector은 ArrayList와 동일하나, 차이점은 모든 메서드가 동기화(synchronized)메서드로 구현되어 멀티쓰레드에 적합(Tread Safe)하다는 점이다.
linkedList컬렉션은 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용한다. 특징으로는 배열에는 모든데이터가 연속적으로 존재하지만, LinkedList에는 불연속적으로 존재하며, 이데이터는 서로 연결되어있다.
그림을보면 위는 Arrayist 아래는 LinkedList이다. 편하게 위,아래라고 칭하겠다. 위는 인덱스 번호로 연결이 되어있는데 아래는 양옆끼리 연결이 되어있다. 이것이 바로 큰 차이이다. 예를 들어 위에서 1번 데이터를 지우겠다고 하면 '다'데이터가 1번이 될것이다. 하지만 아래에서는 '나'데이터를 지우겠다고 하면 '가'와 '다'데이터가 내옆에는 이제 '나'가 아니라 '다'구나?'가'구나? 이렇게 된다는점이다
예시를 통해서 우리는 ArrayList가 LinkedList보다 추가,삭제 기능이 느리다는것을알아냈다. 그렇다면 검색은 누가더 빠른가? ArrayList가 더 빠르다. ArrayList는 6번데이터를 달라고 하면 6번으로 점프해서 6번데이터를 주지만, LinkedList는 앞에서부터 일일이 세면서 데이터를 찾기 때문에 느리다.
ArrayList 데이터 추가/삭제 느림, 검색빠름
LinkedList 데이터 추가/삭제 빠름, 검색느림
따라서 데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않는다면 ArrayList를 사용하는 것이 좋다.
Set은 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는다.
또한 인덱스 정보가 없기 때문에 중복된 원소 중 특정 위치 값을 꺼낼 방법이없다.
중복 여부를 확인하기 위해선 같음을 비교할 수 있어야 함
== 또는 .equals()
HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스입니다.
HashSet<String> languages = new HashSet<String>();
이렇게 객체를 생성한후 값들을 입력시키고 출력을 하면 중복된 값 없이 램덤으로 출련된다.
Iterator it = languages.iterator();
while(it.hasNext()) {
System.out.println(it.next());
출력은 주로 Iterator를 사용해서 출력한다. (챕터 2 메서드 모음집에서 설명보기)
위의 차이점 말고는 HashSet의 기능과 완벽히 동일하다.
기본적인 객체생성 방식
Set LinkedSet1 = new LinkedHashSet();
TreeSet = Set의 기본기능 + 정렬/검색 기능추가
하지만 추가 기능은 사용하기에 조건이 있다.
방식 1.
Set <String> treeSet = new TreeSet<String>();
방식 2.
TreeSet<String> treeSet = new TreeSet<String>();
방식1은 추가된 정렬/검색 기능사용불가
방식2는 추가된 정렬기능 사용가능!
> 즉 기능을 사용하기 위해서는 TreeSet<E> 객체 타입 선언!
#### 크기비교 기준
1. Comparable<T> interface 구현
2. TreeSet 생성자 매개변수로 Comparator<T>객체 제공
```java
public class Employee implements Comparable<Employee>{
int id;
String name,department;
public Employee(int id, String name, String department) {
this.id = id;
this.name = name;
this.department = department;
}
@Override //매개변수로 받은 employee의 id와 내가 가지고있는 id의 값을 비교하는 것이다.
public int compareTo(Employee employee) {
if(id > employee.id)
return 1;
else if(id < employee.id)
return -1;
else
return 0;
}
}
Map 인터페이스는 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 그리고 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능하다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면, 기존의 값은 없어지고 새로운 값으로 대치된다.
map에서 ket와 value는 모두 객체이며, 기본타입일 수 없음
key가 다르면, 값이 같아도 다른 entry로 간주한다..
Map 인터페이스를 구현한 클래스에는 HashMap, Hashtable, TreeMap, SortedMap 등이 있다.
HashMap은 Map 인터페이스를 구현한 대표적인 클래스이다. 이해할점은 HashMap은 해시 함수
를 통해 '키'와 '값'
이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없다.
HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 한다. 동등 객체, 즉 동일한 키가 될 조건은 HashSet과 동일하다. hashCode()의 리턴값이 같아야 하고, equals() 메서드가 true를 리턴해야 한다. 이렇듯 HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.
HashMap을 생성하기 위해서는 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 된다.
Map<Key, Value> map = new HashMap<Key, Value>();
Map<Key, Value> map = new HashMap<Key, Value>(capacity, loadFactor);