关于 Map 的整理 HashMap确实很强大啊

关于Map
key,value都可以是任意的类型
不过常见的key是String和Integer类型的

(1)HashMap,key值都不能重复
添加键值对:put(key , value)
获取有效个数:size()
还有containsKey containsValue
get(key) 是根据key获取value的值
remove(key)

不可以使用foreach和Iterator进行迭代

只能迂回迭代:
A、迭代所有的key,通过map.keySet()拿到所有的key
B、迭代所有的value,通过map.values()拿到所有value;学习枚举时有相似的操作
C、迭代所有的映射关系:
把映射关系看成一个整体 Map.Entry类型
map.entrySet() 得到所有的映射关系
对每一个可以getKey()和getValue()
for(Object obj : map.entrySet()){
    Map.Entry entry = (Entry)obj;
}

关于HashMap
key值也是不可以重复,依据的是key值的equals方法和hashCode方法
底层的实现:
1.8之前:数组+链表
创建HashMap对象时,创建了一个Entry[]
Entry中的key是final修饰的,不可变;
存储的时候允许key和value为空

添加的时候先算出hashCode,根据hashCode与当前存储数组的余数判断要存放的位置;如果table[i]
不为空,就会判断hashCode是否相等,key是否相等;数组添加到0.75时,就要进行扩容,扩大两倍;
一旦扩大就要把原来所存的所有映射关系重新计算位置;缺陷就是如果都存在一个位置的时候,会造成分布不均匀

JDK1.8时的实现:数组+链表+红黑树  Node类型
开始容量为0,添加第一个时,建立一个容量16的数组
当单个链表的长度大于8的时候,容量大于64的时候,会对这个链表进行树形化

关于TreeMap
根据key的大小比较进行排序的,是树形结构

LinkedHashMap
是数组+链表+红黑树
比HashMap多了一个添加元素的顺序

关于HashMap和Hashtable的区别?
出现的版本不同,HashMap是新型哈希表,线程不安全;
类似于Vector和ArrayList的区别,StringBuffer和StringBuilder的区别
HashTable不允许key为null

Properties是HashTable的子类
其中的key和value都是String类型,
经常用于资源信息的配置存储
System.getProperties() 获取系统的配置
比如src下资源文件的读取方式
Properties pro = new Properties();
pro.load(ClassLoader.getSystem("jdbc.properties"));
获取值 pro.getProperty("user");


关于扩容时要注意的一些事情?

如果单个链表的长度超过8,并不会立刻变成树,先扩容,

当添加第9个的时候,单个链表的长度超过8,但是因为数组的长度没有到达64,所以扩容解决,16->32
当添加第10个时,单个链表的长度超过8,但是因为数组的长度没有到达64,所以扩容解决,32-->64
当添加第11个时,单个链表的长度超过8,但是因为数组的长度已经到达64,这个时候开始树形化

添加第9个:16变成32   单个链表 9
添加第10个:32变成64  单个链表10
添加第11个时,数组的长度没变,链表树形化


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值