自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Happy博客

勤学如春起之草,不见其长,日有所增;辍学如磨刀之石,不见其损,必有所亏。

  • 博客(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

原创 Java 类加载器

类加载器可以说是Java语言的一项创新,让应用程序自己决定如何去获取所需的类的二进制字节流。

2024-01-28 17:24:11 866

原创 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 &lt;iostream&gt;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常用的基本命令

64个常用的Linux命令。格式为: ls(LiSt):目录处理命令——显示目录文件 1)语法:ls [-ald] [文件或目录] 1、-a:显示所有文件(普通文件+隐藏文件) 1)隐藏文件一般是系统文件,建议用户不要轻易操作隐藏文件 2)Linux隐藏文件的格式为:.file_name 2、-l(long):显示每个文件的详细信息(文件类型+权限/引用系数(硬链接/软链接)+所有者+所属组+文件大小[字节]+文件最后被修改的时间+文件名) 3、-lh:人性化(human)显示每个文件的详细信息——文件大小单位不只是[字节],为了方便用户,单位可以为[K]、[M]、[G]等 3、-d(directory):显示目录本身,而不显示目录中的文件 4、不加参数:表明ls操作的是当前目录 5、用户与文件的关系 1)所有者(U):创建文件的用户(只能是一个用户),但是所有者的身份也是可以发生变化的 2)所属组(G):所有者的授权 3)其它人(O) 6、-rw-r--r--:(10个字符) 1)第1个字符:-(二进制文件)、d(目录)、l(软链接) 2)第1至4个字符,表示U的权限 3)第5至7个字符,表示G的权限 4)第8至10个字符,表示O的权限 5)意义:该文件的所有者有(读写权限),所属组有(读权限),其它人有(读权限) 7、操作文件的权限 1)r:读 1、对于文件:可查看文件内容(cat/tac/more/less/head/tail) 2、对于目录:可以列出目录中的内容(ls) 2)w:写 1、对于文件:可以修改文件内容(vim) 2、对于目录:可以在目录中创建、删除文件(mkdir/rm/rmdir/touch) 1)一个文件是否可以某个用户被删除,要看该用户对该文件 所在目录 是否有 w权限,而不是对该文件有 w权限 3)x:执行——最高权限 1、对于文件:可以执行文件(命令/脚本) 2、可以进入目录 4)-:表示没有该权限 8、-i:显示每个文件的 i结点

2018-05-13

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除