Java编程基础全面解析
一、Java语言概述1. Java的特点
☕ 跨平台性:Write Once, Run Anywhere
🧩 面向对象:封装、继承、多态
🔒 安全性:自动内存管理(GC)
⚡ 高性能:JIT即时编译技术
2. JDK/JRE/JVM关系123graph LR A[JDK] --> B[JRE] B --> C[JVM]
二、基础语法速成
第一个Java程序12345public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, Java!"); }}
数据类型类型 关键字 示例整型 int int age = 25;浮点 double double price = 19.99;字符 char char grade = ‘A’;布尔 boolean boo ...
破解微服务中的依赖冲突:MyBatis-Plus自动配置数据源问题的解决方案
问题背景:当MyBatis-Plus遇上微服务分层架构
在微服务架构的开发实践中,我们常常采用分层设计来解耦业务逻辑。在我的项目中,我采用了实体类服务、server服务和web服务的分层架构,并通过Nacos进行配置管理。这种架构设计本应带来清晰的职责划分和灵活的部署能力,然而在实际开发中,我却遇到了一个棘手的依赖冲突问题。
具体场景如下:• server服务:作为核心业务逻辑层,配置了数据源并引入了MyBatis-Plus(以下简称MP)依赖,运行正常
• 实体类服务:包含领域模型和DTO定义,最初不涉及数据访问
• web服务:作为API网关层,主要负责请求路由和响应处理,不需要直接访问数据库
问题出现在当我需要在实体类服务中使用MP的注解(如@TableName等)时,我不得不引入MP依赖。由于web服务和server服务都依赖实体类服务,MP的自动配置机制在web服务启动时被触发,尝试初始化数据源,而Nacos上并未为web服务配置数据源,最终导致应用启动失败。
问题分析:自动配置的”双刃剑”特性
S ...
ArrayList底层结构1transient Object[] elementData; // non-private to simplify nested class access
底层是一个数组,默认大小为10,当数组容量不够时,会进行扩容,扩容大小为原来的1.5倍。
添加元素12345public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true;}
扩容12345678910111213private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCa ...
Java集合框架集合框架概述集合框架简介集合框架是一个用来表示和操作集合的统一框架。所有的集合类都位于java.util包下,主要有以下几个特点:
集合框架提供了一套性能优良、使用方便的接口和类,使我们可以更轻松地操作数据。
集合框架中的接口代表不同的集合类型,如List、Set、Map等。
集合框架中的类实现了这些接口,提供了具体的集合实现。
集合框架中的迭代器(Iterator)用于遍历集合中的元素。
集合框架中的比较器(Comparator)用于对集合中的元素进行排序和比较。
集合框架的结构集合框架的结构如下所示:
Collection接口Collection接口简介Collection接口是Java集合框架中最基本的接口,它定义了一些常用的集合操作方法,如添加元素、删除元素、获取元素等。Collection接口有两个子接口:List和Set。
Collection接口的方法Collection接口定义了一些常用的方法,如下所示:
boolean add(E e):向集合中添加一个元素。如果添加成功,返回true;否则返回false。
boolean addAll(C ...
缓存三兄弟缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,当请求大量不存在的数据时,就会导致数据库压力过大,甚至崩溃。
解决方案
布隆过滤器:布隆过滤器是一种数据结构,用于判断一个元素是否在一个集合中。它可以在O(1)的时间复杂度内完成判断,但是有一定的误判率。我们可以将所有可能存在的数据放入布隆过滤器中,当用户请求的数据不存在时,直接返回空,避免请求到达数据库。
缓存空值:当用户请求的数据不存在时,我们可以将空值存入缓存中,并设置一个较短的过期时间,比如5分钟。这样,当用户再次请求该数据时,可以直接从缓存中获取空值,而无需请求数据库。
参数校验:在用户请求之前,我们可以对请求参数进行校验,比如检查参数是否合法、参数是否在合理范围内等。如果参数不合法,可以直接返回错误信息,避免请求到达数据库。
缓存雪崩缓存雪崩是指缓存中大量数据同时过期或Reids服务宕机,导致大量请求直接到达数据库,导致数据库压力过大,甚至崩溃。
解决方案
设置不同的过期时间:为了避免缓存雪崩,我们可以为每个缓存的过期时间设置一个随机值,这样就可以避免大量数据同时过期。
使用Redis集群: ...
缓存更新策略1. Cache Aside1.1 Cache Aside 更新策略Cache Aside 是一种常见的缓存更新策略,其核心思想是先更新数据库,然后再删除缓存。具体步骤如下:
读请求:当客户端发起读请求时,首先查询缓存,如果缓存中存在数据,则直接返回缓存中的数据;如果缓存中不存在数据,则查询数据库,并将查询结果返回给客户端,同时将查询结果写入缓存。
写请求:当客户端发起写请求时,首先更新数据库,然后将缓存中的数据删除。这样可以确保缓存中的数据与数据库中的数据保持一致。
1.2 Cache Aside 的优点
一致性:Cache Aside 策略可以确保缓存中的数据与数据库中的数据保持一致,从而避免数据不一致的问题。
简单:Cache Aside 策略的实现相对简单,只需要在写请求时删除缓存即可。
1.3 Cache Aside 的缺点
缓存穿透:当数据库中不存在数据时,缓存中也不存在数据,此时每次读请求都会查询数据库,导致数据库压力过大。
缓存雪崩:当缓存中的数据大量失效时,大量的读请求会直接查询数据库,导致数据库压力过大。
2. Write Through ...

