数据结构总构
数组:
1、简单:最简单的数据结构
2、占据连续内存空间:数组空间连续、按照申请的舒徐存储
3、数据空间效率低
4、操作麻烦
所以有了:
顺序表:顺序存储结构、紧密相连
ArrayList
要点:
add方法:ensureCapacityInternal(检查,不够的话扩容2/3)
arraycopy(数据往其他地方挪动过程,耗时)
remove:删除对象和删除position不一样,后者要循环,更麻烦
继承:AbstractList
实现了Seriazable,所以可用于json的序列化操作
Iterator:进行轮训的时候尽量使用轮询的方法,,内部优化了非空判断,以及异常处理,for循环遍历有风险,可读,不要用于其他方面
优点:尾插效率高,支持随机访问
链表:链式存储结构
定义:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的 数据元素,这组存储单元可以是连续的,也可以是不连续的
hashmap
双链表
linkedList
保存的数据只要随即查找展示出来。就用arraylist
要对列表进行排序,还要随机删除不需要的数据,linklist,频繁的插入删除,就用这个
ArrayList和LinkList区别:
1、存储空间连续与否,逻辑上连续物理上不连续
2、顺序表可以随机访问、尾部插入删除简单。删除插入慢
链表不支持随机访问,效率低、删除插入快
线程池存储过程,先看corePoolSize ,然后加入队列,满了再看maximumPoolSize ,剩下的丢弃异常
队列,最常用的场景:缓存
循环队列
Deque是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行
优先级队列和通常的栈和队列一样,只不过里面的每一个元素都有一个”优先级”,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。
又名后进先出表,它是一种运算受限的线性表。 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
栈(stack)又名后进先出表,它是一种运算受限的线性表。 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
Java中的Stack是通过Vector来实现的,这种设计被认为是不良的设计,说说你的看法?
吃饱了就是队列,喝高了就是栈
Object开始说起
Object有一个hasn方法,放回int值,hash使用位运算
hash表是keyvalue键值对
极端情况下,所有index都相同,那就是一个linklist了,就变成单链表了。如何避免?:加载因子,通过扩容来解决hash碰撞
填充因子
扩容的,要对所有的hash值重新hash
HashMap源码详解一篇就够
hash表
经常被问到的有深度有内涵的数据结构面试题
question
1、什么是hashmap、为什么要用
2、hashmap工作原理
3、hashmap get()的工作原理
4、两个对象hashcode相同会发生什么
5、两个键的hashcode相同,如何取值对象
6、为什么需要加载因子
HashMap默认加载因子为什么选择0.75
7、重新调整hasnmap的大小会产生什么问题
当hashMap中的节点数超过阈值的时候,就会自动扩容,扩容的时候就会调整hashMap的大小,一旦调整了hashMap的大小就会导致之前的hashCode计算出来的hash表中下标无效,所以所有的节点都需要重新hash运算,结果就是带来时间上的浪费。因此我们要尽量避免hashMap调整大小,所以我们使用hashMap的时候要给hashMap设置一个默认值,这个默认值要大于我们hashMap中存放的节点数。
8、为什么string、integer这样的wrapper适合作为键
其内容固定,不可变,稳定
9、我们可以使用自定义的对象作为键吗
可
10、什么是阈值、什么时候扩容
扩容必须满足两个条件:
1、 存放新值的时候当前已有元素的个数必须大于等于阈值
2、 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值)
关于hashmap的思想在threadlocal中的应用
threadlocal包含threadlocalmap。threadlocalmap持有thread的引用,和thread绑定关系,一个thread拥有同一个threadlocalmap。threadlocalmap里有一个entry数组,数组里存储Entry(ThreadLocal> k, Object v),以散列的形式来防止冲突。持有threadlocal的引用作为key,实际的值作为value,以此确保同一个thread内entry位置不同,不同thread互不干扰。
,
源码解读 | JDK源码 | ThreadLocal 实现原理
list:可重复,有序的
set:不可重复、无序的
collections:拥有迭代器Iterator