版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AndroidJava高频面试题及详细答案(实战通用版)适用场景:Android初级、中级开发面试,社招、校招技术面试,岗位笔试刷题说明:所有题目贴合一线企业真实面试场景,答案基于Android日常开发实战总结,摒弃理论空话,侧重原理理解和落地应用一、Java基础核心面试题1.==和equals()的区别是什么?这是Java基础高频问题,核心区别在比较的内容不同,具体分为两点:第一,==是运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身是否相等;引用类型比较的是对象的内存地址,也就是判断两个引用是否指向同一个对象。第二,equals()是Object类的方法,默认情况下和==效果一致,比较对象内存地址。但像String、Integer这类常用类,都重写了equals()方法,重写后不再比较地址,而是比较对象的内容、数值是否相等。实战总结:日常开发中,判断字符串内容是否一致必须用equals(),判断基本类型数值用==。2.String、StringBuilder、StringBuffer的区别?三者核心差异围绕可变性、线程安全、执行效率展开,适配不同开发场景:1.String:字符串常量,内容不可变。每次对String进行拼接、修改操作,都会生成新的字符串对象,频繁操作会产生大量无用对象,占用内存,效率最低。适合字符串内容极少修改的场景。2.StringBuffer:字符串变量,内容可变。底层方法都加了synchronized锁,线程安全,但加锁会消耗性能,执行效率偏低。适合多线程环境下频繁修改字符串的场景。3.StringBuilder:字符串变量,内容可变。无锁机制,线程不安全,执行效率最高。是日常Android单线程开发中字符串拼接的首选,绝大多数业务场景都用这个类。3.Java中的泛型是什么?有什么作用?泛型是Java提供的一种参数化类型机制,简单说就是把数据类型定义为参数,在使用时再指定具体类型,核心作用有三点:第一,编译期类型检查。集合绑定泛型后,只能存储指定类型的数据,编译阶段就能拦截类型错误,避免运行时类型转换异常。第二,避免强制类型转换。取值时无需手动强转,代码更简洁,减少转换异常风险。第三,代码复用。可以编写通用的工具类、方法,适配多种数据类型,不用为不同类型重复写冗余代码。Android开发中,List、Map、RecyclerView适配器封装等场景都会频繁使用泛型。4.接口和抽象类的区别?1.定义与继承:抽象类用abstract修饰,只能单继承;接口用interface定义,类可以多实现,解决了Java单继承的局限性。2.成员特性:抽象类可以有构造方法、成员变量、普通成员方法、静态方法;接口默认只能有常量(publicstaticfinal)、抽象方法,JDK8后支持默认方法和静态方法,JDK9后支持私有方法。3.设计理念:抽象类侧重模板复用,提取子类通用的属性和行为,是“是什么”的关系;接口侧重行为规范,定义一套统一的行为标准,是“能做什么”的关系。实战场景:通用业务模板、统一父类逻辑用抽象类;定义回调规范、功能拓展标准用接口。5.final、finally、finalize的区别?三者毫无关联,只是命名相似,是完全不同的Java语法机制:1.final:修饰符。修饰变量则变量值不可修改(常量);修饰方法则方法不能重写;修饰类则类不能被继承。2.finally:异常处理关键字。搭配try-catch使用,代码块中的代码无论是否发生异常都会执行,常用于释放资源(关闭流、关闭数据库连接)。3.finalize:Object类的废弃方法。原本用于垃圾回收前释放对象资源,但执行时机不确定、无法保证调用,现在已完全废弃,开发中禁止使用。二、Java集合与IO面试题1.ArrayList和LinkedList的区别?1.底层结构:ArrayList基于动态数组实现;LinkedList基于双向链表实现。2.访问效率:ArrayList支持随机索引访问,查询速度极快;LinkedList只能从头节点遍历查询,访问效率低。3.增删效率:ArrayList增删元素时可能需要数组扩容、元素移位,效率偏低;LinkedList仅需修改节点指针,无需移动元素,增删效率更高。4.内存占用:ArrayList会预留冗余容量,存在内存浪费;LinkedList每个节点都要存储前后节点引用,单个元素内存占用更大。实战选型:Android开发中,查询多、增删少优先用ArrayList(90%场景);频繁中间插入、删除数据时用LinkedList。2.HashMap的底层原理?JDK1.8做了哪些优化?HashMap是基于数组+链表+红黑树实现的键值对存储结构,核心原理:通过key的hashCode计算数组下标,确定存储位置;下标冲突时,在该位置生成链表存储重复哈希值的数据。JDK1.8核心优化点:1.数据结构升级:由原来的「数组+链表」改为「数组+链表+红黑树」,链表长度超过8且数组容量大于64时,链表转为红黑树,大幅提升高冲突场景下的查询效率。2.优化扩容机制:新增高低位扩容,无需重新计算哈希值,减少运算消耗。3.优化插入方式:由头插法改为尾插法,彻底解决JDK1.7多线程扩容导致的链表死循环问题。补充:HashMap线程不安全,Android多线程场景推荐使用ConcurrentHashMap。3.List、Set、Map的区别?1.List:有序可重复集合,元素存入顺序和取出顺序一致,支持索引访问。常用实现类:ArrayList、LinkedList。适合有序数据列表存储,比如列表数据源。2.Set:无序不可重复集合,不允许存储重复元素,无索引。常用实现类:HashSet、TreeSet。适合去重场景,比如筛选唯一数据。3.Map:键值对集合,key唯一不可重复,value可重复,无序存储。常用实现类:HashMap、LinkedHashMap。适合键值对应的数据存储,比如缓存数据、参数映射。三、Java多线程面试题(Android高频)1.线程和进程的区别?1.进程:操作系统资源分配的最小单位,每个进程独立占用内存、CPU资源,进程之间相互隔离,互不干扰。App运行时就是一个独立进程。2.线程:CPU调度的最小单位,依附于进程存在,一个进程包含多个线程,线程之间共享进程的内存资源。Android主线程(UI线程)、子线程都是APP进程下的线程。核心特点:进程开销大、稳定性高;线程开销小、切换效率高,一个线程崩溃不会影响其他进程,但可能影响所属进程。2.为什么Android要求UI操作必须在主线程?核心原因是避免UI控件并发错乱,保证界面绘制安全:1.Android的UI控件不是线程安全的,如果允许多个线程同时操作UI,会出现控件状态错乱、界面闪烁、绘制异常等问题。2.系统统一规定主线程为UI操作唯一线程,串行执行UI绘制、更新、点击事件,规避并发问题。3.子线程更新UI会直接抛出CalledFromWrongThreadException异常,导致App崩溃。实战规范:耗时操作(网络请求、文件解析、数据库查询)放子线程,结果回调后切回主线程更新UI。3.线程同步的方式有哪些?synchronized和Lock的区别?常用线程同步方式:synchronized关键字、Lock锁、volatile、CountDownLatch、Semaphore等。synchronized和Lock核心区别:1.锁机制:synchronized是系统隐式锁,自动加锁、自动释放锁;Lock是代码显式锁,需要手动调用lock()加锁、unlock()释放锁。2.灵活性:Lock支持超时锁、可中断锁、公平锁,能避免线程死等;synchronized不支持超时,线程获取不到锁会一直阻塞。3.性能:低竞争场景下两者性能相近,高竞争场景下Lock性能更优。Android开发中,简单同步场景用synchronized,复杂并发控制用ReentrantLock。四、Java内存与垃圾回收面试题1.Java基本数据类型有哪些?占用字节数?共8种基本数据类型,分为四类,开发中常用取值范围和字节大小:1.整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)2.浮点型:float(4字节)、double(8字节)3.字符型:char(2字节)4.布尔型:boolean(1字节)注意:long赋值需加L后缀,float赋值需加F后缀,避免类型转换错误。2.堆内存和栈内存的区别?Android中的应用场景?1.栈内存:线程私有,空间小、速度快,生命周期随线程。主要存储局部变量、方法参数、对象引用地址,方法执行结束后变量立即释放。2.堆内存:所有线程共享,空间大、速度慢,生命周期随应用。主要存储new出来的对象、数组,是垃圾回收的主要区域。Android实战:频繁创建临时对象会占用堆内存,容易引发内存抖动;静态变量、全局对象长期占用堆内存,容易导致内存泄漏。3.Java垃圾回收(GC)的原理是什么?哪些对象不会被GC回收?GC核心原理:系统自动扫描堆内存中的对象,通过可达性分析算法判断对象是否存活,没有任何引用指向的对象判定为垃圾对象,自动清理释放内存。不会被GC回收的对象:1.被静态变量引用的对象;2.被活跃线程引用的对象;3.全局常量、系统核心对象;4.被软引用、强引用持有的存活对象。Android内存泄漏核心原因:本该销毁的对象,被静态引用、单例、线程、View引用长期持有,导致GC无法回收。五、Android专属Java实战面试题1.Handler的原理?为什么会出现内存泄漏?怎么解决?Handler是Android线程通信核心机制,核心组成:Handler、Message、MessageQueue、Looper。原理:子线程通过Handler发送Message,Message存入MessageQueue;Looper无限循环从队列取出消息,回调Handler的handleMessage方法,主线程执行UI更新逻辑。内存泄漏原因:非静态内部类Handler会隐式持有外部Activity引用。如果Activity销毁时,消息队列还有未处理、未发送的消息,消息会持有Handler引用,进而间接持有Activity引用,导致Activity无法被GC回收。解决方案:1.将Handler定义为静态内部类,避免隐式持有外部引用;2.通过弱引用(WeakReference)持有Activity上下文;3.Activity销毁时,在onDestroy()中调用handler.removeCallbacksAndMessages(null),清空所有消息和任务。2.序列化的作用?Android中Serializable和Parcelable的区别?序列化核心作用:将对象转为可传输、可存储的字节序列,用于Activity间传值、Intent传参、本地缓存、网络传输。两者区别:1.Serializable:Java原生序列化接口,实现简单,只需实现接口无需重写方法。基于IO流实现,开销大、效率低,适合简单对象、少量数据传输。2.Parcelable:Android专属序列化接口,需要手动重写序列化、反序列化方法。基于内存读写实现,速度极快、开销小,是Android组件传值的首选。实战选型:组件间频繁传参、列表数据传值用Parcelable;简单配置数据缓存用Serializable。3.单例模式的常见写法及优缺点?Android中安全的单例写法日常开发最常用两种单例写法,适配不同场景:1.饿汉式:类加载时直接初始化实例。优点:写法简单、线程绝对安全;缺点:无论是否使用都会占用内存,造成内存浪费。适合全局必须使用的工具类。2.双重检查锁懒汉式:延迟初始化,首次使用时创建实例。优点:按需加载、内存节省、线程安全、效率高;缺点:写法稍复杂。是Android开发中最推荐的通用单例写法。补充:禁止使用静态内部类单例存储Context,容易引发内存泄漏,全局单例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建省莆田市第二十五中学2027届数学七上期末联考模拟试题含解析
- 酒店办公室工作计划范例(9篇)
- 2026年校招:锦江集团试题及答案
- 2026年校招:黑龙江龙煤矿业控股集团笔试题及答案
- 2026年秋招:中国建筑集团面试题及答案
- 2026年天津市苏教版八年级物理第3课力的作用效果练习题
- 2026年美甲技师理论知识考核试卷
- 2026年精细化工数字化高级专家招聘笔试试卷 招录11人考试题库
- 2026年叉车驾驶员试题及答案
- 2026年公需课《人工智能赋能制造业高质量发展》试题及答案
- 2027届浙江名校联盟高三一模高考物理模拟试卷(含答案详解)
- 2026年甘肃省酒泉市属事业单位选调工作人员29人(第二批)笔试参考题库及答案解析
- (2026秋版)部编版五年级语文上册全册教案(教学设计)
- 2025年重庆市垫江县小升初数学试卷附答案解析
- 2026年低压电工实操考试题及完整答案(全国通-用)
- 唐僧人物性格与取经信念解读
- 小学道德与法治新部编版六年级上册第二单元第7课 未成年人需特殊保护教案(2026秋)
- 2026年海南(专升本)数学考试题库(含答案)
- 国家职业标准 电气设备安装工(2026年版)
- 2026年创城知识测试题及答案
- 2026年甘肃建筑企业安管人员ABC证理论考试练习题库带答案
评论
0/150
提交评论