List,Set,Map三者的区别?
List:有序集合(此处的有序指的是取出来的数据顺序和存进去的数据顺序一致),可以存储多个元素,也可以存储多个null值。
Set:无序集合,不可以存储多个元素,只可以存储一个null值。
Map:使用键值对的方式存储数据,key是无序且唯一的,value值不唯一,不同的key可以对应相同的value。
常见框架底层数据结构
List:
ArrayList:底层使用数组实现。
LinkedList:底层使用双向链表实现。
Set
hashset:底层使用hashmap实现。
HashMap:
使用链表,数组和红黑树实现。
ArrayList扩容机制
每次扩容之后的大小都是原来大小的1.5倍。
ArrayList和LinkedList的区别
线程安全:两者都是不保证线程安全的。
底层实现机制:ArrayList底层是数组,LinkedList底层是双向链表。
适用场景:ArrayList适用于多读少增删,LinkedList适用于多增删,少读。
内存占用:ArrayList每次扩容之后都是原数组的1.5倍会存在一定的资源浪费,LinkedList节点里面需要存放直接前驱和后继,资源消耗比较大。
Map
在jdk1.8中hashmap的底层实现是数组+链表+红黑树
jdk1.8中的两次扰动
一次位运算一次异或总共两次扰动。
一次异或:key.hashcode()与key.hashcode()的高16位进行异或,这样key.hashcode()高16位不变,低16位既具备高16位特点又具备低16位特点,进而减少碰撞的发生。
一次位运算:异或之后的结果和hashmap的容量-1进行位运算。
hashmap扩容机制
初始值为16,负载因子为0.75,阈值为容量*负载因子。
每次扩容,容量都是原来的两倍。
扩容之后需要重新计算那些节点的存放位置,hash值对数组长度取余若为0,存放位置不变,为1,存放位置为原位置+原容量。