快速了解Java容器

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

一、容器是什么?

  1. 容器可以存储对象和基本数据类型,数组就是容器
  2. 数组的优势:是一种简单的线性序列,可以快速访问数组元素,效率高
  3. 数组的劣势:不灵活,必须实现定义好长度,不能随着需求而扩充
    在Java中容器和集合是一回事

二、集合

  1. 集合分为List,Set,Queue,Map
  2. 泛型是jdk1.5之后引入的,它可以帮助我们建立类型安全的集合

1.List

存储一组有序,值不唯一

  1. ArraryList底层:使用数组实现的存储,特点是查询快,增删效率低,线程不安
  2. 扩容机制:把老的长度拿过来然后加上老长度÷2的长度数组(初识长度默认是10)
  3. LinkedList底层:使用双向链表,特点是增加删除快,只需要将相邻的两个节点拆开再重新连接到新的节点就可以了,但查询效率低,线程不安全
  4. Vector:底层也是使用数组实现的List,只不过相关方法都加入了同步检查(Synchronize),因此 “线程安全,但效率低”
  5. 如果多个线程使用它可以考虑Vector

2.Map

工作中那些场景会用到:假如现在有一个员工表,它里面放入了员工的姓名,性别,年龄,岗位等等,另一个表是工号表,一个工号对应一个员工表里的信息,这时候就用map,一对一对的放入信息,根据key(工号) 查询value(员工信息)

  1. HashMap底层:链表+数组,在JDK8以后加入红黑树
  2. 核心数组结构 Node<k,v> table 被称为"位桶数组"
  3. Put添加一个元素的运算逻辑:
    1. 获取key的hashcode
    2. 通过hashcode计算出Hash值,Hash值必须在[0,数组长度-1]区间,一次来确定出hash插入数组中的位置,可能存在hash相同,那就插在前一个hash所在的数组位置的后面,这样就形成链表,同一个链表的hash值是相同的,所以数组存储的就是链表,在Jdk8中,当链表的长度大于8时,数组长度大于64时,就会扩容成红黑树这样就大大提高了查询效率
  4. Get获取元素的逻辑:
    1. 获取key的hashcode值
    2. 通过hashcode的hash()方法计算出hash值,根据hash值去找到对应的数组位置,然后equals()去比较链表上的key值,如果返回为true就把value值读取出来
  5. 扩容机制:当位桶数组达到(0.75 * 数组长度)的时候就会扩充为原来的2倍,本意上还是重新定义新的更大的数组,将旧的数组内容挨个拿来拷贝到新的数组上,旧的数组就会被回收
  6. TreeMap底层原理是红黑二叉树,hashMap的效率高于TreeMap,排序的时候用TreeMap(可以自动排序,也可以自定义排序,实现Comparable接口)
  7. HashMap和HashTable的区别:
    • HashTable是线程安全的,但效率低于HashMap
    • HashMap允许Key和Value为空,但HashTable是不允许key,value为空的

3.Set

存储一组无序,唯一

  1. HashSet底层就是HashMap,存储在HashMap的key上
  2. TreeSet底层就是使用了TreeMap实现的,内部维持一个简化版的TreeMap,通过Ket来保存set值,

4.Queue

原理:FIFO模式(First-in-First-out) 先进先出,但有时候需要再队列中基于优先级处理

着重了解HashMap,HashMap是Java常问面试题

猜你喜欢

转载自blog.csdn.net/weixin_51250404/article/details/120146776