본문 바로가기
몰입형학습

[Java]컬렉션 프레임워크

by jackypark 2022. 7. 7.

List

- 자료가 나열된구조

- Interface이다 상속받은 클래스이 구현을 해놓았다

- 배열도 list (배열과 list의 차이는 공간이 동적이냐 정적이냐 차이다)

대표적 구현 클래스: ArrayList<E>, Vector<E>, LinkedList<E>

메소드설명

   
boolean add(E e) 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)
void add(int index, E e) 해당 리스트의 특정 위치에 전달된 요소를 추가함. (선택적 기능)
boolean addAll(Collection<? Extends E>  c    매개변수로 입력된 컬렉션 전체를 마지막에 추가/ 넣을값이 없으면 false반환
void clear() 해당 리스트의 모든 요소를 제거함. (선택적 기능)
boolean contains(Object o) 해당 리스트가 전달된 객체를 포함하고 있는지를 확인함.
boolean equals(Object o) 해당 리스트와 전달된 객체가 같은지를 확인함.
E get(int index) 해당 리스트의 특정 위치에 존재하는 요소를 반환함.
boolean isEmpty() 해당 리스트가 비어있는지를 확인함.
boolean remove(Object o) 해당 리스트에서 전달된 객체를 제거함/ 삭제할값이없으면 false 반환
boolean remove(int index) 해당 리스트의 특정 위치에 존재하는 요소를 제거함. (선택적 기능)
E set(int index, E e) 해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함. (선택적 기능)
int size() 해당 리스트의 요소의 총 개수를 반환함.
Object[] toArray() 해당 리스트의 모든 요소를 Object 타입의 배열로 반환함. (배열크기 자동변환 크기만큼)

ArrayList<E> vs Vector<E>

-위둘은 기능적으로는 동일한 기능을 수행한다

-Vector은 멀티쓰레드 환경에서도 사용할 수 있도록 만든것이다.(동기화가능)

-ArrayList는 원래 동기화가 안되지만 collection class를 통해서 동기화기능을 사용할 수 있다.

 

ArrayList<E> vs LinkedList<E>

-삽입삭제가 빠른건 LinkedList ( Why? :  LinkedList는 각 원소 앞뒤 객체 정보만 수정하면 되기 때문)

-검색이 빠른건 ArrayList ( Why? : ArrayList는 인덱스 번호를 갖고 있어서 특정 인덱스 위치의 데이터를 빠르게 찾을 수 있음)


Set<E>

-집합의특징 가짐(동일한 Data를 허용하지 않는다.)

-Interface이다 상속받을 클래스가 구현해놓음

-주머니에서 안보고 막 사탕 뽑는거임(그니깐 순서가 항상 다름)

-Set은 값을 넣을때마다 중복확인을 하지만 정렬은 보장하지않는다. 중복검사 때문에 List<E>보다 느리다.

대표적 클래스: HashSet<E>, LinkedHashSet<E>, TreeSet<E>

 

주요 메소드

boolean add(E element) 매개변수로 입력된 원소를 리스트에 추가
// 중복된값이 있으면False 반환
boolean addAll(Collection<? Extends E> c) 매개변수로 입력된 컬렉션 전체를 추가
boolean remove(Object o) 원소중 매개변수 입력과 동일한 개체 삭제
void clear() 전체 원소 삭제
boolean isEmpty() Set<E> 객체가 비어 있는지 여부를 리턴
boolean contains(Object o) 매개변수로 입력된 원소가 있는지 여부를 리턴
int size() 리스트 객체 내에 포함된 원소의 개수
Iterator<E> iterator() Set<E> 객체 내의 데이터를 연속해 꺼내는 Iterator객체 리턴
Object[] toArray() 리스트를 Object 배열로 변환
T[] toArray(T[] t) 입력매개변수로 전달한 타입의 배열로 변환

 

HashSet<E>

-주요 메소드

boolean hasNext() : 다음으로 가르킬 원소의 존재여부를 boolean으로 리턴 (false 리턴할시 마지막 데이터까지 읽은것임)

E next(): 다음 원소 위치로 가서 읽은 값을 리턴

-Iterator<E> 객체가 생성되면 객체가 가르키고 있는 위츠는 첫 원소 위치가 아닌 첫 원소 바로 이전의 위치값이다.

즉, Iterator.next()를 하면 첫번째 원소값을 읽을 수 있게됨.

-중복 확인 매커니즘:  if A a1=new A(3) 과 A a2=new A(3)이라는 값이있다고 가정.. 과연 HashSet 입장에서는 같은거라고 인식할까? 생성자에 동일한 값을 넘겨 객체를 생성했으므로 두 객체는 완벽히 똑같이 생겼지만 답은 아니요이다.

마땅한 오버라이딩을 하지않았다면  아래있는 형태 일것이다.

    public boolean equals(Object obj) {
        return (this == obj);
    }

참조자료형의 등가연산은 위치값을 비교한다. 고로 a1와 a2의 위치는 엄연히 다름으로 false가 반환되어 같지 않다고 판단될것이다. 그러면 String의 경우는 어떠할까? String 은 오버라이딩이 아래코드 처럼 되어있다.

   //equals 오버라이딩
  
   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (!COMPACT_STRINGS || this.coder == aString.coder) {
                return StringLatin1.equals(value, aString.value);
            }
        }
        return false;
    }
    // 해쉬코드 오버라이딩
        public int hashCode() {
        // The hash or hashIsZero fields are subject to a benign data race,
        // making it crucial to ensure that any observable result of the
        // calculation in this method stays correct under any possible read of
        // these fields. Necessary restrictions to allow this to be correct
        // without explicit memory fences or similar concurrency primitives is
        // that we can ever only write to one of these two fields for a given
        // String instance, and that the computation is idempotent and derived
        // from immutable state
        int h = hash;
        if (h == 0 && !hashIsZero) {
            h = isLatin1() ? StringLatin1.hashCode(value)
                           : StringUTF16.hashCode(value);
            if (h == 0) {
                hashIsZero = true;
            } else {
                hash = h;
            }
        }
        return h;
    }

위 오버라이딩을 통해서 HashSet에서 같은 String값을 비교할경우 true가 반환되어 중복을 확인한다.

 

LinkedHashSet<E>

-HashSet과 다르게 입력된 순서를 기억하고 있다( 출력순서가 입력순서와 같다) means that its not randomly pick up

But List<E> 처럼 중간에 데이터를 추가 or 특정순서에 저장된 값을 가져오는것은 불가능하다.

- 위 특징빼고는 HashSet과 유사하다.

 

TreeSet<E>

-데이터 입력 순서와 상관없이 크기순으로 출력( 즉 두 객체의 크기 비교함)

-정렬과 검색 기능 가능 (NavigableSet<E>와 SortedSet<E>를 부모 인터페이스로 두고 있기 때문)

-위 특징때문에 객체 타입을선언할때 반드시 TreeSet<E>로 객체 타입을 선언해야 정렬검색기능을 사용 할 수 있다.

-자동으로 오름차순으로 데이터를 정렬해 저장

주요 메소드

E first() Set 원소 중 가장 작은 원소값 리턴
E last() Set 원소 중 가장 큰 원소값 리턴
E lower(E element) 매개변수로 입력된 원소보다 작은, 가장 큰수 (ex lower(3)//2
E higher(E element) 매개변수로 입력된 원소보다 큰, 가장 작은 수(ex higer(3)//4
E floor(E element) 매개변수로 입력된 원소보다 같거나 작은 가장 큰 수
E ceiling(E element) 매개변수로 입력된 원소보다 같거나 큰 가장 작은 수
E pollFirst() Set 원소들 중 가장 작은 원소값을 꺼내 리턴
E pollLast() Set 원소들 중 가장 큰 원소값을 꺼내 리턴
SortedSet<E> headSet(E toElement) toElement 미만인 모든 원소로 구성된 Set을 리턴
(toElement 미포함)
NavigableSet<E> headSet(E toElement,boolean inclusive) toElement 미만/이하인모든 원소로 구성된 Set을 리턴
(inclusive=true면 toElement포함 false면 미포함)
SortedSet<E> tailSet(E fromElement) toElement 이상인 모든 원소로 구성된 Set을 리턴
(fromElement 미포함)
NavigableSet<E> tailSet(E fromElement,boolean inclusive) toElement 초과/이상인모든 원소로 구성된 Set을 리턴
(inclusive=true면 fromElement포함 false면 미포함)
SortedSet<E> subSet(E fromElement,E toElement) fromElement 이상 toElement미만인 원소들로 이뤄진 Set을 리턴(fromElement 포함,toElement 미포함)
NavigableSet<E> subSet
(E fromElement, boolean frominclusive,
E toElement, boolean toinclusive)
fromElement 초과/이상 toElement 미만/이하인 원소들로 이뤄진 Set을 리턴(fromclusive=true/false면 fromElement 포함/미포함, toclusive=true/false면 toElement 포함/미포함)
NavigableSet<E> descendingSet() 현재 정렬 기준을 반대로 변환(오름-> 내림 or 내림->오름)

-데이터 크기 비교: Integer일시 숫자 크기순으로 저장 String일시 사전 순서로 저장


Map<K,V>

-Key값은 중복허용하지않는다

-Value는 중복허용을 한다.

-구현 클래스로는 HashMap<K,V> , LinkedHashMap<K,V> , Hashtable<K,V> , TreeMap<K,V> 가 있다.

주요메소드

V put(K key,V value) 입력매개변수의 (key,value)를 Map객체에 추가
void putAll(Map<? extends K, ? extends V> m) 입력매개변수의 map객체를 통째로 추가
V replace(K key,V value) Key에 해당하는 값을 Value값으로 변경(old값 리턴) 해당키없으면 null 리턴
boolean replace(K key, V oldValue, V newValue) (key,oldValue)의 쌍을 갖는 엔트리에서 oldValue를 newValue로 변경(단, 해당엔트리가 없으면 false를 리턴)
V get(Object key) 매개 변수의 Key값에 해당하는 Value를 리턴
boolean containsKey(Object key) 매개변수의 Key값이 포함돼 있는지 여부(잇으면 true 반환)
containsValue(Object value) 매개변수의 Value값이 포함돼 있는지 여부
Set<K> keySet() map 데이터들 중 key들만 뽑아 Set 객체로 리턴
Set<Entry<K,V>> entrySet() Map의 각 엔트리들을 Set객체로 담아 리턴
int size() Map에 포함된 엔트리의 개수
Collection<V> values 저장된 모든값을 Collection에 담아서 리턴
V remove(Object key) 입력매개변수의 Key를 갖는 엔트리 삭제(단 ,해당Key가 없으면 아무런 동작을 하지 않음)
boolean remove(Object key, Object Value) 입력매개변수의  (key,value)를 갖는 엔트리 삭제( 단, 해당 엔트리가 없으면 아무런 동작을 하지 않음)
void clear() Map 객체 내의 모든 데이터 삭제  

HashMap<K,V> 의 중복 메커니즘은 HashSet<E> 중복매커니즘 과정의 내용과 동일하다, 다만 Key에만 적용한것이다

map.put(new Student(1,"홍길동"),95);
map.put(new Student(1,"홍길동"),95);

위코드를 보면 중복된것으로 인정되서 
map.size를 구하면 1인 나온다
-이것이 자바다 745쪽 참고

Hashtable<K,V>

-HashMap<K,V>와 다른점은 멀티 쓰레드에도 안전하다 차이이다.(동기화가 가능하다는말이다)-thread safe

 

LinkedHashMap<K,V>

-HashSet<E>와 LinkedHashSet<E> 관계의 동일개념을 가지고있다. 누구와? HashMap과 LinkedHashMap과

-LinkedHashSet<E> 처럼 입력된 순서를 기억하고 있음

 

Treemap<K,V>

-Map<K,V>의 기본 기능 + 정렬 및 검색 기능 추가

-Data를 Key값의 크기 순으로 저장

- TreeSet<E>의 메소드와 매우 비슷 차이점은 Data가 (Key, Value)쌍의 엔트리 형태로 저장되기 떄문에 key와 엔트리에 데이터를 검색하거나 추출하는 메소드가 포함된다는 점이다.

 

-주요 메소드

Map.Entry<K, V> ceilingEntry(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K ceilingKey(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함.
만약 해당하는 키가 없으면 null을 반환함.
void clear() 해당 맵(map)의 모든 매핑(mapping)을 제거함.
boolean containsKey(Object key) 해당 맵이 전달된 키를 포함하고 있는지를 확인함.
boolean containsValue(Object value) 해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.
NavigableMap<K, V> descendingMap() 해당 맵에 포함된 모든 매핑을 역순으로 반환함.
Set<Map.Entry<K, V>> entrySet() 해당 맵에 포함된 모든 매핑을 Set 객체로 반환함.
Map.Entry<K, V> firstEntry() 해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환함.
K firstKey() 해당 맵에서 현재 가장 작은(첫 번째) 키를 반환함.
Map.Entry<K, V> floorEntry(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K floorKey(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함.
만약 해당하는 키가 없으면 null을 반환함.
V get(Object key) 해당 맵에서 전달된 키에 대응하는 값을 반환함.
만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.
SortedMap<K, V> headMap(K toKey) 해당 맵에서 전달된 키보다 작은 키로 구성된 부분만을 반환함.
Map.Entry<K, V> higherEntry(K key) 해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K higherKey(K key) 해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함.
만약 해당하는 키가 없으면 null을 반환함.
Set<K> keySet() 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.
Map.Entry<K, V> lastEntry() 해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환함.
K lastKey() 해당 맵에서 현재 가장 큰(마지막) 키를 반환함.
Map.Entry<K, V> lowerEntry(K key) 해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K lowerKey(K key) 해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함.
만약 해당하는 키가 없으면 null을 반환함.
Map.Entry<K, V> pollFirstEntry() 해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함.
Map.Entry<K, V> pollLastEntry() 해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함.
V put(K key, V value) 해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.
V remove(Object key) 해당 맵에서 전달된 키에 대응하는 매핑을 제거함.
boolean remove(K key, V value) 해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.
V replace(K key, V value) 해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.
boolean replace(K key, V oldValue, V newValue) 해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.
int size() 해당 맵의 매핑의 총 개수를 반환함.
SortedMap<K, V> subMap(K fromKey, K toKey) 해당 맵에서 fromKey부터 toKey까지로 구성된 부분만을 반환함.
이때 fromKey는 포함되나, toKey는 포함되지 않음.
SortedMap<K, V> tailMap(K fromKey) 해당 맵에서 fromKey와 같거나, fromKey보다 큰 키로 구성된 부분만을 반환함.

 

'몰입형학습' 카테고리의 다른 글

GET 방식과 Post 방식  (0) 2022.09.04
OSI 계층 모델 7계층 ~  (0) 2022.09.04
[Java] 모듈화( method and function) and Class and this의 이해  (0) 2022.06.27
[JAVA] 배열정리+ String 객체이해  (0) 2022.06.23
진법변환  (0) 2022.06.23

댓글