android面试 杭州_杭州Android面试小结

最近一直在杭州面试,想要写一写面试中遇到的技术问题并总结一下。主要分为java基础部分和android基础部分。

java基础:

1.对抽象,封装,继承,多态的理解

抽象:就是把业务逻辑用程序代码表示出来。分为数据抽象和过程抽象,数据抽象是对象的属性,行为抽象是对象的行为特征

封装:封装是设置访问权限,只把内部的数据或方法暴露给可信的类或对象,对不可信的进行隐藏

继承:把一些有共性的类称为父类,不同子类可以通过继承付类重用这一些共性

多态:允许不同类的对象对同一消息做出响应。方法的重载体现了多态,向上转型也体现了多态。例如:

Animal d = new Dog();

Animal c = new Cat();

在编译时,并不知道引用的具体对象是那个类,只有当程序运行时才能知道。

2.java中的单例模式怎么写

饿汉模式

public class Singleton {

//饿汉模式,没有达到懒加载的效果,在类加载时就会实例化,但是是线程安全的

private static Singleton singleton = new Singleton();

private Singleton(){}

public static Singleton getInstance(){

return singleton;

}

}

3.String和StringBuffer、StringBuilder的区别

String是不可变的,StringBuffer和StringBuider都是可变的;StringBuffer是线程不安全的,但是效率会高一些;StringBuilder是线程安全的,但是效率低一些。

4.对java的泛型的理解

泛型,即“参数化类型”。

创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。

5.java中的垃圾回收机制是怎么样的

5.1.确定删除的对象

java中的GC采用对象引用遍历的方式判断该对象是否被回收,如果该对象是不可达的,则视为垃圾回收

5.2.GC扫描堆栈,删除垃圾

删除对象的过程中,会停止所有其他线程

6.如何实现对象排序

实现comparable接口,然后通过Collections.sort()或者Arrays.sort()进行排序

7.java中的反射

Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)获得任何一个类的字节码。包括接口、变量、方法等信息。还可以让我们在运行期实例化对象,通过调用get/set方法获取变量的值。

反射机制详解

8.java中的设计模式

1.单例模式

2.适配器模式

3.观察者模式

4.builder模式

个人理解它的优点是能把一个复杂对象的每一步的构造过程解耦

5.代理模式

9.synchronized关键字的应用

10.HashMap工作原理

Android基础:

1.Activity生命周期是怎么样的

ActivityA跳转到ActivityB:

a.onPause()-->b.onCreate()-->b.onStart()-->b.onResume()-->a.onStop()

ActivityB再回退到ActivityA:

b.onPause()-->a.onRestart()-->a.onStart()-->a.onResume()-->b.onStop()-->b.onDestory()

若在Activity界面按home键又返回:

onPause()-->onStop()-->onRestart()-->onStart()-->onResume()

2.Service的生命周期有哪些

通过start方式启动:

onCreate()-->onStartCommand()-->onDestory()

通过bind方式启动:

onCreate()-->onBind()-->onUnbind()-->onDestory()

3.对MVP、MVC、MVVM的了解

4.android中handler的使用

//handler绑定looper,并暴露接口,用于实现

mHandler = new Handler(Looper.myLooper()){

@Override

public void handleMessage(Message msg){

Log.d(TAG, "获得了message");

super.handleMessage(msg);

}

};

//创建MessageQueue

looper.prepare();

//发送Message到MessageQueue

Message message = new Message();

message.sendToTarget();

//轮询MessageQueue

looper.loop();

6.有没有用过EventBus

7.谈谈android中的性能优化

7.1.对布局的优化

1.使用include标签,能达到对布局的重用

2.使用merge标签,他可以删除多余层级

3.使用ViewStub,ViewStub加载布局时,占用资源很少。ViewStub的应用

关于include,merge和ViewStub

7.2.使用clipRect用于防止overDraw

7.3.ListView滑动卡顿:

可能是因为滑动过程中正在下载图片,也可能是item布局太复杂

8.有哪些常用的开源框架,说说他们的优点

网络请求 okhttp:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题

图片加载 glide:glide会根据imageview的大小来确定要加载的图片的大小,磁盘缓存时,也只缓存控件大小的bitmap

View注入 Butter Knife

数据存储 DBFlow ORM

热修复 tinker 热修复的原理是用classloader来加载class文件

事件总线框架 EventBus EventBus使用详解

9.JNI的使用

10.Android中常用的IPC的方式,以及各自的优缺点

1.使用Bundle 数据类型支持有限,序列化耗时

2.使用文件共享 无法即时通信,不好处理高并发

3.使用Messenger 通过Message进行传输,所以也只能支持bundle数据;适用于轻量级和地并发 Messenger详解

4.AIDL AIDL详解

5.ContentProvider 用于数据共享

6.Socket 用于网络交换

11.Android中的内存泄漏,内存溢出,以及内存抖动

内存泄漏是某些对象不能被回收

内存溢出是由于内存不足

内存抖动是由于频繁GC

13.Fragment与Activity通信,Fragment之间是怎么通信的

Fragment与Activity之间通过EventBus或者接口的方式通信

Fragment之间通过绑定的Activity中转做通信

14.Fragment的生命周期和Activity生命周期比较

15.android蓝牙开发流程

17.android中的缓存策略

分为内存缓存(一级缓存)和磁盘缓存(文件缓存),需要特定数据时,先去找内存中是否存在,如果没有再去磁盘中找,如果都没有,则再去进行网络请求。

19.两种注册广播的方法的区别

清单文件中注册广播是常驻型广播,不跟随程序的生命周期,在代码中注册的广播正相反

20.如何实现自定义标签列表

21.Activity四种启动模式

22.lrucache在android中的使用及原理

23.android图片处理

24.android surfaceView

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值