【Android面试】Java专题 todo

文章目录

  • [一、Java 基础](#一、Java 基础)
    • [1. == 与 equals () 区别?String 类重写 equals 做了哪些逻辑?](#1. == 与 equals () 区别?String 类重写 equals 做了哪些逻辑?)
    • [2. 为什么重写equals方法需要重写hashcode](#2. 为什么重写equals方法需要重写hashcode)
    • [3. final、finally、finalize 三者区别;final 修饰基本类型、引用类型、方法、类的限制](#3. final、finally、finalize 三者区别;final 修饰基本类型、引用类型、方法、类的限制)
    • [4. 接口和抽象类区别,Android 开发中各自适用场景](#4. 接口和抽象类区别,Android 开发中各自适用场景)
    • [5. 深拷贝与浅拷贝区别,Android 中如何实现对象深拷贝](#5. 深拷贝与浅拷贝区别,Android 中如何实现对象深拷贝)
    • [6. String、StringBuilder、StringBuffer 区别,线程安全与性能差异](#6. String、StringBuilder、StringBuffer 区别,线程安全与性能差异)
    • [7. 泛型原理、协变与逆变? extends / ? super 适用场景](#7. 泛型原理、协变与逆变? extends / ? super 适用场景)
    • [8. 自动装箱拆箱原理,Integer 缓存机制及坑点](#8. 自动装箱拆箱原理,Integer 缓存机制及坑点)
    • [9. 反射原理,Android 中反射的使用场景、性能问题与优化方案](#9. 反射原理,Android 中反射的使用场景、性能问题与优化方案)
    • [10. 注解分类(元注解 / 运行时 / 编译时),Android 常用注解与 APT 原理](#10. 注解分类(元注解 / 运行时 / 编译时),Android 常用注解与 APT 原理)
    • [11. Error 和 Exception 区别,受检异常 & 非受检异常,安卓开发异常处理规范](#11. Error 和 Exception 区别,受检异常 & 非受检异常,安卓开发异常处理规范)
    • [12. Serializable 与 Parcelable 区别、性能对比,Android 跨进程传输选型](#12. Serializable 与 Parcelable 区别、性能对比,Android 跨进程传输选型)
    • [13. 静态变量、成员变量、局部变量生命周期与初始化顺序](#13. 静态变量、成员变量、局部变量生命周期与初始化顺序)
    • [14. Java 四大引用(强 / 软 / 弱 / 虚),各自特点、GC 回收策略、Android 实际应用](#14. Java 四大引用(强 / 软 / 弱 / 虚),各自特点、GC 回收策略、Android 实际应用)
  • [二. Java集合](#二. Java集合)

历史资料:

一、Java 基础

1. == 与 equals () 区别?String 类重写 equals 做了哪些逻辑?

  • == 为比较运算符,基本类型比较数值,引用类型比较内存地址
  • equals 是 Object 原生方法,默认逻辑等同于 ==,需要子类重写才能实现内容比较。
  • String 重写 equals:先判断引用地址是否相同,再判断类型是否一致,最后逐字符对比内容,实现字符串内容相等判定。(比较两个对象的内容,需要重写equals)

2. 为什么重写equals方法需要重写hashcode

因为两个相等的对象的 hashCode 值必须是相等。

也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。如果重写 equals() 时没有重写 hashCode() 方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等。

关于hashcode:

  • 如果两个对象的hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。
  • 如果两个对象的hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
  • 如果两个对象的hashCode 值不相等,我们就可以直接认为这两个对象不相等。

3. final、finally、finalize 三者区别;final 修饰基本类型、引用类型、方法、类的限制

  • final 是修饰符:修饰基本类型数值不可修改;修饰引用类型引用地址不可变,但对象内部属性可修改;修饰方法禁止重写;修饰类禁止继承。
  • finally 是异常处理代码块,配合 try-catch 使用,用于资源释放,除系统退出外都会执行。
  • finalize 是 Object 废弃方法,JDK9 已移除,GC 回收时机不可控,Android 开发中完全不推荐使用。

4. 接口和抽象类区别,Android 开发中各自适用场景

  • 抽象类:拥有构造方法、成员变量,支持普通方法与抽象方法,仅支持单继承,可维护成员状态
  • 接口:无构造方法,仅定义行为,支持多实现、多继承,默认变量为常量,适合解耦与规范定义。
  • Android 场景:抽象类用于 BaseActivity、BaseViewModel抽取通用基础逻辑;接口用于点击回调、网络监听、跨模块通信、行为约束

5. 深拷贝与浅拷贝区别,Android 中如何实现对象深拷贝

  • 1、浅拷贝:只复制顶层对象引用,内层子对象共享内存,修改子对象数据会相互影响。
  • 2、深拷贝:递归复制所有层级对象,新旧对象内存完全隔离,数据互不干扰。
  • 3、Android 实现方式:手动逐层赋值、重写 clone 方法、Serializable 序列化、Parcelable
    序列化、Gson/JSON 序列化。

6. String、StringBuilder、StringBuffer 区别,线程安全与性能差异

  • 1、String 不可变,底层为 final 字符数组,字符串拼接会频繁创建新对象,性能差。
  • 2、StringBuffer 方法加 synchronized 锁,线程安全,多线程场景使用,性能偏低。
  • 3、StringBuilder 无锁、线程不安全,单线程高性能,是 Android 日常字符串拼接首选。

7. 泛型原理、协变与逆变? extends / ? super 适用场景

  • 1、泛型核心为类型擦除,编译期做类型校验,运行期擦除为 Object,不存在实际泛型类型
  • 2、? extends T 协变:只读不写,代表 T 及子类集合,适合数据读取场景
  • 3、? super T 逆变:只写少读,代表 T 及父类集合,适合数据存入场景
    对比kotlin泛型

8. 自动装箱拆箱原理,Integer 缓存机制及坑点

  • 1、装箱:基本类型自动转为包装类,调用 Integer.valueOf () 等方法;拆箱:包装类自动转为基本类型,调用 intValue ()。
  • 2、Integer 存在缓存,默认缓存 -128~127 区间数字,该区间对象复用,地址相同。
  • 3、超出缓存范围会新建对象,使用 == 判断包装类会出现逻辑错误,业务中推荐使用 equals。

9. 反射原理,Android 中反射的使用场景、性能问题与优化方案

  • 反射在运行期获 取类、方法、字段信息,突破访问权限限制,动态调用代码。
  • Android 场景:框架源码、兼容适配、动态插件化、注解框架、系统 API 隐藏方法调用。

10. 注解分类(元注解 / 运行时 / 编译时),Android 常用注解与 APT 原理

  • 1、元注解:用于修饰其他注解,包含 Retention、Target、Documented、Inherited 等。
  • 2、编译时注解:编译期生效,通过 APT 扫描解析,生成辅助代码,无运行时损耗。如@Override
  • 3、运行时注解:运行期通过反射解析,Android 路由、依赖注入框架大量使用 APT 编译时注解提升性能。@BindView

11. Error 和 Exception 区别,受检异常 & 非受检异常,安卓开发异常处理规范

  • 1、Error 为系统级严重错误,如 OOM、栈溢出,无法手动捕获处理
  • 2、Exception 为可处理异常,分为受检异常(编译期强制捕获)和运行时异常(RuntimeException)
  • 3、Android 开发尽量捕获运行时异常,避免崩溃,禁止空指针裸奔,核心链路做好异常兜底

12. Serializable 与 Parcelable 区别、性能对比,Android 跨进程传输选型

  • 1、Serializable 基于 JVM 反射实现,使用简单,序列化效率低,内存开销大。
  • 2、Parcelable 安卓专属,手动编写序列化逻辑,内存拷贝高效,跨进程通信首选。
  • 3、选型原则:本地简单缓存用 Serializable;Activity 传值、Binder 跨进程通信必须用 Parcelable。

13. 静态变量、成员变量、局部变量生命周期与初始化顺序

  • 1、静态变量:类加载时初始化,生命周期跟随整个应用,全局唯一。
  • 2、成员变量:对象创建时初始化,生命周期与对象一致,存在堆内存。
  • 3、局部变量:方法调用时创建,方法结束立即销毁,无默认初始值,需手动赋值。

14. Java 四大引用(强 / 软 / 弱 / 虚),各自特点、GC 回收策略、Android 实际应用

  • 1、强引用:默认引用,GC 永远不会回收,Android 静态持有 Activity 会引发内存泄漏。
  • 2、软引用:内存不足时才会被回收,适合实现图片缓存、临时缓存数据。
  • 3、弱引用:下次 GC 直接回收,常用于 Handler 持有 Activity、防止内存泄漏。
  • 4、虚引用:无法单独使用,仅用于监控对象回收,一般用于内存监控与资源释放。

二. Java集合

相关推荐
代码改善世界2 小时前
【MATLAB初阶】矩阵操作(二):矩阵的运算
android·matlab·矩阵
九皇叔叔2 小时前
MySQL实操指南:复制表及数据复制全解析
android·数据库·mysql
一只大袋鼠2 小时前
MyBatis 特性(三):缓存、延迟加载、注解开发
java·数据库·笔记·sql·缓存·mybatis
梦想不只是梦与想2 小时前
flutter 与 Android iOS 通信?以及实现原理(一)
android·flutter·ios·methodchannel·eventchannel·basicmessage
老毛肚2 小时前
Redis高级
java·数据库·redis
张元清2 小时前
head.tsx 就是一个 React 组件:用 loader 数据动态生成 SEO meta
前端·javascript·面试
小Y._3 小时前
AQS同步器核心原理深度剖析
java·源码分析·juc·aqs
南棱笑笑生3 小时前
20260420给万象奥科的开发板HD-RK3576-PI适配瑞芯微原厂的Buildroot时使用ll命令
java·大数据·elasticsearch·rockchip
StockTV3 小时前
韩国市场API技术对接指南,涵盖实时行情、历史数据、指数信息、公司详情等功能
java·开发语言·python·php