by hzwusibo 20190504
最近换工作,面试了一波。 本篇文章分享下面试中的真题回忆,与个别地方记得不是很清楚了。
拼多多面试
一面:
1、byte、char区别
byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 。
char可以表中文字符,byte不可以。
1byte 存1个英文字母,2个byte存一个汉字。
Java默认的字符编码是Unicode。
https://blog.csdn.net/witnessai1/article/details/52540910
2、recycleview的优点 缺点
a.替代Listview和GridView,既可以加载列表也可以加载表格
b.支持瀑布流这样高级的显示方式
c.内置了强大的垃圾回收机制
d.规范了Viewholder的使用
RecycleView和ListView的区别
https://blog.csdn.net/u012221316/article/details/80297036
RecyclerView使用总结-------上
https://www.jianshu.com/p/5ad99a1170ab
https://www.cnblogs.com/cr330326/p/5534915.html
因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。
ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。
压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
优化(Optimize):对字节码进行优化,移除无用的指令。
混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
总而言之,根据官网的翻译:Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。
4、内存泄露,优化,使用的工具
见内存优化,什么情况导致内存泄漏
5、两个A、B 相互应用
软引用
6、anr问题总结 (null指针不是)
有遇到那些anr
怎么避免anr
https://www.jianshu.com/p/9db73a26a8bd
7、okhttp优缺点、源码, 网络: HTTP2相对于http1优点, (为什么) https原理(怎么进行的连接),为什么比http更耗时(要进行一个密钥传输)
关于 HTTP2 和 HTTPS,这些你必须要知道
http://wemedia.ifeng.com/72005448/wemedia.shtml
HTTP2 详解
https://www.jianshu.com/p/e57ca4fec26f
2、多路复用 (MultiPlexing)
在一个 TCP 连接上,我们可以向对方不断发送帧,每帧的 stream id 的标明这一帧属于哪个流,然后在对方接收时,根据 stream id 拼接每个流的所有帧组成一整块数据。流的概念实现了单连接上多请求 - 响应并行,解决了线头阻塞的问题,减少了 TCP 连接数量和 TCP 连接慢启动造成的问题。
https原理
https://blog.csdn.net/qq_32998153/article/details/80022489
9、 oom能不能被捕获,为什么, 有没有分配bitmap成功?
https://blog.csdn.net/gvvbn/article/details/79454701
只有在一种情况下,这样做是可行的:
在try语句中声明了很大的对象,导致OOM,并且可以确认OOM是由try语句中的对象声明导致的,那么在catch语句中,可以释放掉这些对象,解决OOM的问题,继续执行剩余语句。
但是这通常不是合适的做法。
Java中管理内存除了显式地catch OOM之外还有更多有效的方法:比如SoftReference, WeakReference, 硬盘缓存等。
在JVM用光内存之前,会多次触发GC,这些GC会降低程序运行的效率。
如果OOM的原因不是try语句中的对象(比如内存泄漏),那么在catch语句中会继续抛出OOM
https://blog.csdn.net/Mr_LiaBill/article/details/50209617
10、handler的原理, loop怎么与handler进行绑定
https://blog.csdn.net/lqb3732842/article/details/54947159
https://blog.csdn.net/lmj623565791/article/details/38377229
handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有handler进行Message的分发与处理。
a、首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
b、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
c、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
d、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。
e、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。
11、介绍下项目:
12、glide优缺点, 源码、Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中
怎么实现的
Glide也并没有使用什么神奇的魔法,它内部的实现原理其实就是上面那篇文章当中介绍的技术,因此掌握了最基本的实现原理,你也可以自己实现一套这样的图片压缩机制。Android高效加载大图、多图解决方案,有效避免程序OOM
35、Android高效加载大图、多图解决方案,有效避免程序OOM
https://blog.csdn.net/guolin_blog/article/details/9316683
36、inSampleSize优化
https://www.jianshu.com/p/f15cd2ed6ec0
13、httpUrlconnetion有没有缓存
有
大搜车:
1、mvc、mvp缺点
MVC缺点:随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
mvp的问题在于view层和presenter层是通过接口连接,在复杂的界面中,维护过多接口的成本很大。
解决办法是定义一些基类接口,把网络请求结果,toast等通用逻辑放在里面,然后供定义具体业务的接口集成。
2、rxjava
优雅的实现方法 - 基于事件流的链式调用
map和flapmap区别
flatMap() 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。但需要注意,和 map()不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。
flatMap() 的原理是这样的:1. 使用传入的事件对象创建一个 Observable 对象;2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法。这三个步骤,把事件拆成了两级,通过一组新创建的 Observable 将初始的对象『铺平』之后通过统一路径分发了下去。而这个『铺平』就是 flatMap() 所谓的 flat。
3、手写单利模式, (线性安全的)
4、view的事件分发机制,什么设计模式
职责链
dispatchTouchEvent 分发事件
onInterceptTouchEvent 拦截事件只有viewgroup才有,view和activity没
onTouchEvent 处理点击事件
1,图解ACTION_DOWN 事件分发,如果面试的时候能把下面的图画出来。能增分不少
dispatchTouchEvent和 onTouchEvent的框里有个【true---->消费】的字,表示的意思是如果方法返回true,那么代表事件就此消费,不会继续往别的地方传了,事件终止
2,红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向
image
5、 给一个Arraylist<String > list 去除中间 string 等于 A的 item , 返回list
list中元素可能有重复
6、view的测量
https://blog.csdn.net/suyimin2010/article/details/80991737
MeasureSpec这个类通过计算后得出的int值是包装了View测量模式和尺寸的,这个得出的值一个32位的整型数,高两位代表了测量模式,后30位代表了测量尺寸,View的测量的模式分为3种,分别对应了UNSPECIFIED、EXACTLY、AT_MOST
7、fragment生命周期
8、onSaveInstanceState(Bundle outState) 、onRestoreInstanceState(Bundle savedInstanceState) 方法
https://blog.csdn.net/u011068702/article/details/70217576
存储:
恢复:
9、注解的保留时机
https://blog.csdn.net/cts529269539/article/details/79073115
Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:
1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
https://www.cnblogs.com/kingcode/p/7203568.html
10、 工作中最优成就感的事情是什么?
11、Glide图片裁剪
12、进程之间通讯方式
bindle 文件共享 aidl contentprovider socket
13、git 恢复误删的分支,怎么恢复
https://www.cnblogs.com/xd502djj/p/9319980.html
从最近一次commit 中检出分支,可重命名,本例chon重命名为:reback_remove_branch
git checkout -b reback_remove_branch ddd94a4
妈妈帮
1、Android中为什么主线程不会因为Looper.loop()方法造成阻塞
2、okhttp源码
3、gilde源码
4、介绍项目
5、bindler机制
百度一面:
1、介绍项目:
2、进程通讯方式、bindler原理,bindler怎么进行数据交换:
3、自己怎么实现一个listview ,事件分发的处理, 里面的事件是怎么传递, item中一个button怎么进行监听 (中onTouch与onClick两种监听)
Android ListView工作原理完全解析,带你从源码的角度彻底理解
https://blog.csdn.net/guolin_blog/article/details/44996879
Android视图绘制流程完全解析,带你一步步深入了解View(二)
https://blog.csdn.net/guolin_blog/article/details/16330267
https://blog.csdn.net/zzsakurazz/article/details/52604173
https://www.jianshu.com/p/a02cc07b25b1
view的onmseuare、 onlayout、ondraw
Android ViewGroup和View的传递事件
https://blog.csdn.net/gyh790005156/article/details/47316343
Android中onTouch与onClick两种监听的完全解析
https://blog.csdn.net/ll530304349/article/details/53036276
4、okhttp源码, 源码设计大概流程,OkHttp怎么复用连接池
https://www.cnblogs.com/qlky/p/7298995.html
okhttp连接池复用机制
https://blog.csdn.net/tangjiean/article/details/51729371
5、glide源码:
6、怎么实现代码规范:
7、说说用过异步, 锁、 lock和synchorinzed的区别, 在实现上区别 ,sync在jvm实现原理。
synchronized是托管给JVM执行的,而lock是java写的控制锁的代码
synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低。
而Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
https://www.cnblogs.com/lykm02/p/4516777.html
Java锁--Lock实现原理(底层实现)
https://blog.csdn.net/qpzkobe/article/details/78586619
https://www.cnblogs.com/duanxz/p/3559510.html
8、检测内存泄露工具,LeakCanary实现原理。 有那些内存泄露
1、RefWatcher.watch()创建了一个KeyedWeakReference用于去观察对象。
2、然后,在后台线程中,它会检测引用是否被清除了,并且是否没有触发GC。
3、如果引用仍然没有被清除,那么它将会把堆栈信息保存在文件系统中的.hprof文件里。
4、HeapAnalyzerService被开启在一个独立的进程中,并且HeapAnalyzer使用了HAHA开源库解析了指定时刻的堆栈快照文件heap dump。
5、从heap dump中,HeapAnalyzer根据一个独特的引用key找到了KeyedWeakReference,并且定位了泄露的引用。
6、HeapAnalyzer为了确定是否有泄露,计算了到GC Roots的最短强引用路径,然后建立了导致泄露的链式引用。
7、这个结果被传回到app进程中的DisplayLeakService,然后一个泄露通知便展现出来了。
看完这篇 LeakCanary 原理分析,又可以虐面试官了!
https://mp.weixin.qq.com/s/1jFY_22hoWgCw3CDo2rpOA
拼多多二面
1,项目( 有声书sdk,解析器sdk,主导书架模块重构,接口能不能合并,为什么(批量接口)),
音频焦点AudioFocus使用
2, 说说兴趣爱好,说说最近看到有没有什么框架很有亮点
bravh, gilde的优点源码
3, 项目 怎么实现正文截图
4、手写代码 lrucache缓存, Linkedhashmap的数据结构
https://www.cnblogs.com/Java3y/p/8798058.html
https://www.cnblogs.com/liuling/archive/2015/09/24/2015-9-24-1.html
5、说说java的 GC算法
拼多多三面
1、多进程有哪些,画出bundle的实现图,怎么实现数据的通讯, 数据怎么拷贝(序列化,反序列化),说说aidl实现过程
https://www.jianshu.com/p/09cf72d934a7
2、说说rxjava
3、觉得项目最大的亮点
(说的自定义view)
说说自己实现 继承viewgroup
4、 jsbrige实现原理 ,相互怎么调用
5、 json数据解析类型(比较)
https://blog.csdn.net/qidasheng2012/article/details/82996405
6、MainActivity的启动流程(系统启动流程)
Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程
当所有的服务都启动完毕后,SystemServer会打印出“Making services ready”,然后通过ActivityManager启动Home界面,并发送“ACTION_BOOT_COMPLETED”广播消息
7、说说activity、window、fragment之间的关系,分别干什么
https://blog.csdn.net/qq_34378183/article/details/52785669
8、线程的几种状态, ( 线程在jni中的状态(答,目前项目没用jni))
https://blog.csdn.net/pange1991/article/details/53860651
拼多多hr面
1、为什么想离职
2、为什么想来拼多多
3、薪资
4、上家公司职级
5、有没有在面其他公司
6、有没有什么想问的
百度二面
1、手写代码 线程安全的观察者模式,synchromzd和lock区别, 有什么什么方式让同步块更细。
2、mvc mvp mvvm模式优缺点,有没有使用过mvvm模式
3、项目 在升级target中做的一些事 , fileprovider是替换什么
Android O N适配文档
4、 rxjava的线程切换 ,subscribeOn() 和 observeOn() 作用范围,为什么是这样,原理是什么。
5、 项目中有没有rxjava与 Retrofit 的结合,讲下okhttp源码,用okhttp和 Retrofit 分别作用是什么
用okhttp和 Retrofit 分别作用是什么 , 原来的网络库是什么,为什么要替换成okhttp。
https://www.jianshu.com/p/4d67fe493ebf
6、koltin优缺点,什么地方使用。
7、 为什么要替换老的图片库,新的(gilde)有什么优点, gilde缓存(原始图片和尺寸的图片)
//DiskCacheStrategy.SOURCE:缓存原始数据,
// DiskCacheStrategy.RESULT:缓存变换后的资源数据,
// DiskCacheStrategy.NONE:什么都不缓存,
DiskCacheStrategy.ALL:缓存SOURC和RESULT。
// 默认采用DiskCacheStrategy.RESULT策略
8、为什么要用recycleview 优点, item复用的原理是什么
9、 觉得项目中的亮点是什么?
性能优化方面的工作(书架重构(分层设计,三层解耦), 内存泄露排查等), 一些复杂的自定义view的实现。(不能满足交互需求)
10、有没有去看过一些比较好的框架,有没有去看过一些源码
11 、说一说android内存泄露,有使用哪些工具,LeakCanary原理,为什么非静态内部类默认会持有外部类的引用。hander造成的内存泄露应该怎么处理。 webview没有释放为什么会造成内存泄露。 有没有使用过as的一些工具,有什么功能能检测到内存泄露, 如何排查?
非静态内部类为什么持有外部类的this引用
https://blog.csdn.net/beixiaozhang/article/details/52950669
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this访问外部类的成员。
1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象(this)的引用;
2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为内部类中添加的成员变量赋值;
3在调用内部类的构造函数初始化内部类对象时,会默认传入外部类的引用。
12、为什么WebView会造成的内存泄露
Android 5.1 WebView内存泄漏问题及解决
https://blog.csdn.net/u013085697/article/details/53259116
13、说说http2
关于 HTTP2 和 HTTPS,这些你必须要知道
http://wemedia.ifeng.com/72005448/wemedia.shtml
14、 Lrucache原理,linkhashmap的数据结构是什么样的
https://www.cnblogs.com/liuling/archive/2015/09/24/2015-9-24-1.html
LruCache是通过LinkedHashMap来实现的。LinkedHashMap继承了HashMap,它使用一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor, boolean accessOrder)指定。对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。LruCache中将LinkedHashMap的顺序设置为LRU顺序来实现LRU缓存,每次调用get(也就是从内存缓存中取图片),则将该对象移到链表的尾端。调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。
百度三面
1,算法: 写代码, 一个url,得到最近的5个, 得到使用次数最多的5个,有什么优化空间,时间复杂度是多少, 什么数据结构是有序列的(堆),有没有使用过
Linkhashmap
通过反射,获取linkedHashMap的最后一个键值对。对map按照值进行排序。
https://www.cnblogs.com/liyafei/p/9620894.html
Map<Integer, Integer> map = new LinkedHashMap<>();
Field tail = map.getClass().getDeclaredField("tail");
tail.setAccessible(true);
Map.Entry<Integer,Integer> entry=(Map.Entry<Integer, Integer>) tail.get(map);
Integer key = entry.getKey();
Integer value = entry.getValue();
2,koltin优缺点,中的静态变量用什么表示。 会不会一些高级的用法( 委托什么, 不经常使用)
Kotlin静态方法和静态类
https://blog.csdn.net/YULU5216/article/details/80083084
kotlin委托(类似代理)
https://www.jianshu.com/p/a70ba6436e75
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。
3,rxjava使用 (背压)
关于RxJava背压 (很详细)http://flyou.ren/2017/04/05/%E5%85%B3%E4%BA%8ERxJava%E8%83%8C%E5%8E%8B/?utm_source=tuicool
4,handler的实现机制
Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
https://blog.csdn.net/lmj623565791/article/details/38377229
5,loop自循环为什么不会阻塞
https://blog.csdn.net/u013435893/article/details/50903082
Android是事件驱动,Looper内部是一个while死循华,只有程序退出后循环才会停止,如果Looper使用中死掉了,任何事件都不会有反应了。事件只会阻塞Looper,而Looper不会阻塞事件。
ActivityThread 有个 getHandler 方法,得到这个 handler 就可以发送消息,然后 loop 里就分发消息,然后就发给 handler, 然后就执行到 H(Handler )里的对应代码。所以这些代码就不会卡死~,有消息过来就能执行。举个例子,在 ActivityThread 里的内部类 ApplicationThread 中就有很多 sendMessage 的方法。
简单的来说:
ActivityThread的main方法主要就是做消息循环,一旦退出消息循环,那么你的程序也就可以退出了。
从消息队列中取消息可能会阻塞,取到消息会做出相应的处理。如果某个消息处理时间过长,就可能会影响UI线程的刷新速率,造成卡顿的现象。
主要原因有2个
1、epoll模型 当没有消息的时候会epoll.wait,等待句柄写的时候再唤醒, 主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。
2、所有的ui操作都通过handler来发消息操作。 比如屏幕刷新16ms一个消息,你的各种点击事件,所以就会有句柄写操作,唤醒上文的wait操作,所以不会被卡死了。
主线程的死循环一直运行是不是特别消耗CPU资源呢? 这里涉及到Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。
https://www.zhihu.com/question/34652589
百度四面:
1,觉得最有亮点的事是什么
优化
架构,比如书架分层,数据层与界面层进行解耦。
内存泄露等优化
( 对那些技术掌握的比较好)
2,职业规划是什么,觉得做一个小产品(20万日活)和 一个大项目(2亿日活)有一些什么不同, 这种切换要做一些什么准备?
首先明确大项目和小项目都一样重要,都需要扎实的基本功和项目推动能力。小项目一搬一个人就能搞定,对个人能力要求比较高。 然后大项目是由很多小项目一起构成的, 同时往往涉及到多人合作或者跨部门合作等,除了对个人的能力要求之外,还需要有大局观,协调能力,交际能力,是一个综合素质的体验。
需要准备的就是基本功,沟通,反馈能力,能做到项目闭环。
另外技术上:
更要注重代码质量,相互review
分享思路,开会解决
修改代码,影响范围文档
多种方案的技术选型,比较
保证稳定(关键)
3,如果版本中有定制功能开发怎么去实现(技术和非技术上),怎么保证与主办版一致?
a、可以根据渠道号、标记等进行区分
4,有没有使用一些新的技术,觉得最大的亮点是什么?
gilde okhttp bravh等优点
5,一个版本开发中要注意什么,一些什么能力最重要?
非技术上:
a、 沟通能力
b:团队精神和协作能力
团队精神和协作能力是作为一个程序员应具备的最基本的素质。软件工程已经提了将近三十年了,当今的软件开发已经不是编程了,而是工程。独行侠可以写一些程序也能赚钱发财,但是进入研发团队,从事商业化和产品化的开发任务,就必须具备这种素质。可以毫不夸张的说这种素质是一个程序员乃至一个团队的安身立命之本。
技术上:
还有最基本的技能, 能够调研,技术积累,代码review, 思路探讨,影响范围等。
c、文档习惯
文档是一个软件系统的生命力。一个公司的产品再好、技术含量再高,如果没有缺乏文档,知识就没有继承,公司还是一个来料加工的软件作坊。作为代码程序员,必须将30%的工作时间写用于技术文档。没有文档的程序员势必会被淘汰。
d:规范化的代码编写习惯
知名软件公司的代码的变量命名、注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。 一些所谓的高手甚至叫嚣高手写的代码一般人看不懂,我只能说他不是一名合格的程序员。
e:需求理解能力
程序员要能正确理解任务单中描述的需求。在这里要明确一点,程序员不仅仅要注意到软件的功能需求,还应注意软件的性能需求,要能正确评估自己的模块对整个项目中的影响及潜在的威胁,如果有着两到三年项目经验的熟练程序员对这一点没有体会的话,只能说明他或许是认真工作过,但是没有用心工作。
6,为什么来上海,为什么从原来部门离职。
7,有什么事会觉得压力大
8,如果一个项目一周要上线,但是当前这个技术方案不是很好,怎么处理
a、人力
b、 和产品协商,
c、 和领导沟通看有没有其他人(善于解决这类问题),
d、 能不能拆分版本,迭代上线。
9 领导给你一个不太好的绩效时候,给比你能力弱的人好的绩效时候,怎么去沟通
思考为什么没有有达到领导对你的预期。
那些方面还可以进行改进。
10 有没有去看过一些源码
11 觉得好的架构设计应该是什么样的
https://www.cnblogs.com/geek6/p/3951677.html
代码上:
a、 总原则:开闭原则(Open Close Principle) 模块解耦模块化
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
b、单一职责原则: 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。
c、里氏代换原则面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范
d、依赖倒转原则: 这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
e、接口隔离原则: 每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
f、 最少知道原则: 一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
g:合成复用原则: 原则是尽量首先使用合成/聚合的方式,而不是使用继承。
其它的方面:
一个好的架构并不是一定要什么牛逼的技术,而是根据当前业务的特点,以合理的人力成本和硬件成本实现,并且在未来几年内能满足业务需求,高性能、高可用、易维护,易扩展,就是好的架构。
12 如果是一个成熟的产品,没有那么多功能迭代,怎么看
a、可以由更多的时间积累,预研新的技术,做技术储备
b、能够对老的技术点进行优化,性能提升
c、可以更充足的进行技术选型,找到最适合项目的技术。
13、如何推进你开发的sdk, 让组内其它成员了解,并使用。
a、 首先可以在周会上分享自己做的是个什么东西,能提供一些什么功能,性能能提升多少,一些原理等,让组内其他成员了解。
b、可以去看看其他产品有什么地方能够替换, 可以帮忙列出list
c、可以拉个分支试着去改造,分享下能提升多少
d、可以写文档,书面分享技术,让更多人去了解。
百度五面
1,是不是视觉给的切图都直接使用
2,哪里人,为什么离职,怎么去的网易
3,在网易的职级
4,有没有关注新的技术,有没有关注小程序
5,职业规划
6,当前工作的一些情况
7,当前产品的情况
8,现在工作时间,工作结束后是学习还是加班
阿里一面
(喜欢问: 为什么要这样做, 什么场景下提出来。 这样做的目的是什么)
1、介绍下项目,有一些什么部分(为什么要这样做,这样做的目的是什么, 希望达到什么样的效果, 优化了多少,结果)
自定义view、书架模块化
2、Java 类加载机制(阿里面试题)-何时初始化类 ( 重点 )
https://www.cnblogs.com/aspirant/p/7200523.html
3、app的启动流程
4、helloword jvm是如何进行绘制到屏幕上的(类的加载过程)
5、java jvm垃圾回收机制
6、有没有看过什么源码?
okhttp原理、gilde等
7、如何使用okhttp去使用代理模式
拦截
8、https 如何连接, 如何去申请证书, 如何验证证书, 证书如何传递
9、有什么工作是你主动提出来的, 为什么要替换图片库, 在shenm场景提出来的,别人提出了些什么
9、android中内存泄露是什么, 有一些什么场景 , 有什么常用的工具(原理)
10、一次完整的http请求是什么样的
11、okhttp如何支持HTTP2的
头条一面:
1、简单自我介绍、项目
2、说一说项目中的难点
3、自己设计一个图片缓存怎么实现,使用什么算法 (Lruchache), LindedHashmap原理(内部构造), 双链表相对于单链表有什么区别(优点), hashmap如何扩容? , 是否是线程安全的。 线程安全的有哪些? 线程安全类锁,对象锁。
浅谈单链表与双链表的区别
https://blog.csdn.net/kangxidagege/article/details/80211225
https://www.cnblogs.com/Java3y/p/8798058.html
、Synchronized方法锁、对象锁、类锁区别
https://blog.csdn.net/jerrywu145/article/details/79821094
https://www.cnblogs.com/yw-ah/p/5842354.html
4、Rxjava的使用,如何进行线程切换,io 和 newThread()区别,(内部是不是线程池) , 说说常用的操作符, 如何组合两个网络请求。
5、项目在什么情况下使用了koltin,优缺点
6、内存泄露,有哪些
7、算法、如何打乱一个有序数组,时间复杂度等
8、写算法,层次遍历树结构
阿里二面:
1、自我介绍
2、觉得自己有没有什么特别,在项目中
喜欢用新的技术
3、内存优化
4、流量优化、电量优化
5、怎么进行层级优化
LinearLayout 对比 RelativeLayout(百度)(Ricky)
RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure,RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
最后再思考一下文章开头那个矛盾的问题,为什么Google给开发者默认新建了个RelativeLayout,而自己却在DecorView中用了个LinearLayout。因为DecorView的层级深度是已知而且固定的,上面一个标题栏,下面一个内容栏。采用RelativeLayout并不会降低层级深度,所以此时在根节点上用LinearLayout是效率最高的。而之所以给开发者默认新建了个RelativeLayout是希望开发者能采用尽量少的View层级来表达布局以实现性能最优,因为复杂的View嵌套对性能的影响会更大一些。
https://www.cnblogs.com/gudi/p/6403953.html
7、有没有看过Android源码
8、职业规划
9、说下缓存
10、MVP、MVVM。项目中有没有使用过。 MVVM是用什么双向绑定。
11、android进程间的通讯、bindler原理、 bindler是怎么修改底层的数据
12、有没有项目管理方面的实践
头条二面:
1、算法 反转链表
2、多进程通讯方式, bundle原理
3、进行与线程区别
4、两种序列化区别为什么
5、自定view怎么滑动,怎么解决滑动冲突
6、介绍项目难点
7、java多线程安全, 有哪几种, 对象锁、类锁区别、可重用锁、volidate 、threadlocal
8、类的加载
9、MeasureSpec