必背面试题.docx
- 文档编号:9981112
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:20
- 大小:31.83KB
必背面试题.docx
《必背面试题.docx》由会员分享,可在线阅读,更多相关《必背面试题.docx(20页珍藏版)》请在冰豆网上搜索。
必背面试题
1抽象类和接口的区别?
抽象类:
1)抽象方法,只有行为的概念,没有具体的行为实现。
使用abstract关键字修饰,没有方法体。
子类必须重写这些抽象方法。
2)包含抽象方法的类,一定是抽象类。
3)抽象类只能被继承,一个类只能继承一个抽象类。
接口:
1)全部的方法都是抽象方法,属型都是常量
2)不能实例化,可以定义变量。
3)接口变量可以引用具体实现类的实例
4)接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法
5)接口之间可以多实现
6)一个具体类可以实现多个接口,实现多继承现象
2列举你所知道的线程同步的方法:
1)wait():
让线程等待。
将线程存储到一个线程池中。
2)notify():
唤醒被等待的线程。
通常都唤醒线程池中的第一个。
让被唤醒的线程处于临时阻塞状态。
3)notifyAll():
唤醒所有的等待线程。
将线程池中的所有线程都唤醒。
3简述String和StringBuffer、ArrayList和LinkedList、HashMap和HashTable的特点及区别。
答:
String对象的长度一旦定义就固定就不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类不能被继承。
StringBuffer是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。
它只能通过构造函数来建立对象。
另外StringBuffer还是一个线程安全的类。
ArrayList是实现了基于动态数组的数据结构用于,LinkedList基于连表的数据结构,二者都可以存储对象的引用。
对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
就HashMap与HashTable主要从三方面来说。
一.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:
只有HashMap可以让你将空值作为一个表的条目的key或value
4什么是java序列化,如何事件java序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
publicclassCatimplementsSerializable{}
……
Try{
FileOutputStreamfos=newFileOutputStream("catDemo.out");
ObjectOutputStreamoos=newObjectOutputStream(fos);
System.out.println("1>"+cat.getName());
cat.setName("MyCat");
oos.writeObject(cat);
oos.close();
}catch(Exceptione){
……
}
……
5多线程有几种实现方式,同步有几种实现方式,stop()和suspend()方法为什么不推荐使用
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify"
反对使用stop(),是因为它不安全。
它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。
结果很难检查出真正的问题所在。
suspend()方法容易发生死锁。
调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。
此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。
对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。
所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,
6简述你对java反射机制的理解
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
7写下你对多线程的理解,怎么创建一个线程以及线程同步的方法。
1.多线程是操作系统的重要部分,可以提高应用程序的效率,将耗时操作放进工作线程,可以有效提高用户体验。
2.newThread().start,在方法中重写run方法;新建类实现Runable接口,重写其抽象方法
3.publicstaticsynchronizedvoidtest(){}
publicvoidtest2(){synchronized(lock){}}
8从操作系统角度请阐述一下线程与进程的区别
答:
进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。
不同进程的线程间要利用消息通信的办法实现同步。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
线程与进程的区别:
(1)调度:
线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:
不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资源:
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:
在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。
但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。
9Android系统的架构,采用了分层的架构,从高层到底层分别是:
1.Android系统架构之应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。
所有的应用程序都是使用JAVA语言编写的。
2.Android系统架构之应用程序框架
开发人员可以完全访问核心应用程序所使用的API框架(android.jar)。
该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。
3.Android系统架构之系统运行库
1)程序库
Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。
它们通过Android应用程序框架为开发者提供服务。
4.Android系统架构之Linux内核
Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。
Linux内核也同时作为硬件和软件栈之间的抽象层。
10消息推送的方式有哪几种,每种方式的优缺点是什么?
前Android上主要的推送实现方案有以下几种:
方案1、使用极光和友盟推送。
方案2、使用XMPP协议(Openfire+Spark+Smack)
简介:
基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:
协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
缺点:
协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
方案3、使用MQTT协议(更多信息见:
http:
//mqtt.org/)
简介:
轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:
协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:
http:
//mqtt.org/software),且已有C++版的服务端组件rsmb。
缺点:
不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。
方案4、使用HTTP轮循方式
简介:
定时向HTTP服务端接口(WebServiceAPI)获取最新消息。
优点:
实现简单、可控性强,部署硬件成本低。
缺点:
实时性差。
11android的数据存储的方式?
答:
Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。
只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
12横竖屏切换时候activity的生命周期?
不设置Activity的android:
configChanges时,切屏会重新调用各个生命周期,设置Activity的android:
configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
13Android中动画分为哪几类?
他们的特点和区分有那些?
一种是tweenedanimation(补间动画)
一种是framebyframe(逐帧动画)
特点:
补间动画是通过改变view的大小、旋转的角度、透明度、位置来产生动画,可以控制动画的播放快慢以及加速度。
逐帧动画是用一组图片轮流绘制,产生动画的感觉。
类似于gif图片。
区别:
补间动画的所有操作是通过矩阵变换对同一个物体(绘制的一个view或者图片)进行操作产生动画。
而逐帧动画是多个物体(多张图片)进行绘制,可以说这多张图片是不相关的(从播放的角度来看只能说是内容相关)。
14请解释下在单线程模式中Message,Handler,MessageQueue,Looper之间的关系解释下.
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
MessageQueue(消息队列):
用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列.
Handler:
可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息.
Looper:
是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。
Looper也把消息队列里的消息广播给所有的Handler:
Handler接受到消息后调用handleMessage进行处理.
15说说mvc模式的原理,它在android中的运用
答:
android的官方建议应用程序的开发采用mvc模式。
何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:
是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:
是应用程序中负责生成用户界面的部分。
也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:
是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
在android中mvc的具体体现如下:
1)视图层(view):
一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):
android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):
对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
16请描述下Activity的生命周期.
onCreate(BundlesavedInstanceState):
创建activity时调用。
设置在该方法
中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():
activity变为在屏幕上对用户可见时调用。
onResume():
activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():
activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():
activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():
重新启动activity时调用。
该活动仍在栈中,而不是启动新的活动。
OnDestroy():
activity被完全从系统内存中移除时调用该方法
17Android中4大组件有哪些?
他们的作用是什么?
Activity:
Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。
service:
后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事务,定义好需要接受的Intent提供同步和异步的接口。
ContentProvider:
是Android提供的第三方应用数据的访问方案,可以派生ContentProvider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。
BroadCastReceiver:
接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。
18Activity有哪4种启动模式?
有哪些特点?
standard默认模式---------来了intent,每次都创建新的实例。
singleTop--------来了intent,每次都创建新的实例,仅一个例外:
当栈顶的activity恰恰就是该activity的实例(即需要创建的实例)时,不再创建新实例。
这解决了栈顶复用问题,想一想,你按两次back键,退出的都是同一个activity,这感觉肯定不爽。
singleTask----------来了intent后,检查栈中是否存在该activity的实例,如果存在就把intent发送给它,否则就创建一个新的该activity的实例,栈中只能有它一个该activity实例,但允许其他activity加入该栈。
解决了在一个task中共享一个activity。
singleInstance-----------肯定位于一个task的栈底,并且是该栈唯一的activity。
解决了多个task共享一个activity。
19注册广播有几种方式,这些方式有何特点?
1)动态代码注册不是常驻型广播,也就是说广播跟随程序的生命周期。
2)清单文件注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
20谈谈对android内存优化的方法,方案,规则及对内存泄漏如何避免
OOM即OutOfMemory,一般是由程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使内存被耗尽的现象。
根本的解决办法是对代码进行优化:
在内存引用上做些处理,使用软引用、虚引用、和弱引用;在内存中加载图片时直接在内存中做处理,如边界压缩等;建立动态回收内存机制;优化Dalvik虚拟机的堆内存分配;自定义堆内存大小等。
一般而言,android中常见的原因主要有以下几个:
1.数据库的cursor没有关闭。
2.构造adapter没有使用缓存contentview。
3.调用registerReceiver()后未调用unregisterReceiver().
4.未关闭InputStream/OutputStream。
5.Bitmap使用后未调用recycle()。
6.Context泄漏。
7.static关键字等。
21启动service有几种方式,说出他们之间的主要区别
答:
调用startService():
通过此种方法启动的service会一直运行在后台直到stopService()或stopSelf()方法被调用。
调用bindService():
通过此种方法启动的service会与调用者绑定,如果这个service还没有被启动,那么service启动时将不会调用onStart(),只调用onCreate()和onBind(),调用者被销毁时,service也被销毁
22intent.putExtra时,如果传递的不是基本类型,而是一个”Object”,那么对这个对象有什么要求?
还是说任何对象都可以进行传递?
答:
必须实现Serializable接口,或者实现Parcelable接口的对象才可以进行传递。
23当调用startActivityForResult时,如何获取并处理返回的结构
答:
通过onActivityResult(intrequestCode,intresultCode,Intentdata)处理返回的数据
requestCode:
调用startActivityForResult(Intentintent,intrequestCode)时传递过去的请求码。
resultCode:
被调用的Activity执行setResult(intresultCode,Intentintent)时传递的结果码,一般有RESULT_CANCELED,RESULT_OK等,用于区分被调用的Activity传回的不同结果
data:
被调用的Activity传回来的数据,可以用data.getExtras()得到数据,用Bundle类型的变量来接收,调用get…(Stringkey)来获取对应的值
24使用startService()和bindService()启一个Service,这个Sercice的生命周期会有哪里不同?
答:
1.Context.startService()方式的生命周期:
启动时,startService–>onCreate()–>onStart()停止时,stopService–>onDestroy()如果调用者直接退出而没有停止Service,则Service会一直在后台运行Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法附代码
2.Context.bindService()方式启动:
①Context.bindService()方式的生命周期:
绑定时,bindService->onCreate()–>onBind()调用者退出了,即解绑定时,Srevice就会unbindService–>onUnbind()–>onDestory()Context.bindService()方式启动Service的方法:
绑定Service需要三个参数:
bindService(intent,conn,Service.BIND_AUTO_CREATE);第一个:
Intent对象第二个:
ServiceConnection对象,创建该对象要实现它的onServiceConnected()和onServiceDisconnected()来判断连接成功或者是断开连接第三个:
如何创建Service,一般指定绑定的时候自动创建。
25Android中什么是ANR,如何应对或者如何避免它?
答:
ANR就是applicationnotresponding
在android中Activity的最长执行时间是5秒.
Bro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 背面 试题