【Android实习面筋】双非本科,1个半月20场面试斩获4家大厂offer,我学会的一些技能

532 篇文章 0 订阅
340 篇文章 3 订阅

前言

先说一下笔者春招实习的情况:从三月初到四月半,经历了近20场面试,一共面试了五家企业,通过了腾讯、字节、蚂蚁、美团的面试,虎牙在一面之后拒了二面邀请。

金三银四,不是在面试中,就是在面试的路上,踩了很多坑,吃了很多亏,也学了很多的东西。这篇文章,就想要把这些收获分享给你们,希望对你们有帮助。

文章的内容总体上可以分为两个部分:吹水、干货。吹水部分主要是分析笔者的面试过程,有兴趣的读者可以看一下;干货部分主要是分享笔者的面试经验,从技术到非技术到面试表现,可以根据标题按需阅读。同时需要注意的是:文章内容均为笔者的个人经验之谈,请不要奉为圭臬,辩证看待,同时欢迎各位评论区交流

面试经历

三四月几乎各路大厂开始疯狂招聘实习生。但其实有一些大厂,如腾讯、字节,在三月前甚至年前,就已经开始接收简历了。这个时候的岗位几乎应有尽有,难度也会相对三四月低一些,是一个非常好的机会。但笔者,比较怂,感觉没有准备好,到了三月才开始投递简历。

整个面试流程,给我最大的感触是:不尝试,永远是0;尝试了,概率再小,都有可能是1

知识总结

面试中会被考察的具体问题有三个影响因素:部门需求、简历、面试中提到的知识点。因此不同的部门不同的面试者遇到的面试题很可能是完全不一样的,这也是我为什么不直接把面试题放出来的原因,没有多大的参考价值。

这一部分主要总结在面试中被考察到的知识点,多为高频面试问题,读者可以自行考察是否这些知识都掌握了。需要特别注意的是这并不是全部的知识体系,仅仅是笔者遇到的面试题,读者可以按照大体的方向去学习,但切不可认为这样就足够了,这里提到的知识点是远远不够的。

面试的过程中更多的时候不会单纯地考察知识点,而是会结合一些需求或者业务场景来多方面考察对知识点的理解。因此笔者建议,对于知识点要以理解为首要任务,而不是背诵答案

Android

总体来说,本次春招问的android内容其实不多,主要还是看着我的简历问,简历写得不多,问得也就比较少。但android的基础内容如handler、view机制等还是要会的,其他的有更加深入的研究可以写在简历加分,如Binder、系统服务、优化等。

Activity

  • Activity启动流程。
    其中考察最多的类似问题是:【从桌面点击一个图标之后,到界面显示,这个过程发生了什么?】。很多时候面试官会结合activity生命周期来考问:在启动流程的哪些阶段哪些生命周期被回调,此时Activity状态如何。
  • 启动模式。也就是常见的四种启动模式,但面试官更喜欢问何时使用他们,也就是使用场景。
  • 生命周期。这个很少单独问,一般和启动流程或者具体的业务场景结合考问。
  • context。主要是内存泄露的考察以及application和activity两种context如何选择。

Handler

  • 内部原理。Handler必会的啊,android的消息机制,可以称为android程序的引擎来的。
  • 同步屏障。涉及到绘制优化、屏幕刷新机制等。
  • 阻塞唤醒原理。这里一般是会问为何loop()方法是死循环却不会占用cpu时间片 or 为何next()方法阻塞却不会卡死。更深一点会问到Linux的IO多路复用epoll原理。
  • 卡顿与内存优化。整个主线程的所有任务都必须经过Looper,是排查卡顿和ANR的关键点,以及消息太多会造成的后果等。
  • 消息复用。

图片

  • 计算一张图片大小。分辨率x像素点大小,考察得很多次。
  • 加载优化。如LaunchActivity同时加载的图片太多如何优化、view的大小比图片小如何优化等。
  • 缓存优化。内存缓存、硬盘缓存。
  • Glide框架。重点就是Glide对上面的优化的实现原理,因此需要着重看Glide的缓存原理。
  • drawable。对比使用图片和drawable的好处,以及drawable的原理。

SharePreference

  • 内部原理
  • commit和apply的区别
  • 这部分考察得不多,但建议读者可以深入理解sp的缺点,如导致ANR原理,以及新框架MMKV、Data Store的优点。

window

考察得非常少,主要window的类型、以及window的真正定义理解即可。

view

  • 事件分发流程。考察得最多,基本把整个分发流程讲清楚就好了;其次还会考察如何解决具体的冲突场景。
  • 应用界面的view层级。
  • 绘制流程与时机。activity启动时到onResume方法被调用,view依旧还未被绘制。

IPC

  • 常见IPC类型以及优缺点。
  • Binder机制。优点、缺点、特点、和传统IPC比较。Binder涉及到的很多是偏底层,更多的时候考察的是上层的应用,如和socket比较等。
  • socket。这个会重点问,涉及优缺点、使用场景、和binder相比等。

序列化

  • serializable和parcelable的原理,以及各自的优缺点、应用场景。

jetpack

  • 使用jetpack的好处与坏处。
  • 框架原理。这部分如果写在简历也很少问,看面试官;但如果问的话,一般会问原理。

okHttp

  • 拦截器以及责任链思想。这个是问的最多的。
  • 内部调度器对线程、任务数的并发控制。
  • 优点缺点,和URLConnection相比的好处,诞生的背景等。

优化

  • 性能优化。问得很多,主要看自己平时有没有做过优化。
  • 卡顿优化。一般询问如何定位和解决卡顿问题。
  • 内存优化。一般是内存泄露、或者减少内存占用等。
  • ANR。一般会考察原理以及如何解决。
  • 工具:leakcanary、profiler。优化涉及的内容太多,这个属于比较深的内容,还是得看自己平时的项目积累。

Java

Java的考察是一个非常考验功底的地方,很多的知识点都是基础中的基础,同时又都可以延伸到底层的逻辑。这些知识点在实际的运用中,也有很多的情况需要考虑,考察我们对于知识点的运用。例如线程池,可以从参数作用、到线程池原理、到阻塞唤醒机制、到实际项目的参数配置,有非常多的知识点可以考察。因而这一块就看各位的造诣了。

当然,一些基础或者常考的知识点还是得会的。

集合框架

  • HashMap。几乎每家公司都问,主要是内部原理如hash算法、冲突解决方案、扩容方案、红黑树的优缺点等。必会的内容,不会就直接当场去世了。
  • HashSet。内部使用HashMap来实现,value设置为object。记住这个就好了。
  • ConcurrentHashMap。必问。他的并发原理以及好处,同时有些面试官也会问缺点等问题。
  • Hashtable、SychronizeMap。一般和ConcurrentHashMap一起问,进行对比。
  • CopyOnWriteArrayList。一般会作为线程安全方法来进行比较优缺点。
  • 集合框架重点还是在Map,但是其他的框架List和queue的原理也是要了解的。

访问限制符

public protect default private 四个要懂,基础知识了。(笔者就是忽略了这些当时回答错了)特别注意protect是可以跨包访问的。

  • 种内部类,特别注意每个class编译后都会产生一个class文件,不管静态或非静态。面试踩坑了
  • lambda的本质。就是匿名内部类。
  • 抽象类和接口的区别。这个很看理解,如果有开发过具体项目的会回答得更加深刻,这是背八股文体现不出来的。

异常

  • 异常体系、分类、机制。
  • 与error的区别。

IO

主要还是问NIO的原理以及优缺点。建议把缓冲流的原理也得学一学并进行比较。

线程池

  • 内部原理。必会的啊。
  • 关键参数作用及如何配置。重点在如何配置,需要结合具体的机器情况、任务情况等等考量。
  • 线程池的作用。不仅仅只是线程复用,更重要的是管理线程、控制线程数量。这个也比较考察具体的项目运用理解。
  • 常见的四种线程池。

并发

  • sychronize。必问,java的锁机制。特别是jdk6之后的锁优化以及运用场景。为什么是重量级的、JVM层如何实现如果了解可以加分。
  • Lock。必问,AQS的原理最好懂。一般会拿来和synchronize比较。
  • volatile。必问,会拿来和锁比较,他的两个重要作用。更深点会问到cpu缓存一致性协议、以及指令重排的类型与原理。
  • CAS。必问,问原理以及ABA问题。
  • 死锁。一般询问如何解决或者产生的条件。
  • Object的wait和notify。阻塞唤醒,一般会用一个代码或者具体的场景来询问如何保证多线程同步。
  • ThreadLocal。原理、内存泄露等
  • 这一块问的还是比较多,而且大都可以深入去问,看自己的学习程度了。

JVM

  • GC机制。必问。
  • 类加载机制。必问,同时还会问双亲委托机制。
  • 方法调用过程。这个也问的挺多,也看对JVM的学习程度了。
  • 线程与进程的内存关系。如一个线程占多少内存、一个进程可以开多少线程、一个进程占用多少内存等。
  • 内存分布。JMM、运行时数据区、native内存分布。很看对JVM的理解程度。

Kotlin

kotlin其实问的很少,现在大部分的项目还是使用Java开发的。一些有kotlin业务的公司会问,但是问的内容也不多。这一块如果还没学习其实不急的,把Java学好才是王道,kotlin和java在原理上,都是互通的。

协程

问的是最多的,主要是理解线程和协程的关系、协程的优缺点。这个也看个人的学习程度了。

run、let、also、with、apply

注意返回值以及作用域

特性的具体实现

如默认参数的具体实现。有了解过最好了,没有的话就联想Java是如何实现的,如默认参数可以联想方法重载。

计算机网络

计网这一部分主要还是HTTP和TCP的内容了,经典中的经典。需要注意的是链路层、网络层的一些协议要了解,也是计算机基础了,被问到不会的话会比较尴尬。其次是一些新的协议如QUIC、http3.0等可以了解一下,面试会很加分,同时也可以进一步去理解TCP的优缺点。

HTTP

http在android上的体现并不多,因为大部分的工作都给框架解决了,问的问题其实很少。

  • 历代http的优化以及原因
  • 请求方法、响应码

HTTPS

必问。一定要会了

  • 原理以及和http的区别。加密算法、hash摘要、ca证书验证都要了解
  • 建立连接过程
  • 破解:中间人攻击等

数据链路层、IP层

  • ARP和RARP协议
  • NAT协议
  • DNS
  • 这部分主要问一些常见的协议,考察计网功底,这里列出来的是笔者考察过的,读者需要比价系统地去学习这一块。

TCP

  • 握手挥手
  • 拥塞控制
  • 可靠传输原理
  • 缺点以及如何改进。这个是比较重要的,对应http3.0的优化就是针对TCP的缺点来入手的。
  • TCP的连接数目上限
  • TCP非常重要,必问的内容,不会的读者一定要去好好学习一下。

UDP

  • 优缺点
  • 和TCP比较
  • 应用场景
  • 一般和TCP一起出现,询问他们的区别,以及如何通过UDP来优化TCP的缺点。

数据格式

json的优缺点,为什么要使用json而不是XML。熟记就可以了。

设计模式

设计模式这一块问的不是很多,原因是设计模式需要实际的编码才能去真正理解他的好处。所以大部分情况下面试官都是询问在项目中用了哪些设计模式、或者哪些开源框架用了什么设计模式。其次问的最多的就是三大架构模式了,必会的。

常见的设计模式

一般面试官会让我们讲自己认识的设计模式,按照自己的理解讲出来就好了。

在项目和源码中的体现

问的最多的就是:你看过的框架源码都使用了哪些设计模式。不仅考察了设计模式、还考察了源码。另外也会问在项目中运用了哪些设计模式。

MVC\MVP\MVVM

基本必问了。结合具体的项目实现以及自己的思考,分析他们的优缺点、适用场景等。

计算机基础

计算机基础这里包括了c语言、操作系统、数据库库、以及前面的计网等等。这部分直接问的内容不多,但却是非常重要的,也是考验我们基础扎不扎实的地方。其次,面试官也会用一些业务场景来考验我们的理解程度,如聊到java并发时,问具体为何线程切换代价高;又如聊到JVM内存分布时,问在native层是怎样的内存分布以及逻辑内存物理内存等;再如聊到volatile,会问到cpu缓存一致性的问题等等。这些都是非常考验功底的内容。因而,这些基础内容要学好,不仅是为了面试,更是为了让我们自己可以更好地学习理解知识。

C语言

问的很少,偶尔会问到。笔者只被问到:同构结构体的内存占用、指针相关问题。

C语言作为语言鼻祖,一些基础还是要会的。

操作系统

  • 中断原理、作用。
  • 死锁原理以及如何解决。
  • 操作系统这一块确实问的不多,同样也是考察基础功底了。可以不问,但是问到一定要会。

项目

项目是非常重要的,一个拥有亮点的项目可为面试加分不少。面试前需要把自己的项目总结一下,提炼出项目的亮点难点。假如有优秀的项目,一定要把他写在简历上,并把亮点表现出来。

在面试中面试官一般会先让我们介绍项目,介绍项目一般可以按照这个模板来介绍:项目的背景、项目的内容、自己负责的内容、项目亮点。技术面的面试官会询问项目有什么技术亮点难点,这个时候可以把我们提前准备的亮点给面试官表述出来。例如做了什么优化、自定义view等,体现出自己在技术上的能力。

需要注意的是:面试前要把自己的项目总结好,包括背景、内容、技术难点、亮点;面试时不要觉得自己项目很捞,而要表现出自己的自信,把项目内容有条不紊地表达出来。后面回答好面试官提出的问题就可以了。

算法

算法这一块,先看看笔者在面试中遇到的算法题:

  • 重排链表
  • 出现一次的字符
  • K个一组链表反转
  • 凑零钱
  • 全路径简化
  • 字符串拆分
  • 二叉树路径和
  • 链表是否有环
  • 二叉树深度

如何提升算法,其实就是刷题,刷题,还是塔喵的,刷题。算法没有捷径可走,需要靠自己勤奋去做题。

总之,学好算法对我们是一件终身受益的事情,而不管企业考察难度如何。

面试中

未知,所以恐惧。

在没开始面试前,可能很多的读者都是人生第一次入职面试,肯定非常紧张的,在面试前甚至想着,要不算了,不面了。这都是正常的。解决的办法就是:去面一次。经历过一次之后就不会紧张了。或者说,没那么紧张了。

大厂的面试官的体验一般都是非常好的,笔者到目前为止遇到的所有面试官,都给我非常好的面试体验。

在面试的时候要注意语速与咬字清晰问题。笔者本身是一个语速很快的人,加上面试紧张,面试官很难听清楚我到底在讲什么。面试一定要控制语速,可以提前给自己录音看看什么程度的语速是最合适的。

其次,要注意自己的表达清晰。仔细听好面试官的问题,然后先组织好思路,再慢慢表述出来。回答问题,也是相当于和一个讲解知识点的过程,思路一定要清晰。一些口头禅、冗余的表达尽量去除。

有一个需要注意的点就是:不了解的东西,千万不要讲出来,切记!!!。例如,我们不懂NIO,在面试官问到传统IO的时候,就不要拿NIO去比较或者提起NIO。如果提起了,面试官99%会问一些NIO的问题,这时候就会灰常尴尬。而如果自己掌握了NIO,那么就可以不断提起NIO,把面试官的询问重点往我们熟悉的知识点牵引。

最后需要注意一点的是:拒offer是一个很考验情商的事情。这不是在凡尔赛,而是一个非常重要的事情,处理不好可能会上企业黑名单。举个最简单的例子:

现在手上拿到了企业a的offer,但是自己更加向往的企业是b,但是b还在面试。这个时候企业a的HR问你:a和b你选择哪个?然后你坚定地说肯定选择a啊。然后拖了一两个星期,b通过了,然后跟a的HR讲我不去,我去b了。不仅影响了企业a的招聘,而且HR还会觉得你言而无信。

所以,拒offer最好是趁早,不要影响人家的招聘;其次是语言前后要一致,不要当渣男or渣女。[狗头]

最后

最后想要告诉读者的是:影响面试结果的因素有非常多,如面试官心情、口味,当天自己的状态,岗位要求等等。笔者的两个同学,都是前面连续挂了两次一面,但后面也都成功拿到了BAT offer,甚至不止一个。挂掉面试绝对不是简单的自己能力不行,而是多方面的因素,总结好经验,继续面试就好了。

迈出第一步,开启第一轮面试非常重要。不要觉得自己“好菜啊,投了肯定不过的,不投了”。不投,怎么知道不过呢?面试也是一个学习的过程,会慢慢发现自己的不足,包括表达、知识等等。所以,如果你还在犹豫,赶紧投起来吧。

希望这篇文章能够给正在找实习的读者提供一点帮助,先预祝各位实习面试顺利吧。有什么问题或者想了解的内容可以评论区交流。

面试前的系统复习路线参考

面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!

接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用

帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。

1、看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

2、进行系统梳理知识,提升储备

客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

  • 架构师筑基必备技能: 深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
  • Android高级UI与FrameWork源码: 高级UI晋升+Framework内核解析+Android组件内核+数据持久化
  • 360°全方面性能调优: 设计思想与代码质量优化+程序性能优化+开发效率优化
  • 解读开源框架设计思想: 热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
  • NDK模块开发: NDK基础知识体系+底层图片处理+音视频开发
  • 微信小程序: 小程序介绍+UI开发+API操作+微信对接
  • Hybrid 开发与Flutter: Html5项目实战+Flutter进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

主要内容:

Java 基础(★★)

  • 面向对象思想
  • 多态
  • 异常处理
  • 数据类型
  • Java 的 IO
  • 集合
  • Java 多线程

Java 高级(★★)

  • Java 中的反射
  • Java 中的动态代理
  • Java 中的设计模式&回收机制
  • Java 的类加载器

Android 基础(★★★)

  • Android 基本常识
  • Activity
  • Service
  • BroadCastReceiver
  • ContentProvider&数据库
  • Android 中的布局
  • ListView
  • JNI & NDK
  • Android 中的网络访问
  • Intent
  • Fragment

Android 高级(★★★)

  • Android 性能优化
  • Android 屏幕适配
  • AIDL
  • 自定义控件
  • Android 中的事件处理
  • Android 签名
  • Android 中的动画
  • 网络协议
  • 其他

3、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

4、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
好的,以下是生成每样货物价格的 Java 代码: ```java import java.util.HashMap; import java.util.Map; public class PriceCalculator { public static void main(String[] args) { // 创建货物数量和单价的映射关系 Map<String, Double> priceMap = new HashMap<>(); priceMap.put("豆干", 10.0); priceMap.put("豆筋", 8.0); priceMap.put("豆皮", 6.0); priceMap.put("素鸡", 15.0); priceMap.put("河粉", 5.0); priceMap.put("碱面", 3.0); priceMap.put("土豆粉", 7.0); priceMap.put("嫩豆腐", 4.0); priceMap.put("老豆腐", 3.5); priceMap.put("白凉粉", 2.0); priceMap.put("白凉皮", 4.0); priceMap.put("短黄豆芽", 2.5); priceMap.put("短绿豆芽", 2.5); priceMap.put("长黄豆芽", 3.0); priceMap.put("长绿豆芽", 3.0); priceMap.put("鸡肉豆腐", 6.0); priceMap.put("绿豆凉皮", 5.0); // 创建货物数量的映射关系 Map<String, Integer> quantityMap = new HashMap<>(); quantityMap.put("豆干", 5); quantityMap.put("豆筋", 5); quantityMap.put("豆皮", 5); quantityMap.put("素鸡", 4); quantityMap.put("河粉", 10); quantityMap.put("碱面", 20); quantityMap.put("土豆粉", 5); quantityMap.put("嫩豆腐", 1); quantityMap.put("老豆腐", 1); quantityMap.put("白凉粉", 2); quantityMap.put("白凉皮", 20); quantityMap.put("短黄豆芽", 5); quantityMap.put("短绿豆芽", 5); quantityMap.put("长黄豆芽", 5); quantityMap.put("长绿豆芽", 15); quantityMap.put("鸡肉豆腐", 10); quantityMap.put("绿豆凉皮", 10); // 计算每样货物的价格 for (String item : priceMap.keySet()) { double price = priceMap.get(item); int quantity = quantityMap.get(item); double total = price * quantity; System.out.println(item + ":" + total + "元"); } } } ``` 你可以将上述代码保存为一个名为 `PriceCalculator.java` 的文件并运行它,将会输出每样货物的价格。请注意,以上只是一个简单的示例代码,你可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值