Collections
by 민갤
Collection Framework
데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 Collection : 다수의 데이터. 데이터 그룹
프레임웍 Framework : 표준화된 프로그래밍 방식.
java.util.Collections Class
컬렉션과 관련된 메서드를 제공한다.
fill(), copy(), sort(), binarySearch()등의 Arrays와 동일한 메서드가 있으며 같은 기능을 한다.
컬렉션의 동기화 Synchronization
멀티 쓰레드(Multi-Thread) 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에
데이터의 일관성을 유지하기 위해서 공유되는 객체를 동기화한다.
Vector, Hashtable 등의 구 버전(JDK1.2 이전) 클래스
자체적으로 동기화 처리.
멀티 쓰레드 프로그래밍이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어트린다.
ArrayList, HashMap과 같은 컬렉션
필요한 경우에만 java.util.Collections 클래스의 동기화 메서드를 이용하여 동기화 처리.
동기화 메서드
static |
synchronizedCollection(Collection |
static |
synchronizedList(List |
static <K, V> Map<K, V> | synchronizedMap(Map<K, V> m) |
static |
synchronizedSet(Set |
static <K, V> SortedMap<K, V> | synchronizedSortedMap(SortedMap<K, V> m) |
static |
synchronizedSortedSet(SortedSet |
사용하는 방법
Collection<String> c = Collections.synchronizedCollection(new Vector<String>());
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List syncList = Collections.synchronizedList(list);
변경불가 컬렉션 만들기
멀티 쓰레드 프로그래밍할 때 여러 쓰레드가 하나의 컬렉션을 공유하면서 데이터가 손상되는 것을 방지한다.
컬렉션에 저장된 데이터를 보호하기 위해 컬렉션을 읽기 전용으로 만든다.
static |
unmodifiableCollection(Collection<? extends T> c) |
static |
unmodifiableList(List<? extends T> list) |
static <K, V> Map<K, V> | unmodifiableMap(Map<? extends K, ? extends V> m) |
static |
unmodifiableSet(Set<? extends T> s) |
static <K, V> SortedMap<K, V> | unmodifiableSortedMap(SortedMap<K, ? extends V> m) |
static |
unmodifiableSortedSet(SortedSet |
싱글톤 컬렉션 만들기
'singleton'으로 시작하는 메서드.
인스턴스를 new 연산자가 아닌 메서드를 통해서만 생성하게 해서 생성할 수 있는 인스턴스의 개수를 제한하는 방법과 같은 기능을 제공한다.
반환된 컬렉션은 변경할 수 없다.
static |
singleton(T o) |
static |
singletonList(T o) |
static <K, V> Map<K, V> | singletonMap(K key, V value) |
한 종류의 객체만 저장하는 컬렉션 만들기
컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한할 때 사용한다.
JDK1.5 이전(지네릭스 도입 전)에 작성된 코드를 사용할 때 사용된다.
static |
checkedCollection(Collection |
static |
checkedList(List |
static <K, V> Map<K, V> | checkedMap(Map<K, V> m, Class |
static |
checkedSet(Set |
static <K, V> SortedMap<K, V> | checkedSortedMap(SortedMap<K, V> m, Class |
static |
checkedSortedSet(SortedSet |
사용하는 방법
ArrayList<Integer> list = new ArrayList<>();
List checkList = Collections.checkedList(list, Integer.class);
checkList.add("abs"); // error
checkList.add(1);
그 외 메서드 예제
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Integer> list = new ArrayList<>();
print(list + ""); // []
Collections.addAll(list, 1, 2, 3, 4, 5);
print(list + ""); // [1, 2, 3, 4, 5]
print(Collections.binarySearch(list, 2) + ""); // 1
Collections.rotate(list, 3);
print(list + ""); // [3, 4, 5, 1, 2]
Collections.swap(list, 0, 2);
print(list + ""); // [5, 4, 3, 1, 2]
Collections.shuffle(list);
print(list + ""); // [2, 1, 3, 5, 4]
Collections.sort(list);
print(list + ""); // [1, 2, 3, 4, 5]
Collections.sort(list, Collections.reverseOrder()); // == Collections.reverse(list);
print(list + ""); // [5, 4, 3, 2, 1]
Collections.reverse(list);
print(list + ""); // [1, 2, 3, 4, 5]
Collections.replaceAll(list, 3, 1);
print(list + ""); // [1, 2, 1, 4, 5]
Enumeration e = Collections.enumeration(list);
print(new ArrayList(Collections.list(e)) + ""); // [1, 2, 1, 4, 5]
List newList = Collections.nCopies(list.size(), 2);
print(newList + ""); // [2, 2, 2, 2, 2]
print(Collections.disjoint(list, newList) + ""); // false. 공통 요소가 없으면 true
Collections.copy(list, newList);
print(list + ""); // [2, 2, 2, 2, 2]
Collections.fill(list, 8);
print(list + ""); // [8, 8, 8, 8, 8]
}
public void print(String str) {
Log.d("TAG_", str);
}
}
• 참고 서적: 자바의 정석 3판 2