已解析题目
客户端开发工程师相关题目
HashMap 为什么会引入红黑树?
HashMap 引入红黑树,是为了解决哈希冲突严重时链表过长导致查询退化的问题。当同一个桶中的节点数量过多,链表查找会从平均常数级退化为线性级,红黑树可以把桶内查找复杂度降低到对数级,提升极端场景下的稳定性。
Android Activity 生命周期是什么?
Android Activity 生命周期描述一个界面组件从创建、可见、可交互、暂停、停止到销毁的状态变化。核心回调包括 onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart,实际开发还要理解配置变更、进程回收、状态保存和资源释放。
C++ 基类析构函数为什么通常要声明为虚函数?
C++ 基类析构函数通常要声明为虚函数,是为了保证通过基类指针或引用删除派生类对象时,能先调用派生类析构函数,再调用基类析构函数,完整释放派生类资源。否则行为可能未定义,容易造成资源泄漏或清理不完整。
C++ 如何限制类对象只能在堆上或栈上创建?
C++ 限制对象只能在堆上或栈上创建,本质是控制构造、析构和释放入口。只能堆上创建通常把析构函数设为 private 或 protected,并提供 destroy 接口;只能栈上创建通常禁用 operator new 和 operator new[],阻止动态分配。
客户端 Crash 发生后如何定位问题?
客户端 Crash 定位要从复现、日志、崩溃栈、符号化、版本环境、用户操作路径和近期变更入手,先判断是 Java/Kotlin 异常、Native 崩溃、ANR、OOM 还是系统兼容问题,再结合监控聚合和最小复现找到根因。
Java 有哪些常见加锁机制?
Java 常见加锁机制包括 synchronized、ReentrantLock、ReadWriteLock、StampedLock、原子类和基于 AQS 的同步器。面试重点不是罗列名称,而是说明它们的互斥语义、可重入性、公平性、可中断、条件等待、读写并发和适用场景。
Java 内部类为什么可以访问外部类成员?
Java 内部类能访问外部类成员,本质上不是虚拟机给了它特殊权限,而是编译器在字节码层建立了外部实例引用和访问通道。非静态内部类会携带指向外部对象的隐藏引用,因此能通过这个引用读取外部对象的字段和方法;对私有成员的访问则由同一 nest 的访问规则或编译期生成的桥接访问方法支持。
ConcurrentHashMap 的实现原理是什么?
ConcurrentHashMap 的核心是把哈希表操作拆成可并发执行的小粒度步骤:读操作大多依赖 volatile 可见性和链表或树查找,无需整体加锁;写操作在空桶上用 CAS 放入节点,在冲突桶上锁住桶头节点;扩容时通过 ForwardingNode 和协助迁移让多个线程共同搬迁数据。
如何实现 Java 单例模式?
Java 单例模式的目标是保证一个类在进程内只创建一个实例,并提供全局访问点。实现方式包括饿汉式、同步懒汉式、双重检查锁、静态内部类和枚举。面试中要重点说明线程安全、延迟加载、性能、反射和序列化对单例唯一性的影响。
一个进程最多能打开多少文件描述符,受哪些限制?
一个进程最多能打开多少文件描述符,没有单一固定答案,取决于进程级软硬限制、系统级文件句柄上限、内核内存、服务管理器和容器配置,以及程序自身使用的 I/O 模型。实际排查要同时看 ulimit、/proc 限制、sysctl、systemd LimitNOFILE 和进程当前已打开的描述符。
HTTPS 为什么结合使用对称加密和非对称加密?
HTTPS 同时使用非对称加密和对称加密,是为了兼顾安全密钥交换、身份认证和传输性能。非对称加密适合解决陌生双方如何安全协商密钥和验证服务器身份的问题,但计算成本高;对称加密速度快,适合保护大量业务数据,因此握手阶段协商会话密钥,传输阶段用对称密钥加密数据。