HashMap非线程安全,HashTable线程安全(初始化容量11,加载因子0.75,扩容为*2+1)
//静态的内部类HashMap.Node
HashMap集合的默认初始化容量是16,默认加载因子是0.75.当底层数组容量达到75%时,数组开始扩容 *2。在JDK中单向链表元素大于8个,会变为红黑树,当红黑树中元素少于6个,则会变为单向链表
HashMap集合的初始容量必须是2的倍数,否则效率会降低
HashMap key值和value可以为空,但HashTable的key和value不允许为空
static class Node<K,V>
{
final int hash; //哈希值,是key的hashCode()方法的执行结果,可以通过哈希算法转换成数组下标
final K key;
V value;
Node<K,V> next; //下一个节点的内存地址
}
哈希表:一维数组,这个数组中的每一个元素是一个单向链表
此图的原理体现了HashMap为何不重复,无序
无序:不一定挂在哪一个链表中
不可重复:equals方法保证
放在HashMap key部分的元素和HashSet集合中的元素需要同时重写HashCode+equals方法
注意:同一个单向链表上所有节点的Hash相同,因为他们的数组下标是一样的。但统一个链表上不同节点equals方法返回的肯定是false
如果把Hashcode的值设定为固定值,则退化为单向链表
如果把Hashcode的值设定为不一样的值,则退化为一维数组
equals 方法重写例子:
注:IDEA中可自动生成这两个方法
Properties是线程安全的,继承HashTable,key和value都是string类型
方法
.setProperty( , );
.getProperty(key);
.load(reader) 文件数据顺着管道加载到Map集合中,其中等号左边为key,右边为value
我们把这种文件叫做配置文件,建议以.properties结尾,在这种文件中#为注释