-
ArrayList扩容本质是按需增长的数组封装,通过创建更大数组并复制数据实现动态性,在空间效率与时间开销间平衡;初始容量影响首次扩容时机,无参构造延迟初始化为10,指定容量可避免多次扩容;扩容发生在add等写入操作前,判断是否size等于数组长度;新容量默认1.5倍增长(oldCapacity+oldCapacity>>1),不足时直接取所需最小容量;扩容通过Arrays.copyOf创建新数组、复制有效元素、替换引用完成,时间复杂度O(n)。
-
设计模式的根基是OOP四大特性:封装支撑工厂模式隐藏创建细节,多态支撑策略等行为型模式实现运行时替换,继承与组合共同实现装饰器等结构型模式,抽象与开闭原则驱动架构演进。
-
Java应用日志路径配置关键在于运行目录(JVM启动时的终端当前路径),而非编译或类路径;推荐通过JVM参数-Dlog.path、绝对路径配置或容器挂载等方式确保日志路径可靠,start.sh中cd后执行可显式控制运行目录。
-
Java集合框架解决数组无法动态扩容及缺乏通用数据操作能力的问题,提供List/Set/Map等接口封装复杂逻辑、统一行为、明确语义,并通过泛型在编译期保障类型安全。
-
本文澄清一个常见误解:仅通过-agentpath加载JProfilerAgent并不能启动JProfilerGUI;它只是将探针注入JVM,真正启动图形界面需调用bin/jprofiler脚本。
-
通过接口抽象输入输出,结合多态、模板方法和装饰器模式,构建可扩展的IO模型,统一管理资源与异常,提升复用性与维护性。
-
继承层级过深会降低可读性、增加维护成本并引发脆弱基类问题;应优先用组合替代非“是一种”关系的继承,控制继承深度在三层以内,以接口定义能力,并逐步重构遗留深继承。
-
Java异常体系以Throwable为根类,其下分为Error和Exception。Error表示系统级问题如OutOfMemoryError,程序无法恢复;Exception分为检查异常(如IOException)需编译期处理,和非检查异常(如NullPointerException)由运行时逻辑错误引发,体现对可恢复与不可控问题的分层处理机制。
-
私有化属性通过private修饰实现封装,防止外部直接访问,结合getter/setter方法提供安全的数据读取与校验机制。示例中Person类对name和age进行非空及范围校验,确保数据合法性;BankAccount类利用构造器初始化关键字段,并通过final保证账号不可变,提升安全性与线程安全。针对可变引用类型如List,直接返回内部引用会破坏封装,应返回不可变视图或副本,避免外部绕过setter修改状态。现代IDE支持自动生成标准getter/setter方法,提高开发效率并减少错误。封装的核心在
-
ReentrantLock提供比synchronized更灵活的线程同步控制,支持公平锁、可中断等待和超时获取锁;其基本使用需显式加锁并确保在finally中释放;默认为非公平锁以提升性能,公平锁则避免线程饥饿;tryLock方法支持尝试获取锁或限时等待,适用于防死锁场景;lockInterruptibly支持中断响应,便于取消长时间操作;合理使用可提升并发程序的健壮性与响应能力。
-
Collections.fill()用于将List中所有元素替换为指定对象。需确保集合为已初始化的List且size>0,支持null值填充,直接修改原集合,时间复杂度O(n),适用于ArrayList等可变列表,不适用于Set或Map。
-
静态变量属于类,被所有实例共享,类加载时分配内存,存储于方法区,可通过类名访问,生命周期随程序结束而终止;实例变量属于对象,每个对象独立拥有,创建时分配在堆内存,只能通过对象访问,生命周期与对象一致。
-
答案是使用Collections.reverse()可反转List集合元素顺序,如ArrayList、LinkedList等,该方法原地修改列表且无返回值,仅适用于有序集合类型。
-
Arrays.sort()基于双轴快排,用于高效排序基本类型数组;对象数组需实现Comparable或传入Comparator;支持指定范围排序;注意原地修改、稳定性及性能优化。
-
Map的key必须重写equals()和hashCode(),因哈希表靠hashCode()定位桶、equals()判断键等价;若不重写,默认地址比较会导致相同逻辑对象被误判为不同key。