集合(2)
内容包括:
①hashmap,②linkedhashmap,③concurrentHashMap,④hashset
hashMap在jdk1.8之前.
数组个链表,(链表散列).HashMap通过HashMap通过key的HsahCode经过扰动函数处理过后得到hash值,然后通过(n-1)&hash判断当前元素存放位置,(这里n指的就是数组的长度),如果当前位置存在元素的话,就判断钙元素与存入的hash值以及key是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突.
所谓的扰动函数指的就是HashMap的hash方法,使用hash方你也就是扰动函数是为了防止一些实现比较差的hashcode()方法换句话说使用扰动函数之后可以减少碰撞.
hashmap默认大小:
阈值:
负载因子:
hash表:
key-value映射的个数:
阈值:
负载因子:
当前对象修改的次数:(remove , insert)
构造:
①:初始化容量大小\负载因子:
图中的意思是初始化hashMap,指定初始化容量的大小(),指定初始化负载因子*(当你的容量达到%多少的时候开始扩容,负载因子在时间维度和空间维度,选取了一个折中值)
当负载因子等于1的时候,数据太多,copy的时候比较麻烦(根据业务要求)
&运算:
是将两个数转成二进制,然后进行运算(hash值&hash表长度-1,返回hash桶的位置)
此位置为判断是否是更新操作或者是插入操作:当你想要存入的位置中已经存有值,造成hash碰撞,先判断是否已经存在这个key,如果不存在,我们将用链表的方式进行存储,将新的元素放到hashMap中,将旧的用链表的方式连接到新的元素上,
同一个位置发生碰撞的次数越多,链表越长,hashMap的性能越差,所以我们
@底层的实现:
@为什么说重写了equise,必须重写hashcode:
1).
HashMap Jdk1.8之后:
细节调整:
红黑树的阈值:
最小树的容量:
节点用的是node表示的
HashMap死链问题 产生死链问题的原因: 高并发
避免该问题 本身不安全 不应该在高并发上使用 高并发情况应该使用ConcurrentHashMap
hashTable :(已经被淘汰)详细内容
根据业务需要进行定制:负载因子/
不能存入null 会报空指针异常
内容小结:
构造方法和静态代码块在什么时候被调的?
①构造方法和静态代码块谁的运行比较快
构造方法在new,被创建的时候运行
②静态代码块是类加载的时候运行
静态代码块的执行的顺序要高于构造方法
静态代码块new 创建对象的时候,
ider:不带有jdk
eclipse:是带有jdk的
jdk:1.7
创建兑现的5中方式:
克隆是创建对象的一种方式