先说一下我大概的情况吧。渣本毕业,工作已经有快两年了,从高中就开始玩小破站。无论是学习还是日常放松都是在b站。大学主学的软件技术专业,所以,进大学校门那一刻起,去上海bilibili工作就在心里埋下了种子。在学校,专业学的挺好的,自己写过一些小项目,也参与过一些协会开发的项目。
两年前刚毕业时候,b站也有校招,我当然满怀期待的参加了,但是并没有被录用。当时,挺失落的吧,当时也有想过放弃:我一个渣渣二本毕业,凭什么去上海,进b站啊。所以就找了个普普通通的公司开始了我的程序员生涯。
到今年年初的时候,疫情爆发了,各行业都收到的很大的影响,也包括我任职的小公司。在家隔离了一个多月,在家玩手机的看到了b站的社招,人闲下来的时候还真就会有各种想法会冒出来,我突然就想到,要不再试一次吧,反正工作也没了,在家闲着也是闲着,就着手准备bilibili的面试。刷面试题,看别人的面经,总结了一下校招时的失败经验…准备了挺久的,得有20多天吧,把学习所学的和工作两年的所学以及网友的经验,系统的梳理、巩固。世间所有的付出终是有回报的,努力的耕耘,肯定是有收获的。我成功的入职了bilibili,也是要感谢网友们提供的宝贵经验,所以整理了一下,把我的面经分享出来给大家。
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、容器StringBuilderStringBuffer 线程安全,StringBuilder 线程不安全+实际上是用 StringBuilder 来实现的,所以非循环体可以直接用 +,循环体不行,因为会频繁创建 StringBuilderString.concat 实质是 new String ,效率也低,耗时排序:StringBuilder < StringBuffer < concat < +泛型擦除修饰成员变量等类结构相关的泛型不会被擦除容器类泛型会被擦除Exception 和 ErrorException 和 Error 都继承自 ThrowableError 大部分是指不可恢复的错误状态,比如 OOM,所以也不需要捕获Exception 分为 CheckedException 和 UnCheckedException CheckedException:必须显式捕获,受编译器检查,比如 io *** 作UnCheckedException:不用显示捕获,比如空指针、数组越界等 IO 、 NIO、 OKIOIO 是面向流的,一次一个字节的处理,NIO 是面向缓冲区的,一次产生或消费一个数据块IO 是阻塞的,NIO 是非阻塞的NIO 支持内存映射方式okio 相比 io 和 nio,API 更简单易用okio 支持超时机制okio 引入 ByteString 空间换时间提高性能okio 采用 segment 机制进行内存共享,节省 copy 时间消耗ArrayList、linkedListArrayList 基于数组实现,查找快: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、SparseArrayArrayMap
基于两个数组实现,一个存放 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 实现,最近访问的会排在最后如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!
AndroID进阶学习全套手册
AndroID对标阿里P7学习视频
BATJ大厂AndroID高频面试题
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
-1614575902357)]
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
总结人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
以上是内存溢出为你收集整理的创建android项目!2021年Android工作或更难找,复习指南全部内容,希望文章能够帮你解决创建android项目!2021年Android工作或更难找,复习指南所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)