Java基础
-
JDK与JRE的区别是什么?
- JDK(Java Development Kit)包含了运行Java程序所需的一切:Java编译器、Java运行时环境(JRE)、库函数、工具等。JRE是运行Java程序的最小环境,它包含Java虚拟机(JVM)、类库和其他支持文件。
-
==
和equals()
比较有什么区别?-
==
比较的是对象的内存地址(对于基本数据类型,比较的是值)。equals()
方法默认行为也是比较内存地址,但可以通过重写来实现基于内容的比较。
-
-
final
,finally
,finalize
的区别是什么?-
final
可以用于修饰类、方法和变量,表示不可变性。finally
块确保无论是否发生异常都会执行的代码段。finalize()
是一个方法,GC在回收对象前会调用此方法进行清理工作,但不推荐依赖它。
-
集合框架
-
HashMap的工作原理是什么?
- HashMap通过哈希表存储键值对。它使用键的hashCode()计算出一个索引,并将键值对存储在对应的位置。如果两个键的哈希码相同,则会发生碰撞,HashMap使用链表或红黑树解决冲突。
-
ArrayList与LinkedList的区别是什么?
- ArrayList基于动态数组结构,支持快速随机访问;而LinkedList基于双向链表,插入删除操作更快,但在随机访问方面效率较低。
多线程与并发编程
-
Java中实现多线程有几种方法?
- 继承Thread类、实现Runnable接口或Callable接口(结合FutureTask),以及使用Executor框架管理线程池。
-
volatile
关键字的作用是什么?-
volatile
保证了变量的可见性,即当一个线程修改了变量的值后,其他线程能立即看到这个变化。但它并不能保证原子性。
-
Java基础深入
基本数据类型与包装类
-
Java中的基本数据类型有哪些?它们的默认值是什么?
- byte, short, int, long, float, double, char, boolean。
- byte: 0
- short: 0
- int: 0
- long: 0L
- float: 0.0f
- double: 0.0d
- char: '\u0000' (null字符)
- boolean: false
- byte, short, int, long, float, double, char, boolean。
-
什么是自动装箱和拆箱?
- 自动装箱是将基本数据类型自动转换为对应的包装类对象(如int到Integer),自动拆箱则是相反的过程,将包装类对象自动转换为对应的基本数据类型。
类与对象
-
构造函数的特点是什么?
- 构造函数名称必须与类名相同,没有返回类型,可以有参数也可以无参数。每个类至少有一个构造函数,如果没有定义,则编译器会提供一个无参构造函数。
-
this
关键字的作用是什么?-
this
关键字引用当前对象实例,主要用于区分成员变量和局部变量,也可用于调用当前类的其他构造函数(构造函数链)。
-
继承与多态
-
super
关键字的作用是什么?-
super
关键字用于引用直接父类的对象,可用于访问父类中被子类成员隐藏的成员变量或方法,也可以调用父类的构造函数。
-
-
抽象类与接口的区别是什么?
- 抽象类可以包含具体的方法实现,而接口不能。一个类只能继承一个抽象类,但可以实现多个接口。接口中的方法默认都是public abstract的,而抽象类的方法可以有不同的访问修饰符。
异常处理
-
Java中的异常分为哪两类?
- 检查型异常(Checked Exception):必须在代码中显式捕获或声明抛出;非检查型异常(Unchecked Exception):不需要强制处理,包括RuntimeException及其子类。
-
try-with-resources
语句有什么作用?-
try-with-resources
语句确保使用后关闭那些实现了AutoCloseable接口的资源,如文件流、数据库连接等,简化了资源管理并减少了内存泄漏的风险。
-
其他
-
static
关键字可以用来修饰什么?- 可以用来修饰成员变量、成员方法、代码块以及内部类。静态成员属于类本身而不是类的实例,可以通过类名直接访问。
-
final
关键字在不同上下文中的含义是什么?- 当应用于变量时,表示该变量一旦赋值就不能更改;应用于方法时,表示该方法不能被重写;应用于类时,表示该类不能被继承。
JVM相关
-
JVM内存模型由哪些部分组成?
- 包括堆、栈、方法区、程序计数器和本地方法栈。
-
垃圾回收机制是如何工作的?
- 垃圾收集器识别并回收不再使用的对象占用的内存。常见的算法包括标记-清除、复制、标记-整理等。
Spring框架
-
Spring AOP的工作原理是什么?
- Spring AOP基于代理模式,在目标对象上应用横切关注点,如事务管理、日志记录等。
-
Spring Boot与传统Spring应用的主要区别在哪里?
- Spring Boot简化了配置,提供了开箱即用的功能,减少了样板代码,支持嵌入式服务器,易于部署。
数据库
-
MySQL中的索引类型有哪些?
- 主要有B-Tree、Hash、R-Tree等,其中B-Tree是最常用的索引类型,支持范围查询。
-
事务的ACID属性分别指什么?
- 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
Redis
-
Redis支持的数据类型有哪些?
- String、List、Set、Sorted Set、Hash等,适用于不同的场景。
-
Redis的持久化机制有哪些?
- RDB快照:定期保存数据库状态到磁盘;AOF日志:记录每个写操作命令,重启时重新执行。
设计模式
-
什么是单例模式?如何实现线程安全的单例?
- 单例模式确保一个类只有一个实例,并提供全局访问点。线程安全的单例可以通过使用双重检查锁定(Double-Checked Locking)或静态内部类的方式实现。
-
工厂模式与抽象工厂模式有什么区别?
- 工厂模式关注于创建单一类型的对象,而抽象工厂模式提供了一个接口,用于创建一系列相关或依赖的对象,无需指定它们具体的类。
网络编程
-
TCP与UDP的主要区别是什么?
- TCP是面向连接、可靠的传输协议,保证数据包按序到达;UDP则是无连接、不可靠的传输协议,适用于对速度要求较高但对可靠性要求不高的场景。
-
HTTP与HTTPS的区别是什么?
- HTTP是超文本传输协议,明文传输;HTTPS通过SSL/TLS加密HTTP请求和响应,提供了更高的安全性。
性能优化
-
如何优化Java应用的性能?
- 使用合适的数据结构和算法、避免内存泄漏、合理配置JVM参数、利用缓存减少重复计算等。
-
解释一下JVM调优中的垃圾回收调优?
- 选择合适的垃圾收集器(如G1、CMS),调整堆大小、新生代与老年代的比例,以及监控GC行为以降低暂停时间。
安全性
-
Java中如何实现加密?
- 可以使用Java Cryptography Architecture (JCA)提供的API来执行数据加密解密操作,比如AES、RSA等算法。
-
什么是SQL注入攻击?如何防范?
- SQL注入是通过将恶意SQL代码插入到查询字符串中执行未授权的操作。使用PreparedStatement代替Statement可以有效预防此类攻击。
微服务架构
-
微服务架构的优势是什么?
- 提高开发效率、独立部署、技术栈灵活性、故障隔离等。
-
Spring Cloud提供了哪些组件支持微服务?
- 包括Eureka(服务发现)、Ribbon(客户端负载均衡)、Feign(声明式REST客户端)、Hystrix(断路器)、Zuul(API网关)等。
测试
-
单元测试与集成测试的区别是什么?
- 单元测试侧重于验证单个功能模块的正确性;集成测试则关注多个组件之间的交互是否正常工作。
-
Mockito框架在单元测试中有何作用?
- Mockito允许创建和配置mock对象,简化了单元测试中的依赖管理,使得测试更加聚焦于被测代码的功能。