本人写这篇文章是今年找工作碰到的一些问题,以及一些心得,其中肯定有一些不对的地方,希望大家多多包涵,第一次在csdn上写文章,是个新手,后续我会对这篇文章一直做补充跟修缮的,也欢迎大家来一起交流。
其实Android就是Java,现在大多数工作不久的同学可能面临,Android现在开源框架很多,从网上找出一些框架就能搭建项目,但是有很多注重技术的公司会问很多跟java有关的东西,所以补充一些J2SE的基础是很有必要的
J2SE篇幅
1.Java里头的多态是什么意思?
其实回答这个问题很简单,大家可以直接列举出形成多态具备的条件就可以了
首先必须要有继承或者实现
其次是要有方法的重写
最后一个是父类引用指向子类对象
大多数情况下回答这三个就ok了,再具体点直接给面试官举个例子:
动物类 Animal 狗Dog extends Animal 猫Cat extends Animal --->>继承
Animal有个方法 吃得方法eat() 狗不满意这个父类的吃法,自己重写了eat() 猫也不满意这个父类的吃饭,自己也重写了eat() --->>重写
最后 Animal animal = new Dog(); --->>父类引用指向子类对象
animal.eat();调用这个方法实际执行的是狗的吃的方法,这就是多态,实际运行时动态绑定。
2.GC的原理
当堆内存里的对象没有引用指向了,GC就来了。一句话言简意赅
3.抽象类跟接口的区别
抽象类可以有非抽象的方法,接口只有方法的定义没有实现,实现接口必须重写接口所有定义的方法,接口里头变量是static final的常量
4.StringBuffer跟StringBuider的区别
StringBuider非线程安全,执行速度快,单线程用这个类
5.sleep(), wait()的区别
sleep不释放同步锁,自动唤醒,需要try catch, wait释放同步锁,需要notify来唤醒
sleep是线程的方法 wait是Object的方法
6.递归执行路径有几条。
主要是考察你对java线程的执行路径,其实递归并不是开启线程,虽然是重复调用方法本身,其实执行路径就一条。
7.LinkedList跟ArrayList的区别
一个链表结构,一个数组结构,LinkedList查找慢,插入快,ArrayList查找快,插入慢。
Android篇幅
1.手写一个线程安全的单例
public class SigleInstance {
private static SigleInstance instance;
public static SigleInstance getInstance() {
if (instance == null) {
syncronized(SigleInstance.class) {
if (instance == null) {
instance = new SingleInstance();
}
}
}
return instance;
}
}
这个算是目前来说最有的单例,最好是能手写出来,面试官主要是考你为什么同步关键字要写在方法里头,写在那块,其实你只要答到点上就ok了,主要原因就是不用频繁加锁,因为频繁加锁会消耗性能,当instance new出来之后,可以不用在方法外加锁就直接返回实例,减少了一次加锁的操作。
2.Bitmap图像模式有哪几种,给出一张1080 * 1920的,ARGB 8888格式的占用内存是多大
ARGB 8888一个像素占用4个字节,一个字节8位,1080 * 1920 * 4 * 8
3.静态方法跟静态代码块有什么区别。
静态方法属于类,用类名.就能直接调用,静态代码块是类加载的时候就会调用的
4.Android进程有哪几种
前台进程,可见进程,服务进程,后台进程,空进程
5.Runnable , Callable, Feature三个的区别
Runnable 没有返回值,Callable有返回值,Feature一般配合Callable来使用,用于检测任务的状态,具有有是否执行完成,还可以做取消任务操作,再可以稍微撤下AsyncTask源码,因为有返回值,其实底层也是用Callable跟Feature来实现的, 显得你会懂一些源码,会是加分项
6.一个应用允许多个进程吗?
允许,最直接的直接说在功能清单文件里配置Service为一个独立进程,android:process就能配置
7.多进程会引起一些什么样的异常呢?
(1)静态成员和单例模式完全shixiao
(2)线程同步机制完全失效
(3)SharedPreferences的可靠性下降
(4)Application会多次创建
8.HashMap的底层数据结构
数组加链表
9.Serializable和Parcelable的区别
Serializable是java中序列化接口,使用开销很大,序列化和反序列化过程需要大量的I/0操作,Parcelable是Android中序列化的方式,用起来虽然麻烦一些,效率很高,Parcelable主要用在内存序列化上,如果说要序列化到存储设备中,建议大家使用Serializable,具体通过Object流来做序列化操作。