Android面试总结(不定时更新版)

前言
因为个人原因想换个公司,所以最近一直忙着交接工作和准备面试,可能准备得比较充分面了几家都过了,然后进了第一家,一直想写个文章记录下面试的事情,所以每次面试完我就在笔记本上记录了面试的问题,然后断断续续写了这篇文章,文章存了很久一直没发表,一个是前面刚入职看"前任"的代码没时间,另一个觉得内容不够丰满所以一直没发表,文章的问题是我个人的面试经历,问题的答案有些并不是当时面试的回答,是我参考了相关资料重新组织语言来说明的,希望找工作的筒子能从中得到帮助,PS:因为可能涉及公司隐私所以我把公司名字给忽略了。


XXX网络科技有限公司
一些废话:笔试大概二十来分钟,面试大概一个半小时,一面是另一个项目组的Android技术大牛来面的,全程我感觉他都对我不露任何表情(可能大神的高傲…),但是入职以后发现这大牛其实人还不错的,二面是所在项目组的组长,好像是产品出身,所以二面没聊技术,就聊些有的没得,把该跟HR聊得在这面里聊了,入职以后发现其实公司氛围很好,上班不用打卡,免费零食水果(就是这么容易被满足…),五险一金按全额工资比例买,而且最主要的是人事妹子很漂亮有没有!!别的项目组的测试妹子很漂亮有没有!!我上个部门驻点开发,整个部门23个人,全他么是男的有没有!!那种感觉很影响工作心情有没有!!咳咳,好了回归主题…

笔试(摘选)
其实我对这些笔试是很鄙夷的,网上找些笔试题然后让我们做,但是我还是偷偷拍下了笔试题,毕竟没准下一家公司跟这家找的是同一套题呢(坏笑脸)…
Q、下列代码的执行结果是什么

System.out.print(100 % 3);
System.out.print(",");
System.out.println(100 % 3.0);

A::1,1.0,这送分题,java自动类型转换,不会的查资料去…

Q、在继承中,关于构造方法的说明,下列说法错误的是
A、子类无条件的继承父类的无参构造方法,
B、子类可以引用父类中的有参构造方法,使用super关键字,
C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法,
D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。
**A:**这题选D,错得很明显

Q、下列代码的执行结果是什么

int x=3;  
int y=1;  
if(x==y)   
	System.out.println("Not equal"); 
else   
	System.out.println("Equal"); 

**A:**输出为:Equal,吐槽:想出这道题的人我也是服了…

Q、下列代码的执行结果是什么

public class MyClass{
 static int i;
 public static void main(String argv[]){
 System.out.println(i);
 }
}
A) Error Variable i may not have been initialized 
B) null 
C) 0  
D) 1

A: C整型全局变量初始化值为0

Q、常用的设计模式
A: 单例 工厂 建造 代理 观察者 适配器模式等等…

Q、android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库进行管理的方法可以是?

  • getWriteableDatabase()
  • getReadableDatabase()
  • getDatabase()
  • getAbleDatabase()

A: getReadableDatabase()和 getWriteableDatabase()都可以得到一个可既可以读又可以写的数据库对象,不同的是,当磁盘空间满了之后, getReadableDatabase()得到的是一个只读的对象,而 getWriteableDatabase()则会抛出异常。

Q、 Intent传递数据时,下列的数据类型哪些可以被传递
A、Serializable B、charsequence C、Parcelable D、Bundle
A: ABCD

Q、 android 中下列属于Intent的作用的是
A、实现应用程序间的数据共享
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
D、处理一个应用程序整体性的工作
A: A

我本来想一道道写出来,但是发现好多都是很基础的,一个个列出来好费时间…所以我就列出来问题大概意思好了,不知道的自己去查资料…android五大布局、四大组件、activity四种启动模式、service的启动方法、android数据存储方式、性能优化、开发技巧、代码优化,数组排序,连续有序的数组有且只有两个数相同,写方法找出来,还有些智力题就不列出来了…以上就是整个笔试题了,笔试时间要求四十分钟内,其实我做下去也就二十来分钟就做完了…

面试(摘选)
自我介绍: 这个环节基本都是每个面试的开场白,回答的时候应该有下面几个重点

  1. 个人基本信息(姓名、年龄、老家、居住地等);
  2. 来自哪里(工作地点),是干什么的(Android开发工程师),担任过什么职务、做过什么样的项目;
  3. 自己为何来公司面试;
  4. 最后祝愿(希望能得到贵公司的认可等等)。

PS:真诚自然,不能给人套路的感觉(微笑脸)。

Q、上家公司的情况
这个问题就如实说就好了,比如我当时说的是我上家公司是XXX公司,在XXX,是做XXX的,主要的项目是XXX之类的,其实问这种问题最好回答了,在这种问题上尽量扯久点,这样问别的技术问题的时间可能就少了,成功的概率就又大了点(~ _~)

Q、项目经验
这个就说自己做过的项目,要点也就这几个,这个项目是什么类型的,自己负责的模块,如果可以,把项目用到的技术跟项目碰到的问题和解决方案都说出来,注意一点,千万不要把作为一颗螺丝钉的功能放大到主结构的功能,当然要是在这个项目上真的是自己独立设计框架之类的这些就没什么了。

Q、用SQL语句获取当前时间
mysql 、 access: select now();
sqlserver : select getdate();
oracle : select to_char(sysdate('yyyy-mm-dd hh24:mi:ss));
讲真关于数据库这块我是弱项,我真的怕他接着问数据库的优化或者再往下深入的问,然后我当时说完就扯别的了,扯到别的什么地方我也不记得了…
Q、Activity的生命周期跟四种启动模式
这个问题我以前在博客中分析过,其实就是回答生命周期,然后在什么场景会触发这些生命周期方法,如果想加分的话可以再说下异常情景下怎么保存数据,然后四种启动模式要说明应用场景(PS:最后附上一句,启动模式的设置要符合应用场景,不能为了设置启动模式而设置启动模式,多说了这句话逼格会高很多- -!),另外附上链接:
Activity生命周期
Activity四种启动模式

Q、在Java中对象的引用有几个级别
在Java中对象的引用有四个级别,强引用 、软引用、弱引用、虚引用。

强引用:最普遍的引用,不申明对象引用时默认就是这个引用。在Java中即使内存不足,垃圾回收器(GC)也只是抛出OutOfMemoryError异常而不会回收使用这个引用的对象。

软引用(SoftReference):只要内存足够,垃圾回收器(GC)就不会回收这个对象,如果内存不足,垃圾回收器(GC)就会回收使用了这个引用对象的内存,
使用方法:

  Object obj = new Object();
  SoftReference softReference =new SoftReference(obj);

这样obj这个对象的引用就是软引用了。

弱引用(WeakReference):跟软引用类似,但是不同点在于只要垃圾回收器(GC)扫描了这个引用所在区域的内存时,无论内存足够与否都会去回收这个对象的内存。使用方法:

 Object obj = new Object();
 WeakReference weakReference =new WeakReference(obj);

虚引用(PhantomReference):
这个引用随时都会被垃圾回收器(GC)回收使用方法同上,就是换个类。
其实说到上面那样的层面已经差不多了,想活学活用可以说在ListView优化的时候使用弱引用(WeakRefrence)引用ImageView对象,但是说这个的前提是你得熟悉ListView优化,不然有些老程序员可能会接着这个点问下去的。既然说道ListView优化这里多提一下ListView优化,可以由以下几种方式优化
①. 复用ConvertView
②.

<think>嗯,用户想了解Android多线程相关的面试知识点,特别是常见问题与解答。我需要先整理一下Android多线程的核心内容,比如线程的创建方式、Handler机制、AsyncTask、线程池、线程同步这些应该是重点。 首先,用户提到的引用[2]里提到了继承Thread类和实现Runnable接口,这两种创建线程的方式。需要详细说明两者的区别,比如Runnable更适合资源共享,避免单继承的限制。然后,用户可能还会问到这两种方式的优缺点,以及在实际开发中的选择依据。 接下来是Handler机制,这是Android中处理线程间通信的重要部分。引用[1]提到了Message、MessageQueue、Looper和Handler,需要解释它们之间的关系。比如,每个线程只能有一个Looper,负责从MessageQueue中取出消息,然后由Handler处理。这里可能会涉及到主线程和子线程的切换,以及如何避免内存泄漏,比如持有Activity的引用导致无法释放。 然后是AsyncTask,虽然现在可能已经被官方推荐的其他方式取代,但面试中还是可能会问到。需要说明它的三个泛型参数和几个回调方法,比如doInBackground和onPostExecute,还有它的内部线程池机制。同要提到AsyncTask的缺点,比如在Activity销毁可能引起的问题,以及在Android 3.0后的串行执行问题。 线程池也是必问的点,Java提供的ThreadPoolExecutor以及Android中的便捷类,比如Executors.newFixedThreadPool等。需要解释核心参数,核心线程数、最大线程数、存活间和工作队列。同,线程池的好处,比如减少资源消耗,提高响应速度,管理线程的生命周期。 线程同步方面,synchronized关键字和ReentrantLock的区别,volatile的作用,以及ConcurrentHashMap这样的线程安全集合。引用[3]提到了fail-fast机制,可能和线程安全的集合相关,需要说明如何避免ConcurrentModificationException,比如使用CopyOnWriteArrayList或者在迭代加锁。 还有可能会问到主线程和子线程的交互,比如不能在主线程执行耗操作,否则会引发ANR,以及如何通过Handler或runOnUiThread来更新UI。此外,IntentService和WorkManager这样的高级主题也可能被提及,需要简要说明它们的作用和使用场景。 用户提供的引用[4]提到了Adapter的getView方法中利用缓存,这可能和列表的异步加载有关,比如在子线程加载图片然后通过Handler更新UI,但这里可能更多涉及ListView或RecyclerView的优化,不过用户的问题集中在多线程,所以可能需要关联到线程池管理异步任务。 还要注意用户的需求是面试常见问题,所以回答需要结构清晰,分点列出问题并提供简明解答。可能还要考虑最新的Android开发趋势,比如协程(Kotlin)和LiveData的结合使用,但用户的问题可能更偏向传统Java多线程,所以需要平衡。 最后,确保回答中的代码示例正确,比如Handler的使用,或者synchronized块的例子。同,引用用户提供的引用,比如引用[1]到[4],但用户给出的引用中有部分内容可能不直接相关,比如AIDL和fail-fast,但需要合理融入,比如在讲线程安全提到fail-fast机制。 总结一下,回答的结构应该是先介绍多线程的基本概念和创建方式,然后深入Handler机制,接着是AsyncTask、线程池、线程同步,最后是其他高级主题和常见面试问题。确保每个部分都有对应的常见问题,并引用相关的资料来支持答案的准确性。</think># Android多线程面试知识点解析 ## 一、线程基础与创建方式 1. **线程创建方法** - **继承Thread类**:需重写`run()`方法,通过`start()`启动线程 - **实现Runnable接口**:更灵活,避免单继承限制,推荐使用[^2] ```java class MyRunnable implements Runnable { public void run() { // 耗操作 } } new Thread(new MyRunnable()).start(); ``` - **实现Callable接口**:可返回结果和抛出异常 2. **线程状态转换** - NEW -> RUNNABLE -> RUNNING -> BLOCKED/WAITING -> TERMINATED ## 二、核心通信机制:Handler 1. **四要素关系** - **Message**:数据载体 - **MessageQueue**:消息队列(单向链表) - **Looper**:轮询器(每个线程唯一,通过`Looper.prepare()`创建) - **Handler**:消息处理器[^1] 2. **主线程消息循环** ```java // 子线程发送消息 new Thread(() -> { Message msg = handler.obtainMessage(); msg.sendToTarget(); }).start(); // 主线程处理 Handler handler = new Handler(Looper.getMainLooper()) { public void handleMessage(Message msg) { // 更新UI } }; ``` ## 三、异步任务框架 1. **AsyncTask**(已过但需了解) ```java class MyTask extends AsyncTask<Params, Progress, Result> { protected Result doInBackground(Params... params) { /* 后台操作 */ } protected void onPostExecute(Result result) { /* UI更新 */ } } ``` - 缺点:内存泄漏风险、版本兼容性问题(3.0后默认串行) 2. **替代方案** - **协程**(Kotlin) - **RxJava** - **ExecutorService** ## 四、线程池优化(重点) 1. **ThreadPoolExecutor参数** ```java ExecutorService pool = new ThreadPoolExecutor( corePoolSize, // 核心线程数 maximumPoolSize, // 最大线程数 keepAliveTime, // 空闲存活间 TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>() // 任务队列 ); ``` 2. **四种常用线程池** - `newFixedThreadPool`:固定大小 - `newCachedThreadPool`:弹性扩容 - `newScheduledThreadPool`:定任务 - `newSingleThreadExecutor`:单线程顺序执行 ## 五、线程同步与安全 1. **同步机制** - **synchronized**:方法级/代码块锁 - **ReentrantLock**:可中断锁、公平锁 - **volatile**:保证可见性,非原子性 2. **线程安全集合** - `ConcurrentHashMap`:分段锁技术 - `CopyOnWriteArrayList`:写复制 - 注意**fail-fast机制**:遍历修改会抛出`ConcurrentModificationException`[^3] ## 六、高级应用场景 1. **IntentService** - 自动管理线程的Service - 内部通过HandlerThread实现 2. **HandlerThread** - 自带Looper的线程类 ```java HandlerThread handlerThread = new HandlerThread("MyHandlerThread"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()); ``` 3. **WorkManager** - 后台任务调度框架(周期性任务/约束条件)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值