本文共 3889 字,大约阅读时间需要 12 分钟。
作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2020年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?
就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Android程序员的技术功底。
最近搜集了一些基础问题以及阿里、腾讯2020年一些精选的面试题,最后还把把技术点梳理成一份大而全的“Android高级工程师”面试xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节,由于篇幅有限,在文末以图片的形式给大家展示一份大概的。
**那么如何才能通过一线互联网公司面试?**相信这是很多人的疑惑,希望看完本篇文章能给大家一些启发。
网络:分层模型、TCP、UDP、HTTP、HTTPS
分层模型
- 应用层:负责处理特定的应用程序细节,如 HTTP、FTP、DNS
- 运输层:为两台主机提供端到端的基础通信,如 TCP、UDP
- 网络层:控制分组传输、路由选择等,如 IP
- 链路层:操作系统设备驱动程序、网卡相关接口
UDP
- UDP 头结构:来源端口、目的端口、长度域、校验和
- 特点:不可靠、无序、面向报文、速度快、轻量
- 适用场景:适用于即时通讯、视频通话等
- 应用:DHCP、DNS、QUCI、VXLAN、GTP-U、TFTP、SNMP
TCP
- TCP 头结构:来源端口、目的端口、序号、确认序号、SYN/ACK 等状态位、窗口大小、校验和、紧急指针
- 特点:面向字节流、有拥塞和流量控制、可靠、有序、速度慢、较重量,通过滑动窗口实现流量控制、用塞控制
- 适用场景:文件传输、浏览器等
- 应用:HTTP、HTTPS、RTMP、FTP、SMTP、POP3
- 三次握手:
1\. C->S:SYN,seq=x(你能听到吗?)2\. S->C:SYN,seq=y,ack=x+1(我能听到,你能听到吗?)3\. C->S:ACK,seq=x+1,ack=y+1(我能听到,开始吧)两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需要三次握手复制代码
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
ArrayMap、SparseArray
-
ArrayMap
- 基于两个数组实现,一个存放 hash;一个存放键值对
- 存放 hash 的数组是有序的,查找时使用二分法查找
- 发生哈希冲突时键值对数组里连续存放,查找时也是通过 key.equals索引,找不到时先向后再向前遍历相同hash值的键值对数组
- 扩容时不像 HashMap 直接 double,内存利用率高;也不需要重建哈希表,只需要调用 system.arraycopy 数组拷贝,性能较高
- 不适合存大量数据(1000以下),因为数据量大的时候二分查找相比红黑树会慢很多
-
SparseArray
Concurrent 集合
- ConcurrentHashMap
- 数据结构跟 HashMap 一样,还是数组加链表
- 采用 segment 分段锁技术,不像 HashTable 无脑直接同步 put 和 get 操作
- get 操作没有加锁,因为 value 用 volatile 修饰来保证可见行,性能很高
- java1.8 后去除分段锁,采用 CAS 乐观锁加 synchronized 来实现
LRUCache 原理
- 基于访问顺序排序的 LinkedHashMap 实现,最近访问的会排在最后
总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
附
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
[外链图片转存中…(img-FRW9vDS5-1618037398177)]
转载地址:http://tpqlf.baihongyu.com/