-
Java中String、ArrayList、HashMap等引用类型变量存储的是堆内存地址,=赋值复制地址而非内容;修改可变对象会影响所有引用,String因不可变而例外;==比较地址,equals比较内容;传参时地址副本仍指向原对象,需注意副作用与null风险。
-
类是抽象模板,定义共同属性和方法;对象是具体实例,拥有独立状态和行为;一个类可创建多个对象;静态成员属于类本身,被所有对象共享。
-
Math类提供静态数学方法与常量,位于java.lang包,无需导入;常用方法包括abs、max、min、pow、sqrt、cbrt、random、round、ceil、floor、rint及三角函数和PI、E常量,所有方法通过Math.调用,注意返回类型与浮点比较精度,合理使用可提升数值计算效率与准确性。
-
Eclipse启动提示“NoJavavirtualmachinewasfound”或JRESystemLibrary显示unbound,说明未正确配置外部JDK;需先验证java-version和javac-version可用,再在Preferences→Java→InstalledJREs中手动添加JDK根目录,最后为项目指定JRE。
-
Future是Java中获取异步计算结果的核心接口,常与ExecutorService配合使用。通过submit提交Callable任务后返回Future对象,可用get()方法获取结果,但需注意其阻塞性:无参get()会一直阻塞,建议使用带超时的版本以避免无限等待。异步任务抛出的异常会被封装在ExecutionException中,必须在get()时捕获处理。可调用cancel(true)尝试取消未完成的任务,并传入true表示中断运行中的线程。最佳实践包括及时调用shutdown关闭线程池、使用超时机
-
Java中抛出异常会显著影响性能,主因是JVM需生成完整栈轨迹,即使catch住开销也已发生;三类高开销异常包括常见运行时异常、未重写fillInStackTrace()的自定义异常及循环内频繁throw;应避免热路径触发异常,改用预检、返回值等替代方案。
-
在Java中,通过构造器传参初始化对象属性与通过setter方法后续修改属性,本质区别在于语义设计:前者定义对象“是什么”,后者控制对象“如何变化”。
-
Java用可达性分析判断对象是否可回收:从GCRoots出发,不可达即回收;GC分标记、清除、整理三步;触发条件包括Eden满(MinorGC)、老年代不足(FullGC)等;新生代多用复制算法,老年代用标记-整理或标记-清除。
-
Java中应弃用Date和Calendar,改用Java8的java.time包;Date仅包装毫秒值且方法废弃易错,Calendar笨重难用且时区处理不透明,而LocalDateTime、ZonedDateTime等类型职责清晰、线程安全、API直观。
-
通过提前校验、方法拆分、try-with-resources和统一异常处理,可将多层嵌套的try-catch简化为扁平、清晰的结构,避免冗长代码,提升可维护性。
-
ArrayIndexOutOfBoundsException是反映索引计算缺陷的运行时异常,不应靠try-catch修复;正确做法是修正边界逻辑,如将for循环条件改为i<array.length,访问前校验index>=0&&index<array.length。
-
Java企业级数据库初始化核心是驱动加载、连接池配置、数据源管理及Spring集成,强调稳、可管、可扩展;需匹配驱动版本,禁用DriverManager,优选HikariCP或Druid,启动时校验连通性并协同事务、ORM等能力。
-
BlockingQueue是Java并发编程中用于生产者-消费者模型的线程安全队列,其核心特性是在队列为空时阻塞获取元素的线程,队列满时阻塞添加元素的线程。它提供四组方法应对操作失败:抛出异常、返回特殊值、阻塞等待、超时退出。主要实现类包括:1.ArrayBlockingQueue:基于数组的有界阻塞队列,使用单锁控制入队出队,支持公平性;2.LinkedBlockingQueue:基于链表的可选有界队列,默认容量极大,采用两把锁分离读写,提升并发性能;3.PriorityBlockingQueue:无界
-
LinkedHashSet严格保持插入顺序,HashSet顺序不可预测,这是由底层结构决定的:前者维护双向链表,后者仅依赖哈希表;序列化后顺序仅在反序列化为LinkedHashSet时保留。
-
静态代码块在类加载时执行一次,用于初始化静态资源;实例代码块每次创建对象时执行、优先于构造器,用于抽取共用初始化逻辑;二者执行顺序严格遵循“父类静态→子类静态→父类实例→父类构造→子类实例→子类构造”。