下面跟大家分享的这些面试题都是互联网大厂真实流出的面试内容,每个问题都附带完整详细的答案,不像网上的那些资料三教九流有的甚至还没答案,这些面试题我也是经过日积月累才整理出来的精品资料。
这些面试题主要是针对1-5年左右的Android开发程序员提升的,不管是传统行业还是互联网行业,掌握这些技术基本都能拿到一个不错的薪资,希望对大家有所帮助。
面试题展示如下:
Java
1.GC是什么? 为什么要有GC?
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
2.XML包括哪些解释技术,区别是什么?
答:DOM和SAX
DOM将文档解析成一颗文档树,可在节点上进行遍历、增加、修改和删除。一次性读入内存,对内存消耗大。
SAX至上而下解析文档,以事件进行驱动。不会一次性读入内存,对内存消耗小,不能任意读取节点,并且不能对节点进行增加、修改和删除。
3.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
答:switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。
4."=="和equals方法究竟有什么区别?
答:==和equals都可以比较地址。==是运算符,equals是方法,方法可以通过重写改变其行为,如String的equals就是比较字符串内容。
5.构造方法能否被重写和重载?
答:构造方法不能被重写但是能被重载。
6.面向对象的特征有哪些?
答:封装、继承、多态和抽象。
7.抽象类和接口的区别?
答:1).抽象类是abstract class修饰,接口是interface修饰。
2).抽象类可以有任意类型的属性,接口只能有静态常量修饰的属性。
3).抽象类可以有普通方法和抽象法方法,接口的方法都是抽象方法。
4).抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。
5).抽象类只能单根继承,接口可以多重实现。
8.内部类可以引用它的包含类的成员吗?有没有什么限制?
答:可以引用。如果需要指定当前类时要用外部类.this来引用。如果引用局部变量,需要将局部变量指定为final。
9.String s = new String("xyz");创建了几个String Object? 二者之间有什么区别?
答:2个对象。"xyz"创建在字符串常量池中,new String()创建在堆中。
10.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:会在return前执行。
11.Integer与int的区别
答:Integer为包装类,int是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。包装类可以通过intValue来转换成基本数据类型,也可以通过new Integer()将基本数据类型转换为包装类。在JDK1.5后,包装类和基本数据类型可以实现自动转换。
12.sleep()和wait()有什么区别?
答:sleep是Thread类的方法,wait是Object类的方法。
sleep是自动唤醒,wait需要其他线程来唤醒。
sleep不会释放同步锁,wait会释放同步锁。
sleep可以用在任意方法中,wait只能用在同步方法或同步块中。
13.Sleep()
答:不会释放对象锁 到时自动恢复 wait()会释放对象锁 进入等待此对象的等待锁定池 发出notify()方法后 才进入等待锁定池准备对象锁的获取进入运行状态
14.同步和异步有何异同,在什么情况下分别使用他们?
答:同步指同一时间只能一个线程执行该方法,其他线程需要等待。异步指多个线程可以同时执行某个方法,并共享同一资源。
同步可以让访问的资源具有安全性,因为同一时间只能一个线程对其进行访问。但是效率不高。
异步对访问的资源会造成不稳定性,比如多个线程同时访问一个资源,一个在修改、一个在删除、一个在读取,这样可能会造成资源的混乱。但是由于同时运行,执行效率得到提高。
15.启动一个线程是用run()还是start()?
答:start()方法启动线程,run方法是线程执行的主方法。
16.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
答:java中有三种流,分别是字节流(InputStream、OutputStream)、字符流(Reader、Writer)、对象流(ObjectInputStream、ObjectOutputStream)。
17.字节流与字符流的区别?
答:字节流用于读取或写出二进制数据,比如图片、影像等数据。
字符流用于读取或写出字符数据,比如传输字符串。
所有的数据都可以通过字节流来进行处理,不过如果是字符数据,用字节流还需要进行转换后传输,如果使用字符流可以方便数据的转换。
18.error和exception有什么区别?
答:error是系统错误,代码不能处理的错误,比如内存溢出、堆栈溢出等。
exception是程序异常,可以通过代码try-catch进行处理,比如空指针异常,数组越界等。
19.谈谈final,finally,finalize的区别?
答:final是修饰符,可以修饰类(不能被继承)、属性(常量)、和方法(不能被重写)。
finally是异常处理块中的代码块,表示无论如何都会执行的代码块。
finalize是Object类的方法,该方法在对象被垃圾回收之前执行的方法。
20.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
答:如果其他方法没有加synchronized的话是可以进入的。
21.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:java中只有值传递,如果传递的对象,实际也是传递该对象的地址。
22.作用域public,private,protected,以及不写时的区别
答:public公共修饰符,表示任意类都可以访问。
protected为受保护的修饰符,表示同类、同包以及不同包但是父子关系的是可以访问。
不写表示默认修饰符,或者称为package修饰符,该修饰符表示只有同类或同包下的类可以访问,出了这个包就不能访问了。
private为私有修饰符,表示只有同类中可以访问,出了这个类就不能访问了。
23.用最有效率的方法算出2乘以8等於几 2《 3
答:将2的二进制向左移3位。java中用<<来移位。
24.heap和stack有什么区别。
答:heap表示堆,stack表示栈。堆中放对象,栈中放引用变量。
堆空间是一个无序的空间,栈是先进后出的结构。
25.运行时异常与一般异常有何异
答:运行时异常是指继承于RuntimeException的异常,这些异常在编译时可以不进行处理,当运行时如果出现问题才会抛出。如NullPointException、ArrayIndexOutOfBoundsException
一般异常也称为编译时异常,这些异常是继承Exception但又不属于RuntimeException的子类,如果程序中出现这些异常,在编译时必须进行捕获或抛出,否则编译无法通过。如IOException、FileNotFoundException
26.垃圾回收的优点和原理。并考虑2种回收机制
答:Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
27.描述一下JVM加载class文件的原理机制?
答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
28.是否可以从一个static方法内部发出对非static方法的调用?
答:不能,除非先创建非static方法所在类的对象。
Android
1. 请描述一下Activity 生命周期。
答: 共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。
onCreate(): 创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问。onStart(): Activity变为在屏幕上对用户可见时调用
onResume(): Activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用。
onPause(): Activity被暂停或收回cpu和其他资源时调用,该方法用户保护活动状态的,也是保护现场。
onStop(): Activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart(): Activity被重新启动时调用。该活动仍然在栈中,而不是启动新的Activity。
1、完整生命周期: 即从一个Activity从出现到消失,对应的周期方法是从onCreate()到onDestroy()。
2、可见生命周期: 当Activity处于可以用户看见的状态,但不一定能与用户交互时,将多次执行从onStart()到onStop()。
3、前景生命周期: 当Activity处于Activity栈最顶端,能够与其他用户进行交互时,将多次执行从onResume()到onPause()。
2. 两个Activity之间跳转时必然会执行的是哪几个方法。
答: 两个Activity之间跳转必然会执行的是下面几个方法。
onCreate()//在Activity生命周期开始时调用。
onRestoreInstanceState()//用来恢复UI状态。
onRestart()//当Activity重新启动时调用。
onStart()//当Activity对用户即将可见时调用。
onResume()//当Activity与用户交互时,绘制界面。
onSaveInstanceState()//即将移出栈顶保留UI状态时调用。
onPause()//暂停当前活动Activity,提交持久数据的改变,停止动画或其他占用GPU资源的东西,由于下一个Activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。
onStop()//Activity不再可见时调用。
onDestroy()//Activity销毁栈时被调用的最后一个方法。
3. 横竖屏切换时候Activity的生命周期。
答:
1、不设置Activity的android: configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2、设置Activity的android: configChanges=“orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
3、设置Activity的android: configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfiguration方法
4. 如何将一个Activity设置成窗口的样式。
答:
第一种方法,在styles.xml文件中,可以新建如下的类似Dialog的style。
<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog"> </style>。
第二种方法,在AndroidManifest.xml中在需要显示为窗口的Activity中添加如下属性: android: theme=“@style/Theme.FloatActivity”即可。也可以直接添加对应需要展示为Dialog style的Activity的android: theme属性为android: theme=“@ android: style/Theme.Dialog”。
5. 两个Activity之间怎么传递数据?
答: 可以在Intent对象中利用Extra来传递存储数据。
在Intent的对象请求中,使用putExtra(“键值对的名字”,”键值对的值”);在另外一个Activity中将Intent中的请求数据取出来:
Intent intent = getIntent();
String value = intent.getStringExtra(“testIntent”);
6. 怎么让在启动一个Activity是就启动一个service?
答: 首先定义好一个service,然后在Activity的onCreate里面进行连接并bindservice或者直接startService。
7. Activity怎么和service绑定,怎么在activity中启动自己对应的service?
答:
①activity能进行绑定得益于Serviece的接口。为了支持Service的绑定,实现onBind方法。
②Service和Activity的连接可以用ServiceConnection来实现。需要实现一个新的ServiceConnection,重现onServiceConnected和OnServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。
③执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显示或隐式)和一个你实现了的ServiceConnection的实例
8.什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?
答: Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个Activity或者Context对象来调用。Service有两个启动方法,分别是Context.startService()和Context.bindService()。如果在Service执行耗时的操作需要启动一个新线程来执行。
Android Service只继承了onCreate(), onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用onCreate(), onStart()这两个方法,当停止Service时,则执行onDestroy()方法时。如果Service已经启动了,当我们再次启动Service时,不会再执行onCreate()方法,而是直接执行onStart()方法。
9. 什么时候使用Service?
答: 比如播放多媒体的时候,用户启动了其他Activity,这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你的地理信息位置的改变等等。
10. 请描述一下Intent 和 Intent Filter。
答: Intent在Android中被翻译为”意图”,他是三种应用程序基本组件-Activity,Service和broadcast receiver之间相互激活的手段。在调用Intent名称时使用ComponentName也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名。而Intent Filter是指意图过滤,不出现在代码中,而是出现在android Manifest文件中,以的形式。(有一个例外是broadcast receiver的intent
filter是使用Context.registerReceiver()来动态设定的,其中intent filter也是在代码中创建的)
一个intent有action,data,category等字段。一个隐式intent为了能够被某个intent filter接收,必须通过3个测试,一个intent为了被某个组件接收,则必须通过它所有的intent filter中的一个。
11. Intent传递数据时,可以传递哪些类型数据?
答: intent间传送数据一般有两种常用的方法: 1、extra 2、data。
extra可以用Intent.putExtra放入数据。新启动的Activity可用Intent.getExtras取出Bundle,然后用Bundles.getLong,getInt,getBoolean,getString等函数来取放进去的值。
Data则是传输url。url可以是指我们熟悉的http,ftp等网络地址,也可以指content来指向ContentProvider提供的资源。Intent.setData可以放入数据,Intent.getData可以取出数据。
12. 说说Activity,Intent,Service是什么关系 ?
答: 一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承而来的。Activity类会显示由视图控件组成的用户接口,并对视图控件的事件做出响应。
Intent的调用是用来进行屏幕之间的切换。Intent描述应用想要做什么。Intent数据结构中两个最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。
Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程里,也可以运行在其他应用程序进程的上下文里。需要一个Activity或者其他Context对象来调用。
Activity跳转Activity,Activity启动Service,Service打开Activity都需要Intent表明意图,以及传递参数,Intent是这些组件间信号传递的承载着。
13. 请描述一下BroadcastReceiver。
答: Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电短信等。程序也可以播放一个广播。程序可以有任意数量的broadcast receivers来响应它觉得重要的通知。Broadcast receiver可以通过多种方式通知用户: 启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我们的某个应用或系统本身在某些事件(电池电量不足、来电短信)来临时会广播一个Intent出去,我们利用注册一个broadcast
receiver来监听这些Intent并获取Intent中的数据。
14. 在manifest和代码中如何注册和使用 broadcast receiver 。
答: 在android的manifest中注册
<receiver android: name =“Receiver1">
<intent-filter>
<actionandroid: name=“com.forrest.action.mybroadcast”/>
</intent-filter>
</receiver>
在代码中注册
1、 IntentFilter filter = new IntentFilter(“com.forrest.action.mybroadcast”);//和广播中Intent的action对应;
2、 MyBroadcastReceiver br= new MyBroadcastReceiver();
3、 registerReceiver(br, filter);
15. 请介绍下ContentProvider是如何实现数据共享的。
答: 一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content provider是以类似数据库中的表的方式将自己的数据暴露。Content provider存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
要想使应用程序的数据公开化,可通过2种方法:创建一个数据自己的Content Provider或者将你的数据添加到一个已经存在的Content Provider中,前提是有相同数据类型并且有写入Content Provider的权限,Android提供了Content Resolverr,外界的程序可以通过Content Resolver接口访问Content Provider提供的数据。
16. 请介绍下Android的数据存储方式。
答: Android提供了5中存储数据的方式,分别是以下几种、
①用Shared Preferences存储数据,用来存储key-value,pairs格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型。
②使用文件存储数据,通过FileInputStream和FileOutputStream对文件进行操作。在Android中,文件是一个应用程序私有的,一个应用程序无法读写其他应用程序的文件.
③使用SQLite数据库存储数据,Android提供的一个标准数据库,支持SQL语句。
④使用Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数据共享。它是一个特殊的存储数据的类型,它提供了一套标准的接口用来获取数据,操作数据。系统也提供了音频、视频、图像和个人信息等几个常用的Content Provider。如果你想公开自己的私有数据,可以创建自己的Content Provider类,或者当你对这些数据拥有控制写入的权限时,将这些数据添加到Content Provider中实现共享。外部访问通过Content Resolver去访问并操作这些被暴露的数据.
⑤使用网络存储数据
17. 请介绍下Android中常用的五种布局。
答: 最常用的布局方式为Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他们可以通过在xml配置文件或者代码中进行布局。
1、Frame Layout是最简单的布局方式,放置的控件都只能罗列到左上角,控件会有重叠,不能进行复杂的布局。
2、Linear Layout可以通过orientation属性设置线性排列的方向是垂直还是纵向的,每行或每列只有一个元素,可以进行复杂的布局。
3、Absolute Layout可以让子元素指定准确的x、y坐标值,并显示在屏幕上。Absolute Layout没有页边框,允许元素之间相互重叠。它是绝对坐标,所以在实际中不提倡使用。
4、Relative Layout允许子元素制定他们相对于其他元素或父元素的位置(通过ID制定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其他元素将以屏幕中央的相对位置来排列。这个是相对于Absolute Layout的,采用相对坐标,所以在实际中比较常用。
5、Table Layout将以子元素的位置分配到行或列。一个Table Layout由许多的Table Row组成,每个Table Row都会定义一个row。Table Layout容器不会显示row、column或者cell的边线框。每个row拥有0个或多个的cell; 和html中的table差不多。在实际中也经常使用。
18. 谈谈UI中, Padding和Margin有什么区别?
答: Padding是控件的内容相对控件的边缘的边距,而Margin是控件边缘相对于其他控件的边距。如下图所示:
19. android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。
答:apk包大小限制不好说,有的apk为100M,还是能装到手机上。一般的apk大小为5~10M左右。读取大文件的时间应该是在main线程里面,时间限制为5秒左右。
20. ListView如何提高其效率?
答:1、使用分页加载,不要一次性加载所有数据。
2、复用convertView。在getItemView中,判断converView是否为空,如果不为空,可复用。
3、异步加载图片。Item中如果包含有webimage,那么最好异步加载。
4、快速滑动时,不显示图片。当快速滑动列表(SCROLL_STATE_FLING),item中的图片或获取需要消耗资源的view,可以不显示出来;而处于其他两种状态(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),则将那些view显示出来
21. Android程序与Java程序的区别?
区别Java程序Android程序
执行入口点MainAndroid Mainfest.xml配置文件中的intent-filter
UIFrame·Activity
是否基于配置文件否是
是否基于组件否是Activity,Service,Broadcast Receiver,Content Provider
22. 谈谈对Android NDK的理解。
答: android NDK是一套工具,允许Android应用开发者嵌入从C、C++源代码编译来的本地机器代码到各自的应用软件包中。
1、 NDK是一系列工具的集合。
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者帮助时巨大的。
NDK集成了交叉编辑器,并提供了相应的mk文件隔离CPU、平台、API等差异,开发人员只需要简单修改mk文件(指出“那些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动将so和Java应用一起打包,极大的减轻了开发人员的打包工作。
2、NDK提供了一份稳定、功能有限的API头文件声明。这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、log库(liblog)。
23. 谈谈Android的优点和不足之处。
答: 优点如下所示:
1、android是开源、市场占有率大。
2、android能够有丰富的硬件选择。
3、android是一款基于Linux平台的开源操作系统,从而避免了专利壁垒,是一款完全免费的只能手机平台。
4、由于android是google开发的,因此能够无缝结合Google应用。
缺点如下所示:
1、安全与隐私。手机与互联网紧密联系,个人隐私很难得到保守。
24. Android系统中GC什么情况下会出现内存泄露呢?
答: 导致内存泄露主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为“有效的活动”,同时不会被释放。要确定对象所占内存将被回收,我们就要确认该对象不会再被使用。典型的做法是把对象数据成员设为null或者从集合中移除该对象。当出现以下情况时,会造成内存泄露:
1、 数据库的cursor没有关闭。
2、 构造adapter时,没有使用缓存contentview。
3、 Bitmap对象不使用时,采用recycle()释放内存。
4、 Activity中的对象的生命周期大于activity。
调试方法: DDMS==>HEAPSIZE==>dataobject==>[TotalSize]
就举例这么多了,面试题也不是几个就能全部覆盖的,毕竟面试官不是吃素的,他会换着花样问你;有想跳槽拿高薪的 Android 开发的朋友,我这里分享一份 Android 精选面试 PDF 文档;点击此处查看直达方式 或者简信发送【面试】 直达获取;想拿高薪的人很多,就看你肯不肯努力了
内容展示如下:
由于篇幅有限,内容就不完全展示了;如果大家想要获取的话,可以简信发送【面试】即可 免费获取哦~
喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗~
网友评论