본문으로 바로가기

[자바] 7. 컬렉션 프레임워크

category Language/자바 2021. 4. 6. 21:08
728x90
반응형
SMALL

컬렉션이란

사전적 의미로 요소를 수집해서 저장하는 것.


출처:https://coding-factory.tistory.com/550

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와 왼쪽 오른쪽 자식노드를 참조하기 위한 두개의 변수로 구성된다.

출처:https://ratseno.tistory.com/66

 관련 메서드

리턴 타입 메소드 설명
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());
		}
		
		
	}

}

728x90
반응형
LIST