我的百度android尬聊经历

在一个烈日炎炎的下午,我借着地铁、公交、单车一路奔到传说中的后厂村路,来到了百度科技园。扫描短信二维码后,我来到了百度某号楼内。走在百度办公区域两旁的步道上,你能感受到互联网大厂的优雅、高档的工作氛围,让人有种进入电视中职场情景的兴奋。闲言少叙、言归正传。
第一个面试我的是一个很有亲和力的与本人年级相仿的小伙子(人与人之间的差距就是这么大,要承认)。他带我来到了面试的会客室(零食间),拿来了两页笔试题给我。我接过笔试题和签字笔,扫了一眼题量和内容,心中还算有点把握(自信脸)。笔试题目请看下一段,可能与实际题目偏差,请多多包涵。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值