Spring
Spring核心技术Spring框架的控制反转IoC 容器。
Spring面相切面编程 AOP 技术。
此外还有Spring和AspectJ
IOC容器Spring IoC容器和Bean简介原本是 “对象自己找依赖”(比如 A 类要用到 B 类,A 自己 new B、自己找 B 的实例),现在是 “容器给对象送依赖”(A 不用管 B 怎么来,容器提前准备好 B,在创建 A 时主动 “塞” 给 A)—— 这种 “找依赖的权力从对象手里转到容器手里” 的反转,就是 IoC;而容器 “塞依赖” 的具体动作,就是 DI(依赖注入)
IoC 是 “设计原则”(核心思想是 “反转依赖控制权”),DI 是 “实现方式”(具体怎么把依赖给对象)—— 二者本质是同一概念的不同角度描述,Spring 用 DI 的方式实现了 IoC 原则。
一个对象(比如 A 类)要和其他对象(比如 B 类、C 类,也就是 A 的 “依赖”)合作,不用自己去创建或查找这些依赖,只需要 “明确告诉容器自己需要什么”—— 告诉的方式有 3 种:
构造参数:A 的构造方法里写public A(B b) { ... & ...
Netty
NettyBIO、NIO、AIO 的区别BIO、AIO和NIO是Java中不同的I/O模型,它们在处理输入输出操作时有不同的特点。
BIO: 阻塞式的I/O模型。当一个线程执行I/O操作时,如果数据还没准备好,这个线程会被阻塞,直到数据到达。适合连接数较少且固定的场景,但扩展性较差。在Java中用ServerSocket和Socket的accpet方法,用来阻塞,等待客户端连接。
NIO: 非阻塞的I/O模型。NIO使用缓冲区和通道来处理数据,提高了I/O操作的效率。支持面向缓冲区的读写操作,可以处理大量并发的连接。在java.nio包中提供了Selector、Channel等类实现高效的非阻塞IO
AIO: 异步I/O模型,从Java 7开始引入。在AIO中,I/O操作被发起后,线程可以继续执行其他任务,一旦I/O操作完成,操作系统会通知线程。适合需要处理大量并发I/O操作,且希望避免I/O操作阻塞线程的场景。在Java中通过AsynchronousSocketChannel类来实现异步IO
使用场景:
BIO适合低并发、连接数较少的应用。
NIO适合高并发、需要处理大量连接的应用 ...
RPC了解
RPC了解定义RPC = Remote Procedure Call 远程过程调用
简单来说像调用本地方法一样,调用远程服务器上的方法。
常见的RPC框架
Dubbo
阿里巴巴
国内最流行,功能强大,集成 ZooKeeper
gRPC
Google
跨语言,高性能,使用 Protobuf 和 HTTP/2
Thrift
Apache
Facebook 开源,支持多语言
Spring Cloud OpenFeign
Spring
基于 HTTP 的轻量级 RPC
RPC核心组件
组件
作用
动态代理
让调用远程方法像调用本地方法一样
序列化/反序列化
把对象转成字节流在网络上传输(如 JSON、Protobuf、Hessian)
网络通信
使用 TCP/HTTP 传输数据(如 Netty、OkHttp)
服务发现
找到服务端的 IP 和端口(如 ZooKeeper、Nacos)
负载均衡
多个服务实例时,选择哪个调用(如轮询、随机)
为什么需要RPC
在单体应用中,所有代码在一个进程里,方法调用是“本地调用”。
但在 ...
Java线程池的原理
Java线程池的原理线程池是一种池化技术,用于创建和管理线程,避免频繁的创建和销毁,提高性能和响应速度。
Java线程池有几个核心参数
1、核心线程数
2、最大线程数
3、工作队列
4、最大空闲时间
5、拒绝策略
主要工作原理如下
1、默认情况下是不会创建线程的,只有当任务提交也就是执行了submit方法之后才会创建线程
2、当核心线程数满了之后,也不会新建线程,而是把任务堆积在工作队列中
3、当核心线程满了,并且工作队列也满了才会创建新线程
4、当核心线程满了,并且超过最大线程数的时候就会采取拒绝策略
5、当线程运行一段时间,存在空闲线程的时候,如果空闲线程超过最大空闲时间就会销毁线程,直到线程数等于核心线程数才停止销毁。
通常会使用自定义线程池,一般通过java.util.concurrent.ThreadPoolExecutor构造函数
123456789public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long k ...
Mybatis的执行原理
Mybatis的执行原理前置知识JDBC要说这个首先要知道JDBC的原理:首先JDBC其实也是远程调用的一种应用,然后Sun公司已经提供好对应的API了,然后JDBC访问数据库编码步骤就是先加载驱动Driver,然后创建数据库链接Connection,然后创建一个发送Sql的发送器Statement,然后通过Statement发送sql语句,然后Statement返回结果集,然后处理然后关闭资源就好了。
反射Java 反射的实现依赖于 JVM 的类加载机制 和 运行时的元数据存储。
类加载过程
当 JVM 加载一个类时,会创建一个对应的 Class 对象。
这个 Class 对象包含了类的所有元信息:字段、方法、构造器、注解、父类、接口等。
这些信息存储在 JVM 的 方法区(Method Area) 或 元空间(Metaspace,JDK 8+)。
反射如何工作
Class.forName() 触发类加载,返回 Class 实例。
通过 Class 实例可以获取 Field、Method、Constructor 等对象。
调用 invoke()、set() 等方法时,J ...
八股文集合
八股文集合计算机网络介绍一下TCP/IP模型和OSI模型的区别OSI和TCP/IP都是一个计算机进行通信的一种体系,而OSI模型师国际组织制定的一个标准体系,TCP/IP是实际网络通信中的实际的体系结构。
OSI自底向上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
TCP/IP分四层,每个层负责特定的网络功能。
自底向上是网络接口层,这层对应OSI的数据链路层和物理层,,这层负责物理传输媒介的定义和管理,比如有线的以太网传输,无线的WIFI传输,此外,网络接口层还管理硬件地址(MAC地址)的管理。
然后是网络层,这层对应OSI的网络层,主要协议是IP,他负责数据包的路由和转发,选择一个最佳路径来将数据包从源主机传送到目标主机。IP协议使用IP地址来进行逻辑地址寻址。
传输层对应OSI的传输层,这层负责应用与应用间的数据传输。主要的传输协议是TCP和UDP。TCP提供可靠的数据传输,UDP提供不可靠的实时传输。
应用层对应OSI的应用层、表示层和会话层,他用于网络上的各种应用提供服务,比如网页浏览,文件传输等。
以上就是osi和tcp/ip的区别了。
从输入URL到页 ...
算法合集
算法合集前导算法讲解019【必备】算法笔试中处理输入和输出_哔哩哔哩_bilibili
这是很必要的
简单来说用BufferReader可以把所有文件用内存来托管
然后用StreamTokenizer可以忽略所有的空格和换行把一个个数字读出来
按行读不推荐用动态
推荐使用全局静态空间
IO模板规定数据量的题性型
12345678910111213141516171819202122232425262728293031323334353637383940414243444546import java.io.*;public class Main{ //题目给定的行最大数据量 public static int MAXN = 201; //题目给定的列的最大数据量 public static int MAXM = 201; //静态的空间,不停的复用 public static int[][] mat = new int[MAXN][MAXM]; //能用静态就用静态 public stati ...
算法问题合集
算法问题合集二分只要有排他性,就能二分,可以确保一半肯定有答案,直接砍一,不一定要有序
问题1:局部最小值题目:无需数组,值随机,任意两个相邻的数不相等,找到一个局部最小值,只要一个就行。
局部最小的定义:两个边界,0位置的数比1位置的数小,N-1位置的数比N-2位置的数小就叫局部最小值,如果是中间的数,就要比相邻左右两个数小就叫局部最小值
解题思路:一个数组从0到N-1,先单独看0位置和N-1的位置,如果成功返回,如果都失败,说明0到1是下降,N-1到N-2也是下降,中间肯定有局部最小,这时候找中间位置,分情况如果中间比左边小,又比右边小,直接返回,如果只比左边小,直接砍右边,再继续二分,总会找到的。
注意:重要的是学会思想!!!!
162. 寻找峰值 - 力扣(LeetCode)
下面这个是力扣的答案
1234567891011121314151617181920212223class Solution { public int findPeakElement(int[] nums) { if (nums == null || nums.le ...









