美图面试经验整理

楼主2016年应届毕业生,坐标北京,正在找工作,投递了美图社招的android开发职位,最后被血虐回来了,在这里将题目整理出来,把知识点过一遍,顺便提醒自己一句话:

不要过分高估自己,但是也不要过分看轻自己,一直努力,值得拥有才会有所改变!


笔试:
1.

写一个单例模式:

我们学习到的单例模式一般有两种实现方法,一种是懒汉单例,一种是饿汉单例,考的虽然简单,但是由于是社招的难度,所以楼主写了一个双重锁的,为了防止线程并发出现单例问题,后来跟面试官聊得时候也一并讲了《effective java》中推荐的枚举类型的。

2.写出ListView中的getView代码,要求优化滑动速度:

这里主要是考察对于listview掌握的熟练程度,listview中我们一般使用一个viewholder来进行View的复用,防止android去过度创建视图带来的资源的浪费。
其二,我们可以在Listview在滑动的时候去主观停止加载一些耗时的诸如Bitmap的数据,在滑动停止后再进行加载。

3.找出字符串中的第一个只出现一次的字符

这里实现有很多种方法,当然暴力循环是可以解决问题,但是复杂度为O(n2),所以这里不建议使用,面试官也不会满意这种处理方法。

我这是使用了简单的哈希表的模拟,使用空间去换时间效率的做法,具体思路是将字符串中出现的字符的ACII码当做数组的角标,当然这里要申请一个int[256]的一个数组,因为字符总共有256个,然后再次扫描一遍,计算出每个字符出现的次数,最后还需要再次扫描一遍原来的字符串,找到数组中第一个a[i]=1的即是答案。


面试部分

1.getview里面的viewholder为什么要设置成静态的?

申明为static类,是因为一个在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。对于viewholder而言,我们只需要一个viewholder进行复用即可,所以使用static变量

2. scrollerview和listview的区别在哪里,两个控件分别在什么情况下使用

说实在的,这个问题问的我也不太清楚,依照我的思路而言,就是看我们需要展示数据的效果如何,如果数据呈现的是有规律的,是一个list,在布局上要求具有相似性,则使用listview,而scrollView一般用了呈现一些无规律的数据。

3.自己自定义过animation么,讲讲过程

关于自定义animation的使用,主要需要实现的两个方法是initalize方法和applyTransformation方法,一个是进行初始化相关操作的方法,另一个是进行相应的矩阵变换,最后来达到自定义动画的使用,这里需要对数学中的变换矩阵有一定的认识才行。

4. 触摸事件的你是怎么理解的?view的绘制过程是如何进行的?

触摸事件的伪代码处理如下图所示:

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean intercept=false;
        int x= (int) ev.getX();
        int y= (int) ev.getY();
        switch (ev.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                intercept=false;
                break;
            case MotionEvent.ACTION_MOVE:
                if (父容器需要当前点击事件)
                {
                    intercept=true;
                }else 
                {
                    intercept=false;
                }
                break;
            case MotionEvent.ACTION_UP:

                intercept=false;
                break; 
        }
        return intercept;
    }

主要是三个方法(dispatchTouchEvent,onInterceptToucheEvent,touchEvent)的应用,这里就不详细讲解了,不懂的自行百度即可。

View绘制过程主要由三个方法构成:



 onMeasure->onLayout->onDraw

其中实现的过程是由ViewRootImpl进行实现的,源码中通过这个方法进行setView操作,进而调用permTraversals方法进行view group的 onMeasure->onLayout->onDraw绘制,大概介绍一下,详细的百度吧。

5.fragment跟viewpager一起使用时候,fragment的加载机制是怎么样的?

这里主要考察的知识点是viewpager和fragment使用时候的预加载机制,viewpager在显示第一个的时候会预加载第二个,以此类推,如果想要取消这中加载方式我们可以查看源码中有个方法:

/**
     * Set a hint to the system about whether this fragment's UI is currently visible
     * to the user. This hint defaults to true and is persistent across fragment instance
     * state save and restore.
     *
     * <p>An app may set this to false to indicate that the fragment's UI is
     * scrolled out of visibility or is otherwise not directly visible to the user.
     * This may be used by the system to prioritize operations such as fragment lifecycle updates
     * or loader ordering behavior.</p>
     *
     * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
     *                        false if it is not.
     */
    public void setUserVisibleHint(boolean isVisibleToUser) {
        if (!mUserVisibleHint && isVisibleToUser && mState < STARTED) {
            mFragmentManager.performPendingDeferredStart(this);
        }
        mUserVisibleHint = isVisibleToUser;
        mDeferStart = !isVisibleToUser;
    }

将他设置为false即可。

6.说一说线程池吧

主要的线程池有:CacheThreadPool,ScheduledThreadPool,SingeThreadPool,FixThreadPool,这里就不详细介绍了。

7.了解过surfaceview么?

surface有自己独立的线程,我们如果需要进行更加复杂的view的制作,可以使用此方法,我也还没研究过,有空恶补一下,感兴趣的自己百度把。

8.drawable下的xml有那些节点,你自定义过哪些,如何使用的

主要shape(自定义drawable),selector(针对不同点击状态),layer-list(这个相当于ps中的图层的概念)。

9.新出的support.design里面有研究过么,知道recycleview和appbarlayout这些控件相关实现么

目前处于会用的状态,简单写了一个小的项目,使用md设计+RxJava+Retrofit+Picasso
项目地址:https://github.com/JerryChan123/MyDrribleApp

实现还没有研究过


大概的面试就是这些题目了,社招真心难,也让自己看清自己还有很长一段路要走,要坚持学习~

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25991953/article/details/50752506
个人分类: 面试
上一篇java设计模式--观察者模式
下一篇线程池的学习与深入研究
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭