컬렉션이란❓❓❓
사전적 의미로 요소를 수집해서 저장하는 것.
Collection
*List : 순서를 유지하고 저장, 중복 저장 가능
**ArrayList
List 인터페이스의 구현 클래스로서 그냥 List는 생성시 크기가 고정되며 사용 중 크기를 변경할 수 없으나
ArrayList는 저장 용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어남
otherwise!
ArrayList는 객체를 추가할 때 인덱스 0부터 차례대로 저장되며 삭제시 삭제된 공간을 채우기 위하여 뒤에있던 데이터 들이 앞당겨 진다.
이 때문에 빈번한 객체 삭제와 삽입이 일어나는 곳에서 사용은 바람직하지 않으며 이런 경우 LinkedList를 사용하길 권장한다.
허나 인덱스 검색, 맨 마지막에 객체를 추가하는 경우라면 ArrayList가 더 좋은 성능을 발휘한다.
**Vector
ArrayList와 동일한 내부 구조를 갖고 있음
다른 점은 동기화된 메소드로 구성되어 있기에 스레드가 동시에 이 메소드를 실행할 수 없고 , 하나의 스레드가 실행 을 완료 해야만이 다른 스레드가 실행됨
**LinkedList
ArrayList와 사용 방법은 동일하나 내부 구조는 다르다.
ArrayList는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리
특정 인덱스의 객체를 제거 하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않기에
삽입과 삭제가 빈번히 일어나는 곳에선 ArrayList보다 좋은 성능을 발휘함.
import java.util.ArrayList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> list1=new ArrayList<String>();
List<String> list2=new ArrayList<String>();
long startTime;
long endTime;
startTime=System.nanoTime();
for(int i=0; i<10000; i++) {
list1.add(0,String.valueOf(i));
}
endTime=System.nanoTime();
System.out.println("ArrayList 걸린시간: "+(endTime-startTime)+" ns");
startTime=System.nanoTime();
for(int i=0; i<10000; i++) {
list2.add(0,String.valueOf(i));
}
endTime=System.nanoTime();
System.out.println("LinkedList 걸린시간: "+(endTime-startTime)+" ns");
}
}
구분 | 순차적 추가/삭제 | 중간에 추가/삭제 | 검색 |
ArrayList | 빠르다 | 느리다 | 빠르다 |
LinkedList | 느리다 | 빠르다 | 느리다 |
*Set : 순서를 유지하지 않고 저장, 중복 저장 안됨
**HashSet
객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻은후 이미 저장되어 있는 객체들의 해시코드와 비교한다 .
만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
*Map
키와 값 쌍으로 저장, 키는 중복저장 안됨
만약 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됨
**HashMap
해시 맵의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의하여 동등 객체가 될 조건을 정해야 한다.
즉) 동일한 키가 될 조건은 hashCode()의 리턴 값이 같아야 하며, equals() 메소드가 true를 리턴해야한다.
(해시맵 예제)
package Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapExample {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("신용권", 85);
map.put("윤주영", 90);
map.put("박광철", 80);
map.put("윤주영", 70); //"윤주영" 키가 같기 때문에 제일 마지막에 저장한 값으로 대치
map.put("김경테", 95);
System.out.println("총 enrty 수: "+map.size());
System.out.println("\t윤주영 : "+map.get("윤주영"));
System.out.println();
//1.객체를 하나씩 처리
Set<String> keySet=map.keySet();
Iterator<String> key=keySet.iterator();
while(key.hasNext()) {
String KEY=key.next();
int value=map.get(KEY);
System.out.println("\t"+KEY+ " : "+value);
}
System.out.println();
map.remove("홍길동");
System.out.println("총 엔트리 수: "+map.size());
//2.객체를 하나씩 처리
Set<Map.Entry<String, Integer>> entrySet=map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator=entrySet.iterator();
while(entryIterator.hasNext()) {
Map.Entry<String, Integer>entry=entryIterator.next();
String Ekey=entry.getKey();
Integer Evalue=entry.getValue();
System.out.println("\t" +Ekey +":"+Evalue);
}
System.out.println();
//객체 삭제
map.clear();
System.out.println("총 엔트리 수 : "+map.size());
}
}
**Hashtable
키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 하는것은 HashMap 과 일치하며 차이점은 해시 테이블은 동기화된 메소드로 구성되어 있어서 멀티스레드가 동시에 이 메소드를 실행할 수 없으며 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.
(해시테이블 로그인 예제)
package Collection;
import java.util.Hashtable;
import java.util.Map;
import java.util.Scanner;
public class HashtableExample {
public static void main(String[] args) {
Map<String,String> map=new Hashtable<String,String>();
map.put("spring", "12");
map.put("summer", "123");
map.put("fail", "1234");
map.put("winter", "12345");
Scanner sc=new Scanner(System.in);
while(true){
System.out.println("아이디와 비밀번호를 입력해주세요");
System.out.println("아이디: ");
String id=sc.nextLine();
System.out.println("비밀번호: ");
String password=sc.nextLine();
System.out.println();
if(map.containsKey(id)) {
if(map.get(id).equals(password)) {
System.out.println("로그인 되었습니다.");
break;
}else {
System.out.println("비밀번호가 일치하지 않습니다.");
}
}else {
System.out.println("아이디가 존재하지 않습니다.");
}
}
}
}
**Properties
Hashtable의 하위 클래스 이기 때문에 해시 테이블의 모든 특징을 그대로 가지고 있다.
주로 어플리케이션의 옵션 정보, DB 연결정보, 다국어 정보가 저장된 프로퍼티(~.properties) 파일을 읽을때 주로 사용
*이진트리구조
**TreeSet : 이진 트리를 기반으로 한 Set 컬렉션이다.
하나의 노드는 노드값은 value와 왼쪽 오른쪽 자식노드를 참조하기 위한 두개의 변수로 구성된다.
관련 메서드
리턴 타입 | 메소드 | 설명 |
E | first() | 제일 낮은 객체 리턴 |
E | last() | 제일 높은 객체 리턴 |
E | lower(E e) | 주어진 객체보다 바로 아래 객체를 리턴 |
E | higher(E e) | 주어진 객체보다 바로 위 객체를 리턴 |
(TreeSet 예제)
package Collection;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Integer>scores=new TreeSet<Integer>();
scores.add(new Integer(87));
scores.add(new Integer(98));
scores.add(new Integer(78));
scores.add(new Integer(95));
scores.add(new Integer(80));
scores.add(new Integer(70));
Integer score=null;
score=scores.first();
System.out.println("가장 낮은 점수: "+score);
score=scores.last();
System.out.println("가장 낮은 점수: "+score);
score=scores.lower(new Integer(98));
System.out.println("98점 아래 점수: "+score);
score=scores.higher(new Integer(70));
System.out.println("70점 위의 점수: "+score);
score=scores.floor(new Integer(95));
System.out.println("95점 이거나 아래의 점수: "+score);
score=scores.ceiling(new Integer(70));
System.out.println("70점 이거나 바로 위의 점수: "+score+"\n");
while(!scores.isEmpty()) {
score=scores.pollFirst();
System.out.println(score+"남은 객체수: "+scores.size());
}
}
}
'Language > 자바' 카테고리의 다른 글
[자바]9. 자바 명명 규칙 정리 (0) | 2021.07.13 |
---|---|
[자바]8. hashCode() 와 equals()의 차이 (0) | 2021.04.22 |
[자바]6. 표준API의 함수적 인터페이스 (0) | 2021.04.03 |
[자바]5. 람다(Lamda) (0) | 2021.04.02 |
[자바]4.제네릭(Generic) (0) | 2021.03.29 |