- 博客(48)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 计算机基础(中断、IO)
CPU 通过设备控制器与计算机外设进行交互。可以将控制器想象成编程语言中的接口,然后不同地计算机外设的控制器去实现这个接口,CPU 只需要调用接口而无需关注具体地实现,通过这种设计可以让 CPU 指令做得精简。拓展:软件六大编程原则之一:依赖倒置原则:上层模块不应该依赖底层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
2024-03-26 08:42:45 864
原创 Spring - AOP/事务 实现原理
Spring的Aop实现原理,Spring AOP 与 AspectJ 的关系 转载spring boot 自动配置AopAutoConfiguration类中带有@EnableAspectJAutoProxy,项目启动即开启对spring AOP的支持,该注解注册了AnnotationAwareAspectJAutoProxyCreator 类,该类实现了bean的后置处理器,可以在类创建过程中做一些其他操作在bean后置处理器的。
2024-03-26 08:00:43 688
原创 Protocol Buffers设计要点
protobuff 一种开源跨平台的序列化结构化数据的协议。可用于存储数据或在网络上进行数据通信。它提供了用于描述数据结构的接口描述语言(IDL),也提供了根据 IDL 产生代码的程序工具。Protocol Buffers的设计目标是简单和性能,所以与 XML 相比更小且更快。在 Google,它被当作一个 RPC 系统的基础。
2024-03-25 13:30:14 1048
原创 Java之Stream的应用与原理分析
stream是怎么做到一次迭代中将所有流操作进行叠加?stream怎么做到只有在终止操作时进行元素遍历?那中间操作是做了些什么?
2024-01-31 08:38:55 384
原创 Tomcat 学习笔记
Pipeline-Valve 是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将再调用下一个处理者继续处理。连接器中的 Adapter 会调用容器的 Service 方法来执行 Servlet,最先拿到请求的是 Engine 容器,Engine 容器对请求做一些处理后,会把请求传给自己子容器 Host 继续处理,依次类推,最后这个请求会传给 Wrapper 容器,Wrapper 会调用最终的 Servlet 来处理。
2024-01-28 17:53:53 876
原创 SpringBoot 源码解析 - 持续更新
入口程序SpringApplication.run 根据入参 SpringDemoApplication 找到当前 SpringBoot 应用的配置类(即标注了 @SpringBootApplication 的类)Java SPI VS Spring SPI todo:注解上的注解 Spring 或 Java 是怎么解析的?从 @SpringBootApplication 入手其中 @EnableAutoConfiguration 的实现 AutoConfigurationImportSelector,
2024-01-28 17:33:23 893 1
原创 Spring MVC 基本知识
在 AbstractUrlHandlerMapping 体系下,一个 Handler 一般就是一个类,但是在 AbstractHandlerMethodMapping 体系下,一个 Handler 就是一个 Mehtod,这也是我们目前使用 SpringMVC 时最常见的用法,即直接用 @RequestMapping 去标记一个方法,该方法就是一个 Handler。而json数据就有些麻烦了,因为json数据放在body中,我们需要通过request的输入流去读取。
2024-01-28 17:32:38 1196 1
原创 SPI:JDK 与 SpringBoot
API:由被调方提供的实现了某个完整功能的接口,主调方直接调用该接口来享用该功能,而无需关注该接口的具体实现。比如使用 JDK 的 InputStream#read 从文件系统中读取数据。SPI:被调方(框架)提供的功能扩展点接口,主调方可实现这些接口与被调方(框架)进行互动。
2024-01-28 17:31:34 1031 1
原创 gRPC 基本原理
/第一行指定了正在使用 proto3 语法:若未指定编译器会使用 proto2。这个指定语法行必须是文件的非空非注释的第一个行。// 为每个 message 单独生成一个类文件//指定 .proto 文件包名,防止不同项目之间的命名冲突。在java中,包名称用作Java包。在 .pb文件 中定义好 service 后,通过借助 gRPC 的 protocol buffers 插件,生成 gRPC 服务端代码。
2024-01-28 17:30:48 736
原创 JDK 8 - SerializedLambda
SerializedLambda是Java提供的关于lambda表达式的序列化方案,会将实现了Serializable接口的lambda表达式转换成 SerializedLambda 对象之后再去做序列化。其核心在于Java在对lambda表达式序列化时,虚拟机会添加一个writeReplace()方法。根据Java的序列化机制,虚拟机在调用write(obj)序列化对象前,如果被序列化对象有writeReplace方法,则会先调用该方法,用该方法返回的对象进行序列化,即序列化对象被替换了。
2024-01-28 17:29:21 778
原创 lambda 方法引用
four kinds of method referenceAccording to Oracle Java tutorial, there are four kinds of method reference:I prepared 3 interfaces - for 0, 1 and 2 parameters. Then we have 3 static and 3 instance methods:Now look how each of the methods may be used as a
2024-01-28 17:28:49 322
原创 JVM 性能调优
如果碰到经常Full GC的情况,但是老年代空间使用的却不多,年轻代GC后的情况也很正常,同时也不存在突然大对象的情况,但是元空间却一直递增,那么可以考虑下是不是使用了反射等手段导致元空间加载的类太多了,导致元空间爆满触发Full GC,那么此时就可以加上-XX:+TraceClassLoading和-XX:+TraceClassUnloading这两个参数,看下类加载和卸载的情况,确定下是不是有哪些类反复被生成和加载,找到相应的类,然后跟踪到代码里,排除问题。GC所关心的含义就是“这块数据是不是指针”。
2024-01-28 17:23:39 782
原创 Spring - 基本用法参考
位于包 com.alibaba.spring:spring-context-support 下用于处理自定义注解。如果使用「自定义注解」注解了属性或者方法,并且需要创建对象将其设置到属性或者方法入参,可以继承AbstractAnnotationBeanPostProcessor,并实现doGetInjectedBean 以创建需要注入的对象。
2024-01-28 17:22:15 1414 1
原创 Kafka 知识点学习
一条消息可以被多个不同的 Consumer Group 消费,但是一个 Consumer Group 中只能有一个 Consumer 能够消费该消息。
2024-01-28 17:21:15 945
原创 ElasticSearch 学习笔记
在数据生成的时候,比如插入一份文档,内容是“小米手机与华为手机”,这个时候通过使用分词器,会将它分解为“小米”、“手机”、“与”、“华为”四个词语,然后可能还会把“与”这个无具体意义的关联词语干掉,最后生成一张倒排表。)的形式引入了 term index,它不存储所有的单词,只存储单词前缀,并将其完全放入到内存中,通过字典树找到单词所在的块(单词的大概位置),再在块里进行二分查找,找到对应的单词,再找到单词对应的文档列表。TF刻画了词语w对某篇文档的重要性,IDF刻画了w对整个文档集的重要性。
2024-01-28 17:20:03 1563
原创 多线程传递 ThreadLocal 解决方案
通过定义 static final 变量,在同一个线程内可以在任何时候、任何地方获取该 ThreadLocal 变量,减少冗余的函数传参。在编写业务方法时,尽量符合函数式编程中确定性(determinism)的要求:方法的结果,只取决于方法的参数,不依赖任何其它上下文环境(包括全局变量等)或者内部可变状态。那什么时候我们应该使用ThreadLocal呢?
2024-01-28 17:14:12 950
原创 Java 并发知识点
传统意义上的 Java 线程(以下称为平台线程)跟操作系统的内核线程是一一映射的关系(如图1所示)。平台线程通常持有一个线程堆栈和其他由操作系统维护的资源,基本适合运行所有类型的任务。过去的三十年里,平台线程为 Java 开发人员提供了构建并发应用程序的基础。服务端应用程序需要处理彼此独立的并发请求,因此使用一个独立的平台线程来处理一个请求是容易理解的,同时也易于编程,这也是 Spring 应用处理请求的方式。然而,这种请求处理方式受到利特尔定律(Little’s Law)的约束。
2024-01-28 17:12:28 665
原创 MySQL 学习记录
MySQL整体来看, 其实就有两块: 一块是 Server 层, 它主要做的是MySQL功能层面的事情;还有一块是引擎层, 负责存储相关的具体事宜。redo log是InnoDB引擎特有的日志, 而Server层也有自己的日志,称为binlog(归档日志)。为什么会有两份日志呢?因为最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM, 但是MyISAM没有crash-safe的能力, binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL。
2024-01-28 17:11:01 1012
原创 MySQL知识综合案例(IF-ELSE、存储过程、悲观锁、乐观锁)
前言我们都知道在高级编程语言中可以通过 switch 语句来切换程序的执行路径,以使程序能灵活地应对用户不同的输入请求,比如下面的例子。public class SwitchDemo { }
2021-08-29 01:25:51 210
原创 ThreadLocal 关键源码阅读及思考
前言使用 ThreadLocal 类来定义变量能确保每个线程访问的是该变量的副本,这样就能避免多线程访问一个变量时产生的线程安全问题。使用步骤创建 ThreadLocal 对象普通创建方式ThreadLocal<Long> createdTime = new ThreadLocal<>();带有初始值的创建方式方式一ThreadLocal<Long> createdTime = ThreadLocal.withInitial(() -> Sy
2021-08-22 01:00:26 110
翻译 翻译 - Java 8 新特性
interface 允许默认方法Java 8 允许接口中包含非 abstract 关键字修饰的方法,但是需要在有实现体的方法的声明前加上 default 关键字,这种特性也被称为 Extension Methods。下面是这种特性的第一个代码示例。interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); }}接口 Formula 除了声明了一个 抽象方法
2021-08-15 10:59:58 166
原创 Collectors.toMap 在批量缓存中的运用
前言在实际项目中经常有一个需求,就是在本地将对象缓存起来,Java 里面常被作为缓存工具的数据结构就是 Map。关于 Collectors.toMap 的更多说明可以查看 Java 8 特性 - Collectors. toMap缓存体系首先定义个缓存键接口public interface Cacheable<K> { K getCachedKey();}其次构建一个对象类public static class Person implements Cacheable
2021-08-14 17:04:31 166
原创 Java 8 特性 - Collectors. toMap
使用案例将一个对象数组转为 Map 对象import java.util.stream.Collectors;import java.util.Arrays;import java.util.HashMap;public class ToMapDemo { public static class Person { private Integer id; private String name; public Person(Integer id, String name) {
2021-08-14 17:00:59 194
原创 父类方法抛出的异常,子类重写时怎么处理?
前言重写(注意与重载的区别)是面向对象语言实现多态特性的重要知识点,与其它知识点结合一起使用过程中,会产生一些让人疑惑的点,这篇文章是为了演示与解释重写与异常两个知识点碰撞时产生的问题。这里先给出结论:子类在重写父类带有异常的方法时,可以自行决定是否抛出异常,但如果要抛出异常,那么抛出的异常的层级一定不能高于父类方法抛出的异常所处的层级。测试测试1父类抛出异常,子类不抛出异常public class ExceptionDemo { private static class Parent {
2021-08-08 18:38:49 1388 1
原创 BufferedInputStream源码阅读
前言BufferedInputStream 使用 装饰者模式 对InputStream的功能进行了加强。通过阅读该类的代码实现,对理解装饰者模式大有助益。继承体系FilterInputStreamFilterInputStream 类的定义就已经用到了装饰者模式——它本身继承自抽象类InpuStream,又定义了一个InputStream的成员变量 in,而且对继承的所有抽象方法的实现...
2020-07-11 17:35:00 195
原创 改名换姓的Java字节码压缩包
前言项目开发过程中,总会在项目中添加各式各样的 jar。那么什么是 jar?jar是什么?jar 其实就是一种以ZIP压缩协议进行压缩的压缩包,不过只是把得到的压缩包的 .zip 后缀改为了 .jar 而已。所以任何可以打开后缀为 .zip 的压缩包的软件也能打开 jar。上图就是使用 Bandizip 打开的一个 Demo.jar,展示了jar常见的内容。其中example 是代码...
2020-02-19 12:41:13 244
原创 结合 Java 虚拟机规范弄懂方法区
前言一直以来,对 方法区(Method Area) 的认识比较模糊,所以就抽空结合 JVM规范 、书籍和博客 对其功能和作用进行了研究。定义方法区能干什么规范中指出,方法区 的作用在于存储每个类的结构信息,包括运行时常量池、成员变量、成员方法、构造器以及一些特殊方法。成员变量以及成员方法我们都很熟悉了,重点就来看一一下 运行时常量池 和 特殊方法。运行时常量是什么根据 JVM规范,常...
2020-02-18 16:32:24 234
原创 通过例子理清 Java 中的重写(Override)与重载(Overload)
Override翻译为覆写或者重写都可以,它指在子类在继承父类时,如果父类已经存在一个方法 ,子类可以继续沿用该方法,但必须保证在子类中该方法的方法签名与父类的方法签名必须一致,且必须要保证子类中该方法的返回值类型要么是父类该方法的返回值类型,要么是父类该方法的返回值类型的子类型。在Java中方法签名相同可以方法的简单地理解为方法名参数个数参数类型顺序方法签名。常用的重写案例符合规则的重写案例(返回类型不一致)
2020-02-17 12:35:02 303 1
原创 Java 8未使用自定义配置的JAVA_HOME
前言我将JDK安装到了 C:\Program Files\Java 目录下,并且配置了系统变量 JAVA_HOME=C:\Program Files\Java\jdk1.8.0_212 和环境变量 PATH=%JAVA_HOME%\bin 但在实际运行过程中,我的JAVA_HOME并没有生效。问题与分析从前言中,我们知道了我电脑上的配置情况 JAVA_HOME=C:\Program File...
2020-02-16 17:49:40 673 1
原创 单例模式的Java实现以及优劣分析
单例模式因其可以保证资源的重用从能提高性能,所以在 Java EE 中被广泛使用,比如Spring框架中的ApplicationContext类就被设计成单例模式。下面来看看单例模式在Java中的几种实现形式,以及他们的优劣对比。1.懒加载单例模式class Singleton{ private static Singleton instance; public static Singl...
2020-02-14 12:27:39 195
原创 探究Java中的枚举实现原理
Java从JDK1.5开始引入了枚举类型,使用关键字enum来定义枚举类。在一个类的实例固定且数目有限时,可以考虑使用枚举最简单的枚举类型enum WeekDay{ SUNDAY, MONDAY, TUESDAY, WEDSNESDAY, TURSDAY, FRIDAY, SATURDAY;}这里需要值得注意的地方有:定义一个枚举类型主要使用到了关键字enum所有枚举类型对象必...
2020-02-14 10:39:19 187 1
原创 使用HashMap和双向链队列实现LRU算法
一、算法实现import java.util.HashMap;/** * LRU(Least Recently Used):最近最少使用 * 核心思想:最近被访问的数据将来被访问的概率很大——FIFO思想的运用 * 算法描述:(队列越靠近顶部数据越陈旧) * 1、缓存有余时:将数据直接放到队列底部 * 2、缓存用完时: * 1)当缓存中存在待访问的数据时,将该数据移到缓存底部 ...
2019-11-21 14:15:06 783 1
原创 Java整型数据与常量池
众所周知,Java会自动将字符串字面量(如"hello")放到常量池中,但作为整型字面量是否会被放到常量池中呢?下面进行实验实验环境为:Java 1.8.0_212实验一public class Test{ public static void main(String[] args){ // 整型最大值 int i1 = 0x80000000; int i2 = 1; }...
2019-11-05 16:38:44 970
原创 使用Pandas进行独热(One-Hot)编码的理解
Series编码过程将vec看作为一个变量的4次抽样得到向量:查看该变量可以取几种值 num = len(set(vec)),这里num=3;最终的编码结果用num位表示,这里用3为表示:xxx;变量的不同取值按自然顺序(数字大小,字母先后)进行排序:seq = sorted(set(vec));取每次抽样的取值,放到第二步得到的序列中,看该值在序列的哪一位相同,就将该位设置为1,其余...
2019-07-18 15:35:37 1946
原创 Ubuntu下安装MongoDB及其C++驱动
1. 环境cat /etc/issue : Ubuntu 16.04.6 LTSuname -r : 4.15.0-51-genericlsb_release -dc:Description: Ubuntu 16.04.6 LTSCodename: xenial2. 前提查看当前环境是否已经安装MongoDB: apt list --installed ...
2019-06-20 08:54:28 1678 4
原创 单变量基本统计量
单变基本统计量对于数量类型的数据样本X1,X2,X3,…,Xn,其数量统计量的定义如下均值(Mean)方差(Sample Variance)标准差(Standard Deviation)方差和标准差都是描述取样数据的离散(变异)程度,标准差值越大,样本数据离散程度越大,均值的代表性就越低。唯一不同的就是标准差的量纲与样本数据的量纲相同变异系数(Coefficient of Va...
2018-12-30 15:51:08 728
原创 c++ 演示回调原理
#include <iostream>using namespace std;/** @Author:happy @Date:2018-10-24 @Summary:演示回调的基本原理*/// 内部真正实现功能的类的顶级接口class InnerCallBackInterface{ public: InnerCallBackInterface() ...
2018-12-27 21:19:16 173
原创 怎么在Activity中获取在Activity中动态加载的Fragment的组件?
1)将继承的Fragment的一个对象(fragment)定义为继承的Activity的一个属性,在Activity中的onCreate方法中初始化Fragment对象。2)在Activity的Onstart方法中可以通过fragment的getView方法得到fragment的view对象,在通过view对象的findViewById,通过id值就可以获得fragment中的控件了。还有就是...
2018-12-27 20:52:48 5946 5
原创 使用异或(XOR)运算进行加密解密的原理
什么是异或运算异或运算是在二进制数中的一种按维进行计算的逻辑运算符。其真值表为:左操作数右操作数结果000011101110加密过程从上面的真值表中可以看出,我们可以取右操作数(左操作数)当做加密密钥,记为key,取左操作数(右操作数)作为待加密文本,记为message。前提:首先得确保通信发送方和通信接收方都存储了相同的ke...
2018-12-25 10:42:05 18798
自己总结的Linux常用的基本命令
2018-05-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人