형식 foreach: for (int i : arr) {...}
반복자의 형태:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}
5. ArrayList 및 LinkedList
ArrayList와 LinkedList는 사용법에는 차이가 없지만 기능에는 여전히 차이가 있습니다. LinkedList는 추가 및 삭제가 많지만 쿼리 작업이 거의 없는 상황에서 자주 사용되는 반면 ArrayList는 그 반대입니다.
6. 맵 컬렉션
구현 클래스: HashMap, Hashtable, LinkedHashMap 및 TreeMap
HashMap
HashMap은 키의 HashCode 값에 따라 데이터를 저장하며 그 값은 다음과 같습니다. 키에 따라 직접 획득되며, 접근 속도가 빠르고, 통과 시 데이터 획득 순서가 완전히 무작위입니다. 키 객체는 반복될 수 없기 때문에 HashMap은 하나의 레코드의 키만 최대 Null로 허용하고, 여러 레코드의 값은 Null로 허용합니다.
Hashtable
Hashtable은 HashMap과 유사합니다. HashMap의 스레드 안전 버전은 스레드 동기화를 지원합니다. 즉, 언제든지 하나의 스레드만 Hashtable에 쓸 수 있으며, 이로 인해 Hashtale이 Dictionary 클래스에서 상속되기 때문에 속도가 느려집니다. 동시에 기록된 키나 값이 null이 되는 것을 허용하지 않는 것이 효율적입니다.
ConcurrentHashMap
스레드로부터 안전하고 잠금으로 구분됩니다. ConcurrentHashMap은 내부적으로 세그먼트를 사용하여 이러한 다양한 부분을 나타냅니다. 각 세그먼트는 실제로 작은 해시 테이블이며 자체 잠금을 갖습니다. 여러 수정 작업이 서로 다른 세그먼트에서 발생하는 한 동시에 발생할 수 있습니다.
LinkedHashMap
LinkedHashMap은 Iteraor로 LinkedHashMap을 순회할 때 반드시 먼저 얻은 레코드가 먼저 삽입됩니다. 순회 중에는 HashMap보다 느리며 HashMap의 모든 특성을 갖습니다.
TreeMap
TreeMap은 키에 따라 저장하는 레코드를 정렬할 수 있는 SortMap 인터페이스를 구현합니다. 기본값은 키 값의 오름차순(자연 순서)입니다. 정렬 비교기를 사용하여 지정할 수도 있습니다. TreeMap을 통과하면 얻은 레코드가 정렬됩니다. 키 값은 비동기식일 수 없습니다.
map traversal
첫 번째 유형: KeySet()
Map의 모든 키를 세트 컬렉션에 저장하세요. 세트에는 반복자가 있기 때문입니다. 모든 키는 반복적으로 검색한 다음 get 메서드를 기반으로 검색할 수 있습니다. 각 키에 해당하는 값을 가져옵니다. keySet(): 반복 후에는 get()을 통해서만 키를 얻을 수 있습니다.
데이터 행의 기본 키를 얻을 때 HashMap.keySet() 메서드를 사용하고 이 메서드에서 반환된 Set 결과의 데이터가 순서대로 정렬되어 있으므로 얻은 결과는 순서가 틀립니다.
일반적인 사용법은 다음과 같습니다:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put(" key3" ,"lisi3");
map.put("key4","lisi4");
//먼저 지도 컬렉션에 있는 모든 키의 집합 컬렉션을 가져옵니다. keyset()
Iterator it = map.keySet() .iterator() ;
//반복자를 가져옵니다
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}
두 번째:entrySet()
Set>entrySet() //이 맵에 포함된 매핑 관계의 Set 뷰를 반환합니다. (관계는 키-값 쌍입니다) 즉, (키-값) 전체가 Set 컬렉션에 일대일로 저장됩니다. Map.Entry는 매핑 관계를 나타냅니다. EntrySet(): 반복 후 e.getKey() 및 e.getValue()를 통해 키와 값을 얻을 수 있습니다. 반환되는 것은 Entry 인터페이스입니다.
일반적인 사용법은 다음과 같습니다:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put(" key3" ,"lisi3");
map.put("key4","lisi4");
//지도 컬렉션에서 매핑 관계를 꺼내어 집합 컬렉션에 저장합니다
Iterator it = map.entrySet() .iterator() ;
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out.println("Key"+e.getKey () + "값은 " + e.getValue ());
}
두 번째 방법인 EntrySet() 방법을 사용하는 것이 더 효율적입니다.
keySet은 실제로 두 번 순회됩니다. 한 번은 반복자로 변환하고, 한 번은 HashMap에서 키 값을 검색합니다. 엔트리 세트는 처음에만 순회하므로 키와 값을 모두 항목에 넣기 때문에 속도가 더 빠릅니다. 두 순회 간의 순회 시간 차이는 여전히 분명합니다.
7. 주요 구현 클래스
Vector와 ArrayList
1의 차이점 요약 Vector는 스레드 동기식이므로 스레드로부터 안전하지만 arraylist는 스레드 비동기식이므로 안전하지 않습니다. 스레드 안전 요소를 고려하지 않는 경우 일반적으로 arraylist를 사용하는 것이 더 효율적입니다.
2. 컬렉션의 요소 수가 현재 컬렉션 배열의 길이보다 큰 경우 벡터 증가율은 현재 배열 길이의 100%이고 arraylist 증가율은 현재 배열 길이의 50%입니다. 컬렉션에서 상대적으로 많은 양의 데이터를 사용하는 경우 벡터를 사용하면 몇 가지 이점이 있습니다.
3. 특정 위치에서 데이터를 찾는 경우 벡터와 arraylist가 사용하는 시간은 동일합니다. 데이터에 자주 액세스하는 경우 이때는 벡터와 arraylist를 모두 사용할 수 있습니다. 그리고 지정된 위치를 이동하면 이후의 모든 요소가 이동하게 되는 경우, 지정된 위치의 데이터만 이동하고 다른 요소는 이동하지 않으므로 이때 linklist 사용을 고려해야 합니다.
ArrayList와 Vector는 배열을 사용하여 데이터를 저장합니다. 배열 요소의 개수는 실제 저장된 데이터보다 커서 요소를 추가하고 삽입할 수 있습니다. 둘 다 요소의 직접 일련 번호 인덱싱을 허용하지만 데이터를 삽입하려면 배열 이동과 같은 메모리 작업이 필요합니다. Vector는 동기화된 방법(스레드 안전성)을 사용하므로 ArrayList보다 성능이 나쁩니다. LinkedList는 저장을 위해 양방향 연결 목록을 사용합니다. 역방향 순회가 가능하지만, 데이터 삽입 시에는 레코드만 필요합니다. 이 항목의 앞, 뒤 용어만으로도 충분하므로 여러 번 삽입하는 것이 더 빠릅니다.
arraylist 및 linkedlist
1.ArrayList는 동적 배열 기반의 데이터 구조를 구현하고, LinkedList는 연결된 목록 기반의 데이터 구조를 구현합니다.
2. 무작위 액세스를 가져오고 설정하려면 LinkedList가 포인터를 이동해야 하기 때문에 ArrayList가 LinkedList보다 낫습니다.
3. 신규 및 삭제 작업 추가 및 제거의 경우 ArrayList가 데이터를 이동해야 하기 때문에 LinedList가 유리합니다. 이는 실제 상황에 따라 다릅니다. 단일 데이터만 삽입하거나 삭제하는 경우 ArrayList가 LinkedList보다 빠릅니다. 그러나 데이터를 무작위로 일괄적으로 삽입하고 삭제하는 경우 ArrayList에 비해 LinkedList의 속도가 훨씬 빠릅니다. 왜냐하면 ArrayList에 데이터 조각이 삽입될 때마다 삽입 지점과 그 이후의 모든 데이터를 이동해야 하기 때문입니다.
HashMap 및 TreeMap
1. HashMap은 해시코드를 사용하여 콘텐츠를 빠르게 검색하는 반면, TreeMap의 모든 요소는 특정 고정 순서를 유지합니다. 정렬된 결과를 얻으려면 TreeMap을 사용해야 합니다(HashMap에서는 요소의 순서가 그렇지 않습니다.) 결정된).
2. Map에서 요소를 삽입, 삭제 및 찾으려면 HashMap이 최선의 선택입니다. 그러나 자연 순서나 사용자 정의 순서로 키를 반복하려면 TreeMap이 더 좋습니다. HashMap을 사용하려면 추가된 키 클래스가 hashCode() 및 equals() 구현을 명확하게 정의해야 합니다.
두 맵의 요소는 동일하지만 순서가 다르기 때문에 hashCode()가 다릅니다.
동일한 테스트를 수행합니다.
HashMap에서는 동일한 값의 맵이 다른 순서이고 같음은 false입니다.
treeMap에서 동일한 값의 맵은 다른 순서이고 같음은 true입니다. 이는 treeMap이 true임을 나타냅니다. equals( )에 순서가 있습니다.
HashTable 및 HashMap
1. Hashtable은 스레드로부터 안전합니다. 즉, HashMap은 스레드로부터 안전하고 동기적이지 않습니다.
2. HashMap은 하나의 null 키와 여러 개의 null 값을 허용합니다.
3. 해시테이블의 키와 값은 null이 될 수 없습니다.