在一个烈日炎炎的下午,我借着地铁、公交、单车一路奔到传说中的后厂村路,来到了百度科技园。扫描短信二维码后,我来到了百度某号楼内。走在百度办公区域两旁的步道上,你能感受到互联网大厂的优雅、高档的工作氛围,让人有种进入电视中职场情景的兴奋。闲言少叙、言归正传。
第一个面试我的是一个很有亲和力的与本人年级相仿的小伙子(人与人之间的差距就是这么大,要承认)。他带我来到了面试的会客室(零食间),拿来了两页笔试题给我。我接过笔试题和签字笔,扫了一眼题量和内容,心中还算有点把握(自信脸)。笔试题目请看下一段,可能与实际题目偏差,请多多包涵。
1.3|4的值
0b011|0b100=0b111=7
2.obj1.equals(obj2)为true,obj1.hashCode()==obj2.hashCode()是否为true
Effective Java一书中的解释:
只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数
所以,当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
3.volatile的作用
a.共享变量可见性
当写一个volatile变量时,JMM会把线程对应的工作内存中的变量拷贝刷新到内存中,当另一个线程读取一个volatile变量时,JMM会它的工作内存中的变量拷贝置为无效,只能从内存中重新读取变量。
b.禁止指令重排序,指令间插入一条Memory Barrier通知编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序
4.java中对象的四种引用
a.强引用:new 一个对象或者数组,读出它的地址给该对象或者数组的同一类型引用变量,如成员变量赋值,Object object=new Object();
回收时机:引用变量指向时对象不会被gc回收,JVM只会抛出OutOfMemory也不会回收这种对象
b.软引用: 如代码片段,object对象被sref对象软引用,或者说,object对象的引用路径中包含sref对象的软引用。
注:object对象,sref对象均为强引用类型对象
Object object=new Object();
SoftReference sref=new SoftReference(object);
回收时机:gc回收时,仅当内存空间不足,才会回收这些对象;
c.弱引用:
Object object=new Object();
WeakReference wref=new WeakReference(object);
回收时机:gc回收时,直接回收这些弱引用关联的对象。
d.虚引用:PhantomReference,与引用队列关联使用
回收时机:gc回收时,直接回收虚引用关联的对象
参考站点:
https://www.cnblogs.com/huajiezh/p/5835618.html
5.activity的启动模式
a.standard
android manifest文件中activity的launchmode的默认值。每次启动都会在当前活动栈中创建新的activity的实例。
b.singletop
每次启动时,若Activity在栈顶,不会创建新的实例,而会调用其onNewIntent方法。不允许相同的activity实例叠加。常用于消息通知详情的activity。
c.singletask
启动时,若相同的Activity实例存在,则会把任务栈中在其之上的其它Activity销毁,然后调用它的onNewIntent方法。活动栈中只允许创建一个activity实例。
d.singleinstance
在activity的应用程序中启动时,每次会创建一个新的任务栈,在此acticity种启动应用中的其他启动类型activity,若默认活动栈没有创建,则会创建一个新的默认活动栈。一个栈中只允许存在一个activity实例。
6.LocalBroadcastManager的作用
进程内的局部广播注册与发送。
相对全局广播的优势:
a.基于handler机制,不牵涉Binder 驱动层,通信效率更高
b.广播只在在进程内发送,避免隐私泄露
c.拒绝其他的应用的伪造广播,减少安全隐患
7.
class MyActivity extends Activity {
TextView mTextView;
new Thread(new Runnable(){
//在此处显示mTextView的文案为“helloworld”???
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setText("helloworld");
}
});
}).start();
}
8.链表的逆序实现
https://blog.csdn.net/jianyuerensheng/article/details/51200274#t2
9.Intentservice与Service的区别
相同点:通过startService(Intent)或bindService(Intent,ServiceConnection)启动
a.Service的周期方法都运行在主线程中,启动后不会开启子线程,也不会自行销毁
b.Intentservice在执行onCreate时会开启一个拥有消息队列的的子线程,每次启动Intentservice时,都会添加任务到消息队列,任务以队列的结构在onHandleIntent执行,队列为空时,Intentservice会自行销毁。Intentservice简化了Service开启子线程、销毁Service的流程,多用于需要自行结束的耗时任务,比如下载任务。
二十分钟后,放弃了两道题,我直接将试题递给对面的面试小伙,他看到链表那道题没有做,也提示了我怎么做,我听后恍然大悟(假装脸)。他主要结合我的项目和技能点来提问。问:“知道观察者模式吗?”,答:“不知道”。一脸尴尬。问:“disklrucache怎么实现的?”,答:“…”。沉默中。问:“那lrucache呢?”,答:“…最近最少使用…数据结构linkedhashmap…”。发问如流水,回答如抽丝。问:“自定义view实现?”,答:“…onlayout…onmeasure…”。吞吞吐吐。他看出了我的窘迫,就我还有什么要问的吗,我就询问了一下对方的app的业务类型,他解释了一番。确认我没有问题了,他吩咐我等另外一个人,就拿着我的简历和试题走出房间。 几分钟后,从外面走来一个一脸严肃的的小伙子(百度很年轻啊),我看到长了一张部门负责人的脸,心中生出一丝不安。他主要结合简历上的技能点和业务场景来发问。具体的尬聊对话我就省去了。
欲知前面两位面试者的口述题目,请看下一段。
1.单例模式(场景、手写)
手写:静态内部类加载
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.instance;
}
}
场景:
a.耗费资源过多的对象(组件类Service对象、访问数据库、文件的对象)
b.频繁的进行创建和销毁的对象(工具类)
优点:节省内存占用、避免对资源的多重占用(多线程文件的写操作)
2.观察者模式(原理、场景)
链接地址:https://blog.csdn.net/zhengzhb/article/details/7471978
3.activity与fragment的生命周期联动
链接地址:https://blog.csdn.net/gjy_it/article/details/52150773
4.handler源码
链接地址:https://blog.csdn.net/garyhu1/article/details/54573548
5.ThreadLocal
链接地址:https://www.cnblogs.com/dolphin0520/p/3920407.html
6.线程通信
链接地址:https://blog.csdn.net/Leonardo9029/article/details/51276341
7.进程通信
链接地址:https://blog.csdn.net/u011240877/article/details/72863432#android-几种进程通信方式
8.binder的原理
链接地址:https://blog.csdn.net/freekiteyu/article/details/70082302
9.自定义view实现一个波纹渐变的圆环
链接地址:https://github.com/HotBitmapGG/CreditSesameRingView
10.事件分发
如上图,有A与B两个按钮,点击B后,写出事件分发的方法的调用顺序
链接地址:https://blog.csdn.net/fyplant12/article/details/47276795
11.http/https协议
链接地址:http://www.cnblogs.com/yzjT-mac/p/6126772.html
12.内存泄漏原因
链接地址:https://www.jianshu.com/p/90caf813682d
13.写出持有一个context的单例类
public class Singleton{
private static volatile Singleton instance = null;
private Context mContext;
private Singleton(Context context){
this.mContext = context;
};
public static Singleton getInstance(Context context){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton(context.getApplicationContext());
}
}
}
return instance;
}
}
原因:静态单例的生命周期>activity或service的生命周期,当activity或service销毁时,静态单例依然持有activity或service对象,造成组件对象不能回收的内存泄露,因为,context.getApplicationContext()返回的对象生命周期=静态单例的生命周期,避免内存泄露。
14.启动一个未注册的activity
链接地址:https://www.jianshu.com/p/4fc77fbac938
15.优化此段代码
优化前:
class MyActivity extends Activity {
TextView mTextView;
private Handler handler =new Handler(){
public void handleMessage(Message msg){
mTextView.setText("hello");
}
};
}
分析:
匿名内部类Handler实例化时,会与其实例化所在线程的Looper、MessageQueue绑定。每次执行sendMessage(Message)时,每个Message实例都持有它。同时,Handler实例持有外部类的实例(非静态内部类和匿名内部类都会持有它们的外部类的引用)。当Activity销毁时,如果MessageQueue仍有未处理的消息,会导致Activity无法回收的内存泄漏。
方案:
Handler定义为静态内部类或者定义为一个独立的类,如果需要持有Activity的引用,可以加SoftReference。
优化后:
class MyActivity extends Activity {
TextView mTextView;
private SoftReferenceHandler mHandler;
private static class SoftReferenceHandler extends Handler{
private WeakReference<MyActivity> mActivity;
public SoftReferenceHandler(MyActivity activity){
mActivity = new SoftReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(mActivity==null||mActivity.get()==null){
return;
}
mActivity.get().mTextView.setText("hello");
}
}
}
16.Activity生命周期监听
链接地址:https://blog.csdn.net/MyLero/article/details/52513184
17.Activity实现View的过程
链接地址:https://www.cnblogs.com/kross/p/4025075.html
18.微博长图的实现
链接地址:https://github.com/davemorrissey/subsampling-scale-image-view
19.Bitmap.recycle()与Bitmap==null的区别
链接地址:https://www.cnblogs.com/zhucai/p/5413340.html
20.视图的延迟加载
链接地址:https://www.cnblogs.com/tianzhijiexian/p/4263231.html
21.java文件所占字节
链接地址:https://blog.csdn.net/jpzhu16/article/details/51381112#性能比较
延伸:
Java中字符编码和字符串所占字节数:
https://blog.csdn.net/xiaoyu714543065/article/details/7380191