看完吊打面试官!大厂经典高频面试题体系化集合,最强技术实现_vxlan面试题(1)

176 阅读6分钟

1. C->S:FIN,seq=p(我说完了) 2. S->C:ACK,ack=p+1(我知道了,等一下,我可能还没说完) 3. S->C:FIN,seq=q,ACK,ack=p+1(我也说完了) 4. C->S:ACK,ack=q+1(我知道了,结束吧)

S 收到 C 结束的消息后 S 可能还没说完,没法立即回复结束标示,只能等说完后再告诉 C :我说完了 复制代码

HTTP
  • 超文本传输协议,明文传输,默认 80 端口
  • POST 和 GET:Get 参数放在 url 中;Post 参数放在 request Body 中
  • 访问网页过程:DNS 域名解析、TCP 三次握手建立连接、发起 HTTP 请求
HTTPS
  • 默认 443 端口,使用 SSL 协议对 HTTP 传输数据进行了加密,安全
  • 加密过程:Client/Server 通过非对称加密生成密钥,然后用这个密钥去对称加密传输数据

算法:数据结构、常用算法

数据结构
  • 数组、链表
  • 栈、队列
  • 散列表
  • 树、堆、图
常用算法
  • 排序
  • 双指针、滑动窗口、字符串
  • 递归、分治、二分
  • 回溯、贪心、动态规划

Java 基础:StringBuilder、泛型擦除、Exception、IO、容器

StringBuilder
  • StringBuffer 线程安全,StringBuilder 线程不安全
  • +实际上是用 StringBuilder 来实现的,所以非循环体可以直接用 +,循环体不行,因为会频繁创建 StringBuilder
  • String.concat 实质是 new String ,效率也低,耗时排序:StringBuilder < StringBuffer < concat < +
泛型擦除
  • 修饰成员变量等类结构相关的泛型不会被擦除
  • 容器类泛型会被擦除
Exception 和 Error
  • Exception 和 Error 都继承自 Throwable
  • Error 大部分是指不可恢复的错误状态,比如 OOM,所以也不需要捕获
  • Exception 分为 CheckedException 和 UnCheckedException
  • CheckedException:必须显式捕获,受编译器检查,比如 io 操作
  • UnCheckedException:不用显示捕获,比如空指针、数组越界等
IO 、 NIO、 OKIO
  • IO 是面向流的,一次一个字节的处理,NIO 是面向缓冲区的,一次产生或消费一个数据块
  • IO 是阻塞的,NIO 是非阻塞的
  • NIO 支持内存映射方式
  • okio 相比 io 和 nio,api 更简单易用
  • okio 支持超时机制
  • okio 引入 ByteString 空间换时间提高性能
  • okio 采用 segment 机制进行内存共享,节省 copy 时间消耗
ArrayList、LinkedList
  • ArrayList
  • 基于数组实现,查找快:o(1),增删慢:o(n)
  • 初始容量为10,扩容通过 System.arrayCopy 方法
  • LinkedList
  • 基于双向链表实现,查找慢:o(n),增删快:o(1)
  • 封装了队列和栈的调用
HashMap 、HashTable、HashSet
  • HashMap(允许 key/value 为 null)
  • 基于数组和单向链表实现,数组是 HashMap 的主体;链表是为解决哈希冲突而存在的,存放的是key和value结合的实体
  • 数组索引通过 key.hashCode(还会二次 hash) 得到,在链表上通过 key.equals 索引
  • 哈希冲突落在同一个桶中时,直接放在链表头部(java1.8后放到尾部)
  • JAVA 8 中链表数量大于 8 时会转为红黑树存储,查找时间由 O(n) 变为 O(logn)
  • 数组长度总是2的n次方:这样就能通过位运算实现取余,从而让 index 能落在数组长度范围内
  • 加载因子(默认0.75)表示添加到多少填充比时进行扩容,填充比大:链表较长,查找慢;填充比小:链表短,查找快
  • 扩容时直接创建原数组两倍的长度,然后将原有对象再进行hash找到新的index,重新放
  • HashTable(不允许 key/value 为 null)
  • 数据结构和 HashMap 一样
  • 线程安全
  • HashSet
  • 基于 HashMap 实现,元素就是 HashMap 的 key,Value 传入了一个固定值
ArrayMap、SparseArray
  • ArrayMap
  • 基于两个数组实现,一个存放 hash;一个存放键值对
  • 存放 hash 的数组是有序的,查找时使用二分法查找
  • 发生哈希冲突时键值对数组里连续存放,查找时也是通过 key.equals索引,找不到时先向后再向前遍历相同hash值的键值对数组
  • 扩容时不像 HashMap 直接 double,内存利用率高;也不需要重建哈希表,只需要调用 system.arraycopy 数组拷贝,性能较高
  • 不适合存大量数据(1000以下),因为数据量大的时候二分查找相比红黑树会慢很多
  • SparseArray
  • 基于 ArrayMap,key 只能是特定类型
Concurrent 集合
  • ConcurrentHashMap
  • 数据结构跟 HashMap 一样,还是数组加链表
  • 采用 segment 分段锁技术,不像 HashTable 无脑直接同步 put 和 get 操作
  • get 操作没有加锁,因为 value 用 volatile 修饰来保证可见行,性能很高
  • java1.8 后去除分段锁,采用 CAS 乐观锁加 synchronized 来实现
LRUCache 原理
  • 基于访问顺序排序的 LinkedHashMap 实现,最近访问的会排在最后

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的架构技术PDF】可以关注我免费获取

Android学习PDF+架构视频+面试文档+源码笔记

com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取