面试题-Java篇

张开发
2026/4/22 19:52:10 15 分钟阅读

分享文章

面试题-Java篇
面向对象的特征有哪些方面封装:隐藏实现细节暴露公共接口继承实现代码复用建立类之间的层次关系多态通过父类引用指向子类对象实现同一方法的不同行为抽象提取共同的特征定义规范而不实现细节抽象类和接口的区别抽象类可以包含成员变量、构造方法和具体方法支持单继承接口只能包含常量、抽象方法JDK 8 后可以有默认方法和静态方法支持多实现。抽象类强调‘是什么’接口强调‘能做什么’java反射反射是Java在运行时动态获取类的元数据如构造器、方法、字段并操作对象的能力通过Class对象实现常用于框架开发、动态代理、注解解析等场景。反射提供了灵活性和扩展性降低了耦合但是会带来性能开销和安全风险。Class类的作用Class 类是 Java 反射的核心类代表 JVM 中已加载的类或接口的元数据通过它可以在运行时获取类的完整结构构造器、方法、字段、注解并动态操作对象是框架实现依赖注入、ORM、动态代理的基础深拷贝和浅拷贝的区别深拷贝对于引用数据类型会new一个新的对象然后会将属性地址指向该对象浅拷贝对于引用数据类型拷贝的是地址对于基本数据类型两者都是拷贝的是值int和Integer的区别int 是基本数据类型直接存储数值默认值为 0性能高但缺乏面向对象特性Integer 是引用数据类型默认值为 null提供了对象方法和缓存机制-128 到 127支持泛型和集合操作。JDK 5 后自动装箱拆箱实现了两者间的自动转换final关键字的用法(3)final关键字用于声明不可变变量、方法和类使用final关键字声明的变量必须在其初始化之后保持不变。使用final关键字声明的方法不能被子类重写使用final关键字声明的类不能被继承static关键字的作用是什么?(3)static关键字用于声明静态变量、静态方法和静态代码块。它们都属于类级别的而非实例级别的即与类一起被创建和销毁而不是与类的每个实例一起被创建和销毁所有实例都共享一份静态变量。可以通过类名直接访问静态方法也可以通过类名直接调用。静态方法内不能访问实例变量或方法只能访问静态变量和静态方法。静态代码块在类加载时执行只会执行一次。用于初始化静态资源。String、Stringbuffer、Stringbuilder区别(3)从内容比较String是字符串常量对象不可更改重新赋值相当于创建新的对象StringBuffer和StringBuilder都是字符串变量是可以改变的从执行速度比较StringBuilder最快StringBuffer次之String最慢从线程安全比较String和StringBuffer线程安全,StringBuilder线程不安全 和 equals的区别和equals最大的区别是一个是运算符一个是方法如果比较基本数据类型则比较数值是否相等如果比较引用数据类型则比较对象的地址值是否相等equals用来比较两个对象的内容是否相等equals不能用于基本数据类型的变量如果没有对equals进行重写则比较的还是引用数据类型的地址值是否相等方法重载与重写的区别方法重载和重写是java多态性的不同表现方法重载是指一个类中定义了多个方法名相同,但他们的参数数量不同或数量相同而类型和次序不同,则称为方法的重载方法重写是在子类存在方法与父类的方法名相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现Java集合框架体系ArrayList底层的实现原理是什么ArrayList底层是用动态的数组实现的始容量为0当第一次添加数据的时候才会初始化容量为10。ArrayList在添加数据时首先要确保数组已使用长度size加1之后足够存下下一个数据​。如果大于当前的数组长度则调用grop方法扩容为原来的1.5倍每次扩容都需要拷贝数组。小于则添加到数组中。ArrayList和LinkedList的区别是什么ArrayList底层是数组支持快速随机访问O(1)但中间插入删除需要移动元素O(n)。LinkedList底层是双向链表插入删除只需修改指针O(1)但随机访问需要遍历O(n)。HashMapJDK8之前和之后有什么区别JDK8前底层是数组链表的8后是数组链表红黑树的数据结构,一旦链表长度超过阈值8并且数组长度达到64时链表会转换为红黑树。链表插入从头插法改为尾插法避免了多线程下扩容的死循环问题。扩容时重新计算哈希值的逻辑也做了简化从重新计算每个元素的 hash 改为位运算判断HashMap的扩容机制在添加元素或初始化的时候需要调用resize方法进行扩容第一次添加数据初始化数组长度为16扩容阈值为数组长度*0.75当集合存储容量达到阈值时就会进行扩容每次扩容都是之前容量的2倍Hash冲突如何解决开放寻址法拉链法再哈希法公共溢出区序列化、反序列化序列化是把Java对象转换成字节流反序列化是将字节流重新转换为Java对象。通过实现Serializable接口标记可序列化。常用于对象保存到文件、Redis缓存、RPC远程调用等场景。

更多文章