Map 인터페이스, HashMap 소스 코드 상세 설명
34480 단어 자바 집합 프레임 워 크
집합 프레임 워 크 맵 을 보면 Map 은 collection 의 하위 인터페이스 로 key - value 키 가 맞 는 형식 으로 데 이 터 를 저장 합 니 다.
1. 특징:
,
null
2. 상용 방법 소개
put(key,value);//삽입 키 - 값 쌍 int size();//map 에 키 쌍 의 개 수 를 저장 합 니 다 get(Object key);//키 를 통 해 값 찾기 boolean isEmpty () / / 판정 공 boolean contains Value (Object value) / / 값 이 존재 하 는 지 판단 하기 boolean containsKey (Object key) / / 키 가 존재 하 는 지 판단 하기 remove (Object key) / / 키 를 통 해 키 쌍 을 삭제 합 니 다. 3. hashMap 집합 에 대한 옮 겨 다 니 기 (세 가지 방식)
Iterator<Map.Entry<String,String>> iterator = hashMap.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> next = iterator.next();
String key = next.getKey();
String value = next.getValue();
System.out.print(key+":"+value+".");
}
Iterator<String> iterator1 = hashMap.keySet().iterator();
while(iterator1.hasNext()){
String next = iterator1.next();
System.out.print(next+".");
}
Iterator<String> iterator2 = hashMap.values().iterator();
while(iterator2.hasNext()){
String next = iterator2.next();
System.out.print(next+" ");
}
4. JDK 1.7 소스 코드 분석
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>,
Cloneable, Serializable
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
16
static final int MAXIMUM_CAPACITY = 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
-》
static final Entry<?,?>[] EMPTY_TABLE = {};
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
static class Entry<K,V>{
final K key; // key( )
V value; // value( )
Entry<K,V> next; //next
int hash; // key hash
1。 、
public HashMap(int initialCapacity, float loadFactor) {
//
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
// 、
this.loadFactor = loadFactor;
threshold = initialCapacity;
init();
}
2。
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
3。
public HashMap() {
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}
4。 map
public HashMap(Map<? extends K, ? extends V> m) {
this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
inflateTable(threshold);
putAllForCreate(m);
}
//
table , ,
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];// table
transfer(newTable, initHashSeedAsNeeded(newCapacity));
table = newTable;
threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}
// transfer :( CPU 100%)
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry<K,V> e : table) {
while(null != e) {
Entry<K,V> next = e.next;
if (rehash) {
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
// ,
void createEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
size++;}
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null) //key null
return putForNullKey(value);
//key null
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
//key null :
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key);
return null == entry ? null : entry.getValue();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Map 인터페이스, HashMap 소스 코드 상세 설명put(key,value);//삽입 키 - 값 쌍 int size();//map 에 키 쌍 의 개 수 를 저장 합 니 다 get(Object key);//키 를 통 해 값 찾기 boolean isEmpty () / ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.