IT

[스크랩] List, Map, Set

네모세모네모 2010. 3. 15. 20:58

List 계열 : AbstractList, ArrayList, LinkedList, Vector

Map 계열 : AbstractMap, Attributes, HashMap, Hashtable, IdentityHashMap, RenderingHints, TreeMap, WeakHashMap

Set계열 : AbstractSet, HashSet, LinkedHashSet, TreeSet

 

위의 List, Map,Set은 모두 Collection이라는 넘의 자식이라고 생각하시면됩니다.

말그대로... 먼가를 수집하는 박스라는 의미이죠.

 

Collection, List, Map,Set은 모두 구현되지 않은 interface입니다. 그냥 이러이러하다고 틀만 잡아놓은거죠... 이것들을 실제로 사용할 수 있게 구현한것이 위에 적어 놓은 자식들입니다.

예를들어보자면..

List a = new Vector();  --> 다형성(부모는 여러가지 자식의 형태로 나타날 수 잇다.)의 예가됩니다.

이러한 것은 가능하지만...

List a = new List();

이렇게는 사용할 수없다는 것입니다.

 

 

 

이러한 Collection 의 자식들은 자신들만의 고유한 특징을 명확히 가지게됩니다.

List :  수집의 순서가 있으며, 동일한 데이터의 중복 입력이 가능합니다.

          순차적으로 대량의 데이터를 억세스하거나 입력할때 유리한 방식입니다.

 

Map : Key & Value의 형태로 입력이되며, 키값을 입력하면 해당하는 value값을 획득할 수있습니다. 수집의 순서를 기억하지 않으며, 동일한 데이터를 Key값으로 사용할 수 없습니다. (물론 key값이 틀리고 value값이 동일한건 가능합니다.)

다건의 데이터에서 원하는 특정 데이터에 접근(검색)할 때 유리한 방식입니다. 

 

Set : 중복데이터를 불허하는 것을 제외하고는 큰 특징이 없습니다.

      입력되는 당시의 순서에는 따르지 않으나... 순차적인 접근을 위해서는 Iterator로 접근하게됩니다.

 

그리고 각가의 구현 class들의 특징도 조금씩이나마 차이가 발생합니다.

음.. 예만 들어보자면... 같은 Map 계열임에도 불구하고.. HashMap은 데이터 입출력이 동기화되지 않고 처리속도가 빠른 반면  HashTable은 모든 입출력이 동기화(토근을 부여받아 순차적으로 객체에 접근)되며 처리속도는 다소 떨어지게됩니다.

 

그외 List계열의 Vector와 ArrayList도 Vector가 synchronized(동기화) 되는 반면 ArrayList는 그렇지 않다는 정도입니다.(물론 특정상황에서는 이것이 매우 중요한 문제가 될 수 있습니다.)

 

-------------------------------------------------------------------------------

* 성능의 관점은 3가지 정도로 나눠야 합니다.

 

 

- 저장시간(insert time)

- 검색시간(seek time)

- 읽는 시간(read time)

 

 

각 컬렉션 클래스들은 위의 관점에 대해서 장단점을 가지고 있습니다.

 

Hash계열(Hashtable, HashMap)이 검색에서는 제일 빠릅니다.

 

대신 저장시간은 제일 오래걸립니다.(전화번호부와 같이 검색이 중요한 곳에서는 유리하고,

 

증권시스템같이 동시에 많은 수의 데이터를 처리해야하는 경우에는 불리하겠죠.)

 

 

TreeMap과 같은 Sorted계열은 저장시간은 Hash계열보다 빠르고, 검색시간은 Hash계열보다 조금 느린

 

저장과 검색에 균형잡힌 성능을 제공합니다.

 

TreeMap은 정렬된 상태로 데이터를 저장하기 때문에, 범위검색(Range Search)기능을 제공합니다.

 

 

 

검색없이 데이터를 저장하고, 읽어오는 거라면 역시 Vector와 ArrayList가 좋겠지요.

 

더 최적화가 필요하다면 원초적인 Object배열을 직접 만들어서 구현해야하고요.

 

그러나 Vector와 ArrayList는 이미 최적화 되어 있기 성능이 매우 좋습니다.

 

 

읽는 시간은 큰 차이 없이 비슷합니다만 아무래도 배열, ArrayList가 조금더 빠르겠지요.

 

동기화, 저장시간, 검색시간이 어떤 컬렉션을 선택해서 사용할 것인지 결정하는 주요요소입니다.

 

 

각 컬렉션 클래스의 특징을 알고 그에 맞는 것을 선택해서 쓰면 됩니다.

단순히 어떤 것이 빠르다 느리다라고하는 할 수 없는 겁니다.

 

 

* Vector 사용 예 - 펌

출처 : http://blog.naver.com/dolicom?Redirect=Log&logNo=11519151

다이나믹 메모리를 관리하는 방식의 자바 프로그램으로 Vector을 사용하면 편리하다.
 
생성 : Vector v = new Vector( 1, 1 );
요소 추가 : v.addElement(Object o);
 
 
import! java.util.*;
public class TestVector {

 public static void main( String[] args ) {
  int inum = 10;
  float pi = 3.14159265358f;
  char  letter[] = { 'g', 'o', 'o', 'd' };
  String str = "Hi there!";
  // Vector 객체 생성
  Vector v = new Vector( 1, 1 );
 
  // Vector에 Object 저장
  v.addElement(  "처음입력" );
  v.addElement( new Integer( 5 ));
  v.addElement( new Integer( inum ));
  v.addElement( new Float(pi) );
  v.addElement( letter );
  v.addElement( str );
  v.addElement( new Date() );
  v.addElement( "마지막 입력" );
 
  // Vector의 size를 저장
  int length = v.size();
  System.out.println( "Vector v size = " + length );
 
  // get() 메소드를 이용한 Vector의 Obejct 출력
  System.out.println( );
  System.out.println( "*** v.get() ***");
  for ( int i=0 ; i < v.size(); i++ ) {
     System.out.println( "v.get(" + i + ") " + v.get( i ));
  }
  System.out.println( );
  System.out.println( "*** v.get() Object 구별하기 ***");
  Object lobj;
  for (int i=0 ; i < v.size(); i++ ) {
     lobj =  v.elementAt(i);
     if (lobj instanceof String)
       System.out.println( "v.elementAt(" + i + ") String = " + lobj );
     else if (lobj instanceof Integer)
       System.out.println( "v.elementAt(" + i + ") Integer = " + lobj );
     else if (lobj instanceof Float)
       System.out.println( "v.elementAt(" + i + ") Float = " + lobj );
     else if (lobj instanceof char[])
       System.out.println( "v.elementAt(" + i + ") char[] = " + new String((char[])lobj) );
     else if (lobj instanceof Date)
       System.out.println( "v.elementAt(" + i + ") Date = " + lobj );
     else
       System.out.println( "v.elementAt(" + i + ") Unkown = " + lobj );
  }
 
  System.out.println( );
  System.out.println( "*** Using Enumeration ***");
  // Vector의 Object의 나열형을 리턴
  Enumeration e = v.elements();
 
  while( e.hasMoreElements() ) { // Enumeration을 이용해 Vector의 Object를 출력
     lobj = e.nextElement();
     if (lobj instanceof char[])
        System.out.println( String.copyValueOf((char[]) lobj) );
     else
         System.out.println( lobj.toString() );
  }
  System.out.println( "*** Using Enumeration 2 ***");
  for (e = v.elements() ; e.hasMoreElements() ;) {
     System.out.println(e.nextElement());
  }
 }
}
 
 
D:\tips\vector> java TestVector

Vector v size = 8
*** v.get() ***
v.get(0) 처음입력
v.get(1) 5
v.get(2) 10
v.get(3) 3.1415927
v.get(4) [C@26e431
v.get(5) Hi there!
v.get(6) Sun Apr 03 16:51:17 KST 2005
v.get(7) 마지막 입력
 
*** v.get() Object 구별하기 ***
v.elementAt(0) String = 처음입력
v.elementAt(1) Integer = 5
v.elementAt(2) Integer = 10
v.elementAt(3) Float = 3.1415927
v.elementAt(4) char[] = good
v.elementAt(5) String = Hi there!
v.elementAt(6) Date = Sun Apr 03 16:51:17 KST 2005
v.elementAt(7) String = 마지막 입력
 
*** Using Enumeration ***
처음입력
5
10
3.1415927
good
Hi there!
Sun Apr 03 16:51:17 KST 2005
마지막 입력
*** Using Enumeration 2 ***
처음입력
5
10
3.1415927
[C@26e431
Hi there!
Sun Apr 03 16:51:17 KST 2005
마지막 입력

 


 
  <%
        }else{
 for(int i=0; i ProductBean product = (ProductBean)vResult.get(i);
  %>

출처 : 주식&프로그래밍&DB 자료
글쓴이 : shin 원글보기
메모 :