1.jdk1.7 HashMap
A estrutura de dados do hashMap: array + lista encadeada
Valor inicial de ArrayList: 10
Por que não usar o método add da lista em hashMap. HashMap é uma estrutura chave-valor. Ao obter (chave), você precisa percorrer todo o array, o que não é tão eficiente quanto list.get (subscrito).
colocar operação:
1. Use o hashcode para encontrar o comprimento da matriz restante para obter o valor subscrito da matriz de índice
2. Coloque o novo elemento Entry na tabela[índice]
1.1 Método de construção
Método de construção, a memória inicial padrão é 16 e o parâmetro padrão DEFAULT_LOAD_FACTOR=0,75f. Não sei do que adianta, continue analisando
Capacidade inicial padrão: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;Capacidade máxima padrão: static final int MAXIMUM_CAPACITY = 1 << 30;Parâmetros padrão: flutuação final estática DEFAULT_LOAD_FACTOR = 0,75f;
/**
* Constructs an empty <tt>HashMap</tt> with the default initial capacity
* (16) and the default load factor (0.75).
*/
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
1.2 método put (TODO)
A operação de venda é dividida aproximadamente nas etapas a seguir.
1. A capacidade inicial é a potência de 2
2. Coloque-o na primeira posição como vazio
3. Operação de hash e operação para percorrer o valor da chave para obter o valor do valor
4. Julgando as condições para expandir a capacidade, crie uma nova entrada<chave,valor> e coloque-a na matriz entrada[].
^=Operação XOR, o mesmo é 1, diferente é 0
|= A operação AND bit a bit é diferente de 1, e o mesmo é 0 ou 1
&=Bitwise e pós-atribuição é diferente de 0, o mesmo é o mesmo valor
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);//初始化容量为2的冥次方
}
if (key == null)
return putForNullKey(value);//将null值放入第一个位置
int hash = hash(key); //hash运算
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);//将key,value放入entry
return null;
}