Java面试题大全(2025年版)1000+大厂面试题附答案详解.docxVIP

  • 1
  • 0
  • 约1.23万字
  • 约 26页
  • 2025-10-20 发布于四川
  • 举报

Java面试题大全(2025年版)1000+大厂面试题附答案详解.docx

Java面试题大全(2025年版)1000+大厂面试题附答案详解

Java基本数据类型有哪些?各自的占用空间和取值范围?

Java有8种基本数据类型:byte(1字节,128~127)、short(2字节,32768~32767)、int(4字节,2^31~2^311)、long(8字节,2^63~2^631)、float(4字节,约±3.4e38)、double(8字节,约±1.7e308)、char(2字节,0~65535)、boolean(无明确大小,通常1字节或4字节,取决于JVM实现)。基本数据类型存储在栈中(除long和double外,部分JVM优化可能不同),直接存储值;引用类型存储对象地址,对象本身在堆中。

自动装箱和拆箱的原理是什么?Integer的缓存机制是什么?

自动装箱是通过对应包装类的valueOf()方法实现,如Integer.valueOf(int);拆箱是通过xxxValue()方法,如IValue()。Integer缓存(IntegerCache)默认缓存128到127之间的数值,这些数值会直接从缓存中获取,避免重复创建对象。例如,Integera=127;Integerb=127;a==b返回true(指向同一缓存对象);但Integerc=128;Integerd=128;c==d返回false(超出缓存范围,创建新对象)。缓存范围可通过JVM参数XX:AutoBoxCacheMax=xxx调整。

String、StringBuilder、StringBuffer的区别?为什么String是不可变的?

String底层是final修饰的char数组(JDK9后为byte数组),不可变;StringBuilder和StringBuffer继承自AbstractStringBuilder,底层数组可变。StringBuilder线程不安全(无同步),性能高;StringBuffer线程安全(方法用synchronized修饰),性能低。String不可变的原因:1)线程安全,多线程共享无需同步;2)哈希缓存,作为HashMap键时更高效;3)避免安全漏洞(如SQL注入中不可变字符串更安全);4)类加载机制依赖不可变字符串确保正确性。

equals和hashCode的关系?重写equals为什么必须重写hashCode?

equals判断对象逻辑相等,hashCode返回对象的哈希值。若两个对象equals为true,它们的hashCode必须相同;若hashCode不同,equals必为false;但hashCode相同,equals可能为false(哈希冲突)。重写equals时若不重写hashCode,会导致HashSet、HashMap等集合无法正确判断元素是否存在(集合通过hashCode定位桶,再用equals比较)。例如,自定义类重写了equals但未重写hashCode,将其存入HashSet时,可能出现两个逻辑相等的对象被判定为不同,导致集合中出现重复元素。

final修饰类、方法、变量的作用?final变量和staticfinal变量的区别?

final类不可被继承(如String);final方法不可被重写(防止子类修改逻辑);final变量不可被重新赋值(基本类型值不变,引用类型地址不变但对象内容可变)。final变量是实例级别的,每个对象有独立副本(除非static);staticfinal变量是类级别的,全局唯一(如常量),在类加载准备阶段初始化(基本类型直接赋值,引用类型需在静态代码块或声明时赋值)。

Java异常的分类?Checked异常和Unchecked异常的区别?

异常继承自Throwable,分为Error(JVM错误,如OOM、StackOverflow,不可恢复)和Exception(程序可处理)。Exception分为RuntimeException(未检查异常,如NullPointerException,编译器不强制处理)和非RuntimeException(检查异常,如IOException,必须显式捕获或声明抛出)。Checked异常强制处理,确保程序健壮性;Unchecked异常多由逻辑错误引起,不强制处理但需避免。

反射的原理和应用场景?如何通过反射获取和设置私有字段的值?

反射通过Class对象获取类的构造器、方法、字段等信息,动态操作对象。应用场景:框架(如Spring的依赖注入)、动态代理(AOP)、ORM(MyBatis映射)、注解处理(如@Autowired)。获取私有字段:通过Class.getDeclaredField(字段名)获取Field对象,调用setAccessible(

文档评论(0)

1亿VIP精品文档

相关文档