【java集成】Map类

大神博客写的很好:https://blog.csdn.net/justloveyou_/article/details/62893086


java集合:list、queue、set
   前二有序、可重复,后一无序、不重复
      保证不重复依据equals、低效
         先hashCode计算元素位置,无、直存,有equals较同:不存?对应链头
   arraylist、linkedlist、copyonwriteArrayList
      a数组形式实现,顺序插入、查找快、插删慢
          l:链表,顺序插、插慢、插删快
            hashmap结合上利 
http://www.baoding-soft.com/news/software/908.html


list:继承Collection,ArrayList是动态数组,LinkedList双向链表
    list容量可动态扩展,有序:可以对某个元素在集合中的位置进行指定
    可重复,集合对象Vector线程安全、arraylist、linkedlist线程不安全

arraylist:实现list可选操作,包括null在内的所有元素
    基于数组实现,动态数组,容量自增,size标识元素个数
    每个实例都有个容量,存储列表元素的数组的大小,至少等于列表的大小
    自增带来数据向新数组的重新拷贝,扩容1.5倍+1
linkedList:双向链表
    header表头,entry实例,previous上、next下、element该、size节点实例个数
        element存放业务数据,previous与next分别是指向前后节点的指针
 https://blog.csdn.net/justloveyou_/article/details/52955619


HashMap 和 HashSet
    实现的接口规范不同,底层Hash存储机制相同;HashSet是在HashMap基础上实现
    hashMap
        构造一个指定初始容量和默认负载因子 (0.75)的空 HashMap
        HashMap 的容量必须是2的幂次方,超过 initialCapacity 的最小 2^n
    存取实现思路:
        判断key是否为null,若为null,则直接调用putForNullKey方法;
        若不为空,则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,
        如果table数组在该位置处有元素,则查找是否存在相同的key,若存在则覆盖原来key的value,
        否则将该元素保存在链头(最先保存的元素放在链尾)。此外,若table在该处没有元素,则直接保存。


PUT元素:
  先根据key的hash值得到这个元素在数组中的位置(即下标)把元素放到对应的位置
  如果元素所在位子已存放有其他元素,在同一位子上的元素将以链表的形式存放
    新加入的放在链头,最先加入的放在链尾
hashMap数据结构:
    数组和链表的结合
        数组:寻址易插删难;链表:寻址难插删易;哈希结合


hash算法:位置、尽量分布均匀:HashMap底层数组长度为何为2的次方
    static int indexFor(int h, int length) {
           return h & (length-1);//key得hashcode值,数组的长度-1做一次“与”运算(&)
       }https://my.oschina.net/ManderSY/blog/1604790
    结果值一定=<数据长度、不会越界、存在不同的位置,碰撞机会小
    hashmap构造函数capacity<<=1保证
扩容:resize
    原数组的数据重新计算其在新数组中的位置并放进入
    map中元素超过数组*loadFactor时,扩大一倍;耗性能
        预知hashmap中元素个数,预设元素个数: new hashMap(个数)


capacity <<= 1; https://www.cnblogs.com/o-andy-o/p/3437101.html
         i <<= 1;//i = i<<1  i等于i乘以2的1次方
         i <<= 2;//i = i<<2  i等于i乘以2的2次方,>>就是相除了

     static int hash(int h) {
         h ^= (h >>> 20) ^ (h >>> 12);
         return h ^ (h >>> 7) ^ (h >>> 4);
     }http://www.iteye.com/topic/709945 一张图胜过千言万语

    
 == equals  hashCode
       ==:操作数的值间关系
            基本数据类型:float double  byte short  int long char Boolean
                变量直接存值,==比较值本身
            引用类型:存储的是其关联对象在内存中的地址

        equals:Object实例方法,比较两个对象的content是否相同
            String重写equals方法
                 String str1 = new String("hello");
                 String str2 = new String("hello");虽然new但是true
                 重写原则:对称、自反、类推、一致
                    x.equals(null)【应使用关系比较符 ==】
                 同时需重写hashCode,且e中的成员变量h也要用
                    前比较项后摘要信息项
        https:blog.csdn.net/justloveyou_/article/details/52464440
            步骤:先判断是否同一引用、类型一致、内容一致

        hashCode:object的native方法,获取对象哈希值,确定对象在哈希表中索引位置
            hash将任意长度的输入通散列算法变成固定长度输出(散列值)压缩映射
                散列值空间小于输入的空间、不同输入散列成相同输出
            针对不同对象返回不同整数


Map.entrySet:表示一个映射项,key和value
    返回set<map.entry<k,v>>表示映射项set
    entry是map的内部类,实现了map.entry接口
    keySet()返回Map中key值集合;entrySet()返回Set集合,集合类型Map.Entry。
    entry接口是map的内部接口,实现getkey/value,setkey/value方法相当于一个javaBean
        hashMap存储key-value使用数组加链表
        linkedHashMap链表、treemap二叉
            treeMap  put时:
                Comparable<? super K> k = (Comparable<? super K>) key;Comparable<T>对实现它的类对象整体排序:自然排序
    https://blog.csdn.net/kyi_zhu123/article/details/52769469


compareble:
    简单的同等性比较,允许执行顺序比较,与Object的equals方法具有相似的特性,涉及到泛型的。
    类实现了Comparable接口,就表明它的实例具有内在的排序关系(natural ordering)
    实现Comparable接口的对象数组进行排序,只需要:Arrays.sort(a);
    compareTo通用约定和equals相似,将对象与指定对象比较。当对象小于、等于或者大于指定对象的时,返回一个负整数、零或者正整数。
    如果由于指定对象的类型而无法和该对象进行比较,则抛出ClassCastException异常。
https://blog.csdn.net/Jing_Unique_Da/article/details/49924289


linkedHashMap:将所有Entry节点链入一个双向链表的HashMap
    新增两个属性保证迭代顺序,双向链表头节点header、标志位AccessOrder
      accessOrder:true安装访问顺序迭代,false插入顺序迭代
    重新定义entry,新增指针before、after
        next维护hashMap桶中entry连接顺序,before维护插入顺序
    所有put进来的Entry都保存在HashMap中,但由于它又额外定义了一个以head为头结点的空的双向链表,
        因此对于每次put进来Entry还会将其插入到双向链表的尾部。
        https://blog.csdn.net/justloveyou_/article/details/71713781

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/80861907