关闭

平安科技上海android 面试记录

1173人阅读 评论(0) 收藏 举报

上海平安科技  面试记录  8月29日

面试流程 笔试题加面试  笔试题10道题手写快排(分治和递归   第一次排序后 key 左边的比key小 右边的比key大  然后递归  so easy)和冒泡(理解了这两个算法的实现思想 即使平时没怎么写过 回想下还是能写出来) gc的垃圾回收算法是啥 我就记得个我读j过计数回收  这不太懂()


面试:一开始自我介绍 ,他简单看了下笔试题,看到我单例写的枚举(笔试题有道是写个安全的单例)

1他问这有什么问题  我说没什么问题 enum的单例可以防止暴力反射 (其他的什么先加载  后加载 duobercheck 都不能 )

他说 枚举会降低性能...


2然后问activity 又几种启动模式 

我说这没啥难度(这边说话有问题  记录下 ),四种 singleInstance ,singleTask,singleTop,standard,  

他说:如果只是说这四种模式 确实没啥难度 他说了题 a-b互相启动 不重复启动 让我回去看看如何实现 (TODO 当时就想到使用singleinstance 启动模式让activity独占一个任务栈)  试验了下 可行啊   

<activity android:name=".MainActivity" android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".BActivity"  android:launchMode="singleInstance"></activity>

3java 的容器又哪些  

 答:collection下面list,set  list下arraylist linkedlist  区别 数据和链表的区别 这边又问到list扩容的问题 我没看过源码 我说估计时在add时进行判断是否将要超出预设的容量然后进行扩容(申请更大的内存空间 )   set下hashset  treeset  哈希表和二叉树的区别 

map下hashmap ,linkedhashmap   问hashmap底层实现 我说用到了set (这边我感觉他觉得我回答不好 这边难道说hash表加链表 ) 然后说了下hashcode 和equals方法如何保证键相同值覆盖 

4然后问道webview的内存泄漏问题  

我没遇到过 估计时泄漏了activity  我引出了其他的内存泄漏的例子 比如动画 解决方法onDestory时移除引用

还说到LeackCanary 内存泄漏查找神器 能帮助改善代码 避免内存泄露

然后他问内存泄漏的解决方法 :这我刚刚不是才说过 我说在ondestory移除引用 借助一些工具查找内存泄漏 如leackcanary 这刚刚的又说一遍

又说到webview 调用js 和js调用java  问我代码怎么写 我不喜欢记api  我就说webview通过websetting的一些代码function (这流程看看google官方文档很容易吧)

然后让我说具体点 setjavascriptenbable  和addjavascript 和interface 配合等实现java调用js代码  

js调用java 

webview防止js注入   js注入本质上是什么问题 我说是通过js执行一些linux命令 获取手机上的信息 或删除或修改  http://blog.csdn.net/leehong2005/article/details/11808557  

然后他说什么版本修正js注入 我不记得 他说4.2 (现在也记住了 )

5List优化点  

我本来不想说它 因为我都怎么用它了 recyclerview 更好用 

他既然问起来 就说了下常见得优化 说到static viewHolder  问问什么加static  内部类持有外部类得引用  static在类加载得时候初始化 估计没答到点上   (他提示 静态解耦合 )

---------------------------------------------------------------这边回来查了下 static不持有外部类的引用,达到解耦合的作用其次如果内部类中做一些耗时操作会有内存泄漏的问题

6不知道怎么说到图片压缩上了 

我说通过bitmapfatcory得options 和insamplesize  根据屏幕分辨率和图片分辨率得比值压缩  又问具体代码说详细点 我觉得这已经很详细了 这我说得有问题吗》  

他不是很满意 他问如果要将某个图片得内存压缩到100k  我说了下图片内存占用得计算方式 图片分辨率*字节数 (如arg8888就是*4) 配合一开始得图片压缩

我没做过具体压缩到某个大小  //TODO  我试验下  

然后说到png代码压缩  我说可以用代码实现  不过这png压缩不是美工给图时或者后台运维上传后台时就压缩过吗?  这估计聊不到一块去

我主动说你用过webp吗 》  我说了下webp得优点 比之png jpg 图片大小缩小进40-50% 更节省流量和物理内存 

然后他问你用过icon front (他的读音为哎克放 我听成actfun  )

我说用过啊 A站啊  你也喜欢二次元啊  哈哈 面试完了回想起来好搞笑

我说你拼一下  我说没用过 是做什么得好处是啥   他没说   回来查了下 矢量图标 http://www.iconfont.cn/ 矢量图特点随意拉伸不变形 一套图标适配 

7scrollview嵌套listview切套冲突解决   一般难度的题目   

答:切套有那么三种情况 父布局和子布局同方向滑动冲突上上 左左 ,父布局和子布局不同方向滑动冲突 上下左右,  上面两种的嵌套,

 解决方法有两种 外部拦截和内部拦截 ,一般我不会用ScrollView嵌套ListView  他这么问考察点肯定是冲突的解决 他又问具体代码怎么写  表达能力有点差 

下次问这些直接说talk is cheaper,给我台电脑我直接给你代码实现  

下面给出外部拦截的实现方法 解决ScrollView的滑动冲突

<com.example.msi_yanb.myapplication.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.msi_yanb.myapplication.MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent">
    <ListView
        android:layout_width="match_parent"
        android:id="@+id/lv_content"
        android:layout_height="400dp"
        android:text="Hello World!" />

    <ImageView
        android:layout_width="match_parent"
        android:src="@mipmap/ic_launcher"
        android:layout_height="wrap_content" />
...
</com.example.msi_yanb.myapplication.MyScrollView>
-------------------------------自定义view解决冲突的外部拦截法模板 -------------------
public class MyScrollView extends ScrollView {
    private ListView lv;

    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        return super.dispatchTouchEvent(ev);
    }
    void setListViewScroll(ListView lv){

        this.lv=lv;
    }
    @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(y>lv.getHeight()) {//父容器需要当前事件{
                        intercept=true;
                    }else {
                        intercept=false;
                    }
                    break;
            case MotionEvent.ACTION_UP:
                intercept=false;
                break;
            default:break;
            }
        return  intercept;
        }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(ev);
    }
--------------------测试-----------------------------
public class MainActivity extends AppCompatActivity {
    ListView lv_content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] items=new String[20];
        for(int i=0;i<20;i++){
            items[i]="items"+i;
        }
        lv_content= (ListView) findViewById(R.id.lv_content);
        MyScrollView myScrollView= (MyScrollView) findViewById(R.id.activity_main);
        myScrollView.setListViewScroll(lv_content);
        lv_content.setAdapter(new ArrayAdapter<String>(this,android.R.layout.activity_list_item,android.R.id.text1,items));
    }
}

8详细介绍下mvp 
 答:model层和view层分离,通过presenter层进行通信 层与层之间通过interface进行解耦合。  
presenter持有model层和view层的引用, model 层和view层持有presenter层的引用。各个层之间高内聚低耦合 (这个词好哈哈)
好处 :分层 符合单一职责 利于复用 利于修改 利于测试  这边不懂的可以看下google的mvp sample

然后又问mvp配合哪些框架使用 (其实很多框架都能配合使用 我简单举了个EventBus)

然后说EventBus和广播的比较   (如有不对欢迎指正) 

广播是四大组件之一,更加耗手机性能吧   

EventBus使用简单,可以传递任意对象,这边问到可不可以传int值 我说可以 


----------------------------------------一手写一道算法题-------------------------------------------------------------------------

描述 一个size为50的数组;随机分配1-50的给它 要求时间复杂度为O(n)

	<span style="white-space:pre">	</span>int size=50;
		int[] arr=new int[size];

		Set<Integer> sets=new HashSet<Integer>();//存储随机1-50 赋值给arr
		List<Integer> lists_random=new ArrayList<Integer>();//1-50
		
		for(int i=0;i<size;i++){
			lists_random.add(i+1);
		}
		for(int i=size;i>=0;i--){
			int index=0;
			if(lists_random.size()!=0)
				index=new Random().nextInt(lists_random.size());//优化点 
			else{
				break;
			}
			int item=lists_random.get(index);
			//System.out.println("index"+index);
			
			if(!sets.contains(item)){
				sets.add(item);
				lists_random.remove(index);
			}
		
		}//运行了n次 

		System.out.println(sets);
		
		int j=0;
		for(int item:sets){
			arr[j++]=item;
		}//运行了n次   总时间复杂度3n  O(n)
		System.out.println(Arrays.toString(arr));

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:74334次
    • 积分:1523
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:58篇
    • 译文:2篇
    • 评论:4条
    最新评论