面试时间:2019.12.29 1~3面、2020.1.03 4~6面、2020.1.06 HR面 面试部门 + 岗位:商业化 - 高级 Android 开发工程师 面试感想:整体面得比较累,基础面、交叉面、Boss面,前前后后对接了 6 个面试官 (离当初给我说的 3面+HR面 貌似差得有点远¬_¬) 。算法到 Boss 面都还在写,不过庆幸的是面试官没有为难我 (老实交代了算法没怎么准备,哎...),算法都不太难。整体项目比基础问得多。 面试建议:算法、基础是敲门砖,项目是试金石,良好的面试形象是加分项。 简历上列举的项目多想想,为什么做这个项目?做这个项目的目标是什么?我的方案是什么?相对其他方案我的方案优势是什么?项目的收益是什么?项目的架构图是否能画出来?项目中使用的主要框架原理是否前前后后都清楚?(我大概就是项目拯救了自己,基础准备有点仓促T^T)。 如果是现场或视频面试,良好的面试形象还是比较有必要的。在部门 TL 面的时候,就提到我相对很多其他面试者比较好的一点就是,整个人的形象状态比较好,没有让人觉得很疲惫。
Android 目前稳定高效的UI适配方案、今日头条屏幕适配方案 AndroidAutoSize、今日头条-通过反射修正系统的 density 值 dpi:屏幕像素密度,指的是在系统软件上指定的单位尺寸的像素数量,它往往是写在系统出厂配置文件的一个固定值;ppi:也是屏幕像素密度,但这个是物理上的概念,它是客观存在的不会改变。dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值;dp加上自适应布局和weight比例布局能解决90%的适配问题。因为并不是所有的1080P的手机dpi都是480,比如Google 的Pixel2(1920*1080)的dpi是420;宽高限定符适配:穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件。但其有一个致命的缺陷,那就是需要精准命中才能适配,App包体积也会变大
写 demo 试了下是可以的。但会有什么问题还没弄清楚...
问题很细,能准备多详细就准备多详细。人家自己封装了一套 Handler 来避免内存泄漏问题
自己做的一个项目,原理讲清楚就行,讲不清就画图
调试GPU过度绘制,将Overdraw降低到合理范围内;减少嵌套层次及控件个数,保持view的树形结构尽量扁平(使用Hierarchy Viewer可以方便的查看),同时移除所有不需要渲染的view;使用GPU配置渲染工具,定位出问题发生在具体哪个步骤,使用TraceView精准定位代码;使用标签,merge减少嵌套层次、viewStub延迟初始化、include布局重用 (与merge配合使用)
4.省略若干项目相关问题...
使用 AtomicInteger 可以使 i++ 线程安全
考点:Java 值传递 (第 2 题相同)。编写代码测试,在 changeValue() 方法中修改入参,并不会改变之前的值;原理 :Java 程序设计语言总是采用按值调用,方法得到的是所有参数值的一个拷贝,即方法不能修改传递给它的任何参数变量的内容。基本类型参数传递的是参数副本,对象类型参数传递的是对象地址的副本;题解:在 changeValue() 中,对于对象类型参数,直接修改的是对象地址副本的值,所以之前变量的地址并未被修改!若修改的是对象实例里面的某个值,之前变量则会被修改
public void test() {
String str = "123";
changeValue(str);
System.out.println("str值为: " + str); // str未被改变,str = "123"
}
public changeValue(String str) {
str = "abc";
}
下面的代码,再次使用对象 student 是否需要判空?
Java 中方法参数的使用情况总结: 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型);一个方法可以改变一个对象参数的状态;一个方法不能让对象参数引用一个新的对象
public void test() {
Student student = new Student("Bobo", 15);
changeValue1(student); // student值未改变,不为null! 输出结果 student值为 name:Bobo、age:15
// changeValue2(student); // student值被改变,输出结果 student值为 name:Lily、age:20
System.out.println("student值为 name: " + student.name + "、age:" + student.age);
}
public changeValue1(Student student) {
student = null;
}
public static void changeValue2(Student student) {
student.name = "Lily";
student.age = 20;
}
aapt 工具打包资源文件,生成 R.java 文件aidl 工具处理 AIDL 文件,生成对应的 .java 文件javac 工具编译 Java 文件,生成对应的 .class 文件把 .class 文件转化成 Davik VM 支持的 .dex 文件apkbuilder 工具打包生成未签名的 .apk 文件jarsigner 对未签名 .apk 文件进行签名zipalign 工具对签名后的 .apk 文件进行对齐处理
求路过大神们的正解...
金句:现在自己的技术成长有点碰到瓶颈,加上一直对您公司钦慕有加
面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。
有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。