map集合相关内容

导航:
1.map
1.1 HashMap的底层实现原理?(以jdk7为例)
1.2 HashMap的底层实现原理?(以jdk8为例)
1.3 Map实现类:Properties

Map 双列数据,存储key-value对的数据 接口就是规范
在这里插入图片描述
1/-Map:
双列数据,存储key-value对的数据 —类似于高中的函数: y = f(x)
2/-HashMap:
作为Map的主要实现类;线程不安全的,效率高;存储null的key和value

HashMap的底层:数组+链表(jdk7及之前)
数组+链表+红黑树(jdk 8)

3/-LinkedHashMap:
保证在遍历map元素时,可以按照添加的顺序实现遍历。
原因:
在原有的HashMap 底层结构基础上,
添加了一对指针,指向前一个和后一个元素。

对于频繁的遍历操作,此类执行效率高于HashMap。

2/-TreeMap:
保证按照添加的key-value对进行排序,实现排序遍历。
此时考虑key的自然排序或定制排序

底层使用红黑树

2/-Hashtable:
作为古老的实现类;线程安全的,效率低;不能存储null 的key和value
3 /-Properties:
常用来处理配置文件。key和vaLue 都是String类型

快捷键:
ctrl shift t 查询类
ctrl o 查看类里面的所有方法
alt + 左右 向前,向后

面试题:

  1. HashMap的底层实现原理?
  2. HashMap和Hashtable的异同?
  3. CurrentHashMap与Hashtable的异同? ( 暂时不讲)

Map结构的理解:
Map中的key: 无序的、不可重复的,使用Set存储所有的key
—> key所在的类要重写equals()和hashCode() ( 以HashMap为例)

Map中的value: 无序的、可重复的,使用collection存储所有 的value
—>value所在的类要 重写equals()

一个键值对: key-value构成了一个Entry对象。
Map中的entry: 无序的、不可重复的,使用Set 存储所有的entry

HashMap的底层实现原理?(以jdk7为例)

HashMap map = new HashMap():

在实例化以后,底层创建了长度是16的一维数组Entry[] table.
…可能已经执行过多次put…

map. put (key1, value1)://添加

首先, 调用key1 所在类的hashCode()计算key1哈希值,
此哈希值经过某种算法计算以后,得到在Entry 数组中的存放位置。

如果此位置上的数据为空 ,此时的key1-value1添加成功。----情况1

如果此位置上的数据不为空
( 意味着此位置上存在一个或多个数据(以链表形式存在)),
比较key1和已经存在的一个或多个数据的哈希值:

==》 如果 key1的哈希值与已经存在的数据的哈希值都不相同,
此时key1-value1 添加成功。---- 情况2

如果 key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,
继续比较: 调用key1所在类的equals (key2)方法,比较:
== 》如果 equals()返回false :此时key1-value1添加成功。---- 情况3
如果 equals().返回true:使用value1替换vaLue2。(具有修改功能)

举例:
原来的entry是(“AS”,25)
现在又put下,entry是(“AS”,28)
hash值和equals()都一样,
28替代了25。证明了不可重复的作用

补充:
关于情况2和情况3: 此时key1 -value1和原来的数据以链表的方式存储。

扩容:
在不断的添加过程中,会涉及到扩容问题,
当超出临界值(且要存放的位置非空)时,
默认的扩容方式: 扩容为原来容量的2倍,并将原有的数据复制过来。
(一般到了大于12,提前扩容)

HashMap的底层实现原理?(以jdk8为例)

jdk8相较于jdk7在底层实现方面的不同:

  1. new HashMap():底层没有创建一个长度为16的数组
  2. jdk 8底层的数组是: Node[], 而非Entry[]
  3. 首次调用put()方法时,底层创建长度为16的数组
  4. jdk7底层结构只有:数组+链表。jdk8中底层结构:数组+链表+红黑树。
    哈希表 链表 红黑树
    当数组的某一个索引位置上的元素以链表形式存在的数据个数> 8
    且当前数组的长度> 64时,
    此时此索引位置上的所有数据改为使用红黑树存储。

HashMap源码中的重要常量:

  • DEFAULT_ INITIAL_ CAPACITY : HashMap的默认容量, 16
    default_initial_capacity
  • DEFANLT_ LOAD_FACTOR:HashMap的默认加载因子:0.75
    default_load_factor
  • threshold:扩容的临界值,=容量*填充因子:16*0.75=>12
  • TREEIFY_THRESHOLD:
    treeify_threshold
    Bucket中链表长度大于该默认值,转化为红黑树:8
  • MIN_REEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64
    min_reeify_capacity

Map实现类:Properties

  • Properties类是Hashtable的子类,该对象用于处理属性文件

  • 由于属性文件里的key、 value 都是字符串类型,
    所以Properties里的key和value都是字符串类型

  • 存取数据时,建议使用setProperty(String key, String value)方法
    和getProperty(String key)方法

Properties properties = new Properties();//实例化Properties对象
properties.load(new FileInputStream("jdbc.properties");//加载(读取)文件(以流的形式)
String user = properties.getProperty("user");//获取文件中的数据
利用反射,获取类的对象
Class c = Class.forName(user); //类类型的对象
Object o = c.newInstance();//类的对象
System.out.println(o);

==》 灵活性高 只需要改配置文件里的 不需要jdk环境

如果出现乱码:
在这里插入图片描述
打勾勾上,就不会出现乱码了,并且文件要重新造。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值