3、ash值算出要存放的数组的位置,如果两个元素算出的数组值相同的话,那么他们会放在数组里的同一个位置,这个时候在获取该元素的时候,那么会根据Key的hash找到数组的位置,然后再从链表中找到该元素。那么我们可以很容易的想象到,如果每一个数组里只有一个元素的时候,效率是最高的,因为不需要再对链表进行操作。有了这点认识我们就可以进行接下来的分析了。[list][1]数组大小。既然说了内部是数组+链表,那就设计到数组的大小,这一点,HashMap和HashTable是不同的HashMap的默认大小Java代码 sta
4、tic final int DEFAULT_INITIAL_CAPACITY= 16; staticfinalintDEFAULT_INITIAL_CAPACITY=16;我们看到默认是16,而且HashMap的大小一定是2的幂数。这里你可能会问了,如果初始化HashMap的时候指定了一个不是2的幂数的长度呢?如果是这种情况,它也会找到一个最接近你指定值的一个2的幂数,下面是源码:Java代码 int capacity= 1; while (capacity
5、y) capacity<<=1; intcapacity=1; while(capacity
6、M_CAPACITY=1<<30;如果你指定超过这个大小,它会抛弃你指定的值而采用这个默认值Java代码 if (initialCapacity>MAXIMUM_CAPACITY) initialCapacity=MAXIMUM_CAPACITY; if(initialCapacity>MAXIMUM_CAPACITY) initialCapacity=MAXIMUM_CAPACITY;HashTable的默认大小Java代码 public Hashtable()
8、shMap扩容HashMap扩容会把之前长度*2,因为之前的长度肯定是2的幂数,所以自动扩容后也是2的幂数HashTable扩容HashTable扩容是把之前长度*2+1扩容操作是比较消耗资源的,所以这里我们告诉我们在初始化HashMap和HashTable的时候要考虑到实际使用时的长度,应该尽可能的避免出现扩容的操作,从而提高效率[3]put操作HashMap的putJava代码 public V