系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
一、容器是什么?
- 容器可以存储对象和基本数据类型,数组就是容器
- 数组的优势:是一种简单的线性序列,可以快速访问数组元素,效率高
- 数组的劣势:不灵活,必须实现定义好长度,不能随着需求而扩充
在Java中容器和集合是一回事
二、集合
- 集合分为List,Set,Queue,Map
- 泛型是jdk1.5之后引入的,它可以帮助我们建立类型安全的集合
1.List
存储一组有序,值不唯一
- ArraryList底层:使用数组实现的存储,特点是查询快,增删效率低,线程不安
- 扩容机制:把老的长度拿过来然后加上老长度÷2的长度数组(初识长度默认是10)
- LinkedList底层:使用双向链表,特点是增加删除快,只需要将相邻的两个节点拆开再重新连接到新的节点就可以了,但查询效率低,线程不安全
- Vector:底层也是使用数组实现的List,只不过相关方法都加入了同步检查(Synchronize),因此 “线程安全,但效率低”
- 如果多个线程使用它可以考虑Vector
2.Map
工作中那些场景会用到:假如现在有一个员工表,它里面放入了员工的姓名,性别,年龄,岗位等等,另一个表是工号表,一个工号对应一个员工表里的信息,这时候就用map,一对一对的放入信息,根据key(工号) 查询value(员工信息)
HashMap
底层:链表+数组,在JDK8以后加入红黑树- 核心数组结构 Node<k,v> table 被称为"位桶数组"
- Put添加一个元素的运算逻辑:
1. 获取key的hashcode
2. 通过hashcode计算出Hash值,Hash值必须在[0,数组长度-1]区间,一次来确定出hash插入数组中的位置,可能存在hash相同,那就插在前一个hash所在的数组位置的后面,这样就形成链表,同一个链表的hash值是相同的,所以数组存储的就是链表,在Jdk8中,当链表的长度大于8时,数组长度大于64时,就会扩容成红黑树这样就大大提高了查询效率 - Get获取元素的逻辑:
1. 获取key的hashcode值
2. 通过hashcode的hash()方法计算出hash值,根据hash值去找到对应的数组位置,然后equals()去比较链表上的key值,如果返回为true就把value值读取出来 - 扩容机制:当位桶数组达到(0.75 * 数组长度)的时候就会扩充为原来的2倍,本意上还是重新定义新的更大的数组,将旧的数组内容挨个拿来拷贝到新的数组上,旧的数组就会被回收
TreeMap
底层原理是红黑二叉树,hashMap的效率高于TreeMap,排序的时候用TreeMap(可以自动排序,也可以自定义排序,实现Comparable接口)- HashMap和HashTable的区别:
- HashTable是线程安全的,但效率低于HashMap
- HashMap允许Key和Value为空,但HashTable是不允许key,value为空的
3.Set
存储一组无序,唯一
- HashSet底层就是HashMap,存储在HashMap的key上
- TreeSet底层就是使用了TreeMap实现的,内部维持一个简化版的TreeMap,通过Ket来保存set值,
4.Queue
原理:FIFO模式(First-in-First-out) 先进先出,但有时候需要再队列中基于优先级处理
着重了解HashMap,HashMap是Java常问面试题