JAVA学习总结(5)

一、Map实现类


Map<HashMap>(底层+数组链表+红黑树)
线程不安全,效率高,存储null的key和value
LinkedHashMap:保证在遍历map的元素时,可以按照添加的顺序实现遍历。
原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素,对于平凡的遍历操作,此类执行效率高于HashMap
TreeMap
保证按照添加的key-value进行排序,实现遍历,此时考虑key的自然排序和定制排序(TreeMap使用有限)底层使用红黑树
HashTable
线程安全,效率低,不能存储null的key和value
Properties:常用来处理配置文件,key和value都是String类型

//一般用到最多的时HashMap
public class ClassMap {
    public static void main(String[] args) {
        HashMap<String,String> hashMap = new HashMap();
        hashMap.put("一","周一");      //put:像map里面添加数据
        hashMap.put("二","周二");
        System.out.println(hashMap.get("二"));    //get:根据key检索value
        hashMap.replace("一","周三");      //replace:根据key来更换value
        System.out.println(hashMap);
    }
}

 

二、Map结构的理解


Map种的Key时无序的,不可重复的,使用Set存储所有的Key 
---->key所在的类要重写equals()和hashCode()《以HashMap为例》
Map种的Value时无序的,不可重复的,使用Collectiom存储所有的value
---->valuey所在的类要重写equals()
一个键值对:key-value构成了一个Entry对象
Map种的Entry时无序的,不可重复的,使用Set存储所有的entry 
  

//这段的演示代码我不知道咋写,我也只是理解了这段话的意思,平时能使用


三、HashMap的底层实现原理 


(jdk7为例说明)
 HashMap<Object, Object> h1 = 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所在类的equale(key2),
如果equals()返回false;此时(key1,value1)添加成功---->情况3
如果返回true;使用value1替换value2。
补充:情况2和情况3,此时的(key1,value1)和原来的数据以链表的方式存储。
在添加的过程中,会涉及到扩容问题,默认的扩容方式:扩容为原来的两倍,并将原有的数据复制过来。

public class ClassMap {
    public static void main(String[] args) {
        HashMap<String,String> hashMap = new HashMap();
        hashMap.put("一","周一");           
        hashMap.put("二","周二");
        hashMap.put("三","周三");
        System.out.println(hashMap.get("二"));      
        hashMap.replace("一","周三");         
        hashMap.put("二","周四");     //Key1(equals(key2))替换value
        System.out.println(hashMap);

    }
}

 

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

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

//对于Map来说,我现在的理解还很片面,在日后的使用中会慢慢熟悉
//多练,多看,理解了,代码能力就会慢慢的提高

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harden·Jr.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值