最近一直在杭州面试,想要写一写面试中遇到的技术问题并总结一下。主要分为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.代理模式
android中使用的设计模式
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();
5.android中touch事件的传播
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
Android性能优化典范
12.图片的处理
13.Fragment与Activity通信,Fragment之间是怎么通信的
Fragment与Activity之间通过EventBus或者接口的方式通信
Fragment之间通过绑定的Activity中转做通信
14.Fragment的生命周期和Activity生命周期比较
15.android蓝牙开发流程
16.android应用启动流程
17.android中的缓存策略
分为内存缓存(一级缓存)和磁盘缓存(文件缓存),需要特定数据时,先去找内存中是否存在,如果没有再去磁盘中找,如果都没有,则再去进行网络请求。
18.android组件化开发
19.两种注册广播的方法的区别
清单文件中注册广播是常驻型广播,不跟随程序的生命周期,在代码中注册的广播正相反
网友评论