自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 设计原则思想

设计原则思想

2022-09-20 08:10:14 173 1

原创 设计原则与思想:面向对象

如何面向对象编程

2022-09-14 08:11:45 236

原创 quic rfc 9000

quic rfc 9000中文版

2022-07-12 22:32:14 662

原创 代码整洁之道-梳理

代码整洁之道

2022-07-06 21:31:01 1135

原创 nginx请求的11个阶段

nginx请求的11个阶段

2022-06-30 07:34:37 1916

原创 IP协议解析

IP层协议介绍

2022-06-16 08:04:03 2631

原创 Nginx架构基础

Nginx架构基础

2022-06-12 20:39:14 931 2

原创 HTTP3协议

iquic抓包详解

2022-06-10 22:00:42 1028 1

原创 HTTP2协议

http2协议介绍

2022-06-06 07:32:47 2540 1

原创 JAVA进程与线程

1.概念1、程序: 是选择一种编程语言,完成一个功能/任务,而编写的一段代码,这段代码最后被编译/解释为指令。 程序是一组指令的集合。 程序是静态的。当我们电脑、手机安装了一个程序之后,只是占用硬盘/存储卡的空间。2、进程: 一个程序的一次运行。 当程序启动后,操作系统都会给这个程序分配一个进程的ID,并且会给他分配一块独立的内存空间。 如果一个程序被启动了多次,那么会有多个进程。 多个进程之间是无法共享数据。 如果两段代码需要进行数据的...

2022-05-31 07:34:10 411

原创 JAVA异常概述

1.什么是异常?程序在正常情况下是可以运行的,只是在遇到一些特殊情况的时候,导致程序中断/崩溃。特殊情况:用户的非法输入,用户的磁盘空间已满,要读取的文件不存在,网络中断。2.异常的类型1)异常类型的根:java.lang.Throwable,Throwable作为类的根仍然为Object。只有当对象是此类或者其子类之一的实例时,才能通过Java虚拟机或者Java throw语句抛出。类似地,只有此类或其子类之一才可以是catch子句中的参数类型。2)Throwable有两大

2022-05-25 07:47:22 188

原创 Collections工具类

/*Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法:* public static <T> boolean addAll(Collection<? super T> c,T... elements)将所有指定元素添加到指定 collection 中。* public static <T>.

2022-05-23 22:49:21 389

原创 List集合

目录自定义动态数组Vector和ArrayListList接口的实现类有很多,常见的有:ArrayList:动态数组Vector: 动态数组LinkList: 双向链表Stack:栈自定义动态数组package com.atguigu.list;import java.util.Arrays;import java.util.Iterator;/*MyArrayList模仿ArrayList动态数组类的实现。MyArrayList是一个容器,是一个

2022-05-23 07:39:58 137

原创 Map集合

1.collection和map的区别?collection表示的是一组对象 Map表示的一组键值对(key, vaule) Map特点:key不允许重复,value允许重复 如果key重复了,后面的value会覆盖前面的value2.Map的方法1)添加V put(K key, V value)void putAll(Map<? extends K, ? extends V> m)2)删除void clear()V ...

2022-05-23 07:37:55 292

原创 Netty面试难题分析

Netty是如何解决JDK中的Selector BUG的? 背景:调用Selector方法后,会阻塞住,获取上面发生的事件,在JDK 1.6版本开始,在linux内核2.2版本开始,当网卡发生一个变化(并不是有数据发生),就会唤醒selector。 但是selector只会关注连接,接受连接,读和写事件,被唤醒的事件不是selector所要的事件,这样获取不到事件,这样就会反复去取,空轮训。 解决办法:Netty中当空轮训次数达到N次的时候,认为进入了Selector Bug,就将se...

2022-05-18 07:42:44 148

原创 Netty使用和常用组件辨析

第一个Netty程序Bootstrap(启动类),EventLoop(Group)(线程,事件循环处理),Channel(socket, socketchannel) 事件和ChannelHandler(处理事件),ChannelPipeline ChannelFuture(获取异步结果) 客户端和服务器编程的时候,需要关注客户端是使用.handler添加处理,而服务器是使用.childhandler。因为serversocketchannel,仅仅是接受连接,主要通过子的socketch..

2022-05-18 07:13:04 446

原创 Spring AOP基础

目录1.AspectJ注解驱动2.编程方式实现AspectJ代理3.@AspectJ PointCut指令与表达式4.API实现Pointcut5.@Around和@Pointcut有区别吗?6.@AspectJ后置动作7.XML配置After Advice8.API实现三种After Advice1.AspectJ注解驱动激活AspectJ模块 1.注解激活:@EnableAspectJAutoProxy 2.XML配置: <aop:aspect.

2022-04-29 08:03:25 655

原创 SpringAOP总揽

1.AOP概念:ASPECT、JOIN POINT和ADVICE如何理解?a.形象理解为:ASPECT是一个Class类,而Join points具体到某个要执行的点上,相当于是一个方法,Pointcnt是一个匹配Join points的条件,advice即为@before,@Around等.b.ASPECT->N个Join points->N个advice ,即他们的对应关系为1对N对N。2.JAVA AOP设计模式代理模式:动态代理和静态代理 判断模式:类、方法、注

2022-04-20 07:45:03 236

原创 Spring之AOP底层源码解析

前奏:cglib的反向代理public static void main(String[] args) { UserService target = new UserService(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(UserService.class); enhancer.setCallbacks(new Callback[]{new MethodInterceptor() { @Ove

2022-04-20 07:33:56 221

原创 Spring之配置类源码深度解析

代码走读AnnotationConfigApplicationContext->refresh->invokeBeanFactoryPostProcessors->invokeBeanFactoryPostProcessors// Invoke factory processors registered as beans in the context.// BeanFactory准备好了之后,执行BeanFactoryPostProcessor,开始对BeanFactory进行处理

2022-03-29 08:10:41 267

原创 Spring之启动过程源码解析

代码走读AnnotationConfigApplicationContext->refresh->prepareRefresh->1.getEnvironment().validateRequiredProperties();主要是校验环境变量配置信息,有哪些必须的key没有,那么就会报错2.监听器相关的,后面回过头记录笔记AnnotationConfigApplicationContext->refresh->obtainFreshBeanFactory->

2022-03-28 08:05:20 346

原创 Spring之推断构造方法源码解析

1.前奏1.默认情况,用无参的构造方法,或者只有一个构造方法那就用那一个2.程序员指定了构造方法的入参值,通过getBean()或者BeanDefinition.getConstructorArgumentValues()指定,那就用所匹配的构造方法3.程序员想让Spring自动选择构造方法及构造方法的入参值,autowire="constructor"4.程序员通过@Autowired注解指定了某个构造方法,但是希望Spring自动找该构造方法的入参值针对第二点:推断构造方法流程:

2022-03-26 08:17:12 277

原创 Spring之循环依赖底层源码解析

1.依赖注入的时候,首先会根据beanName进行缓存,当需要注入的时候,首先会去缓存中查找,如果查找到对应的beanName,就会调用getBean,进行Bean创建。(字段的注入点和方法的注入点实现的方法不一样,是两个cache表示的,所以如果通过方法和字段两种方式同时注入同一个对象的时候,那么不会有缓存的操作)2.根据第一点,为什么缓存的是beanName呢?而不是Bean对象呢。因为如果缓存的是Bean对象,那么依赖注入的类如果是原型的话,每次注入的就是单例了,这样不符合原型的概念。3.

2022-03-25 07:51:27 217

原创 Spring之依赖注入源码解析

Spring中到底有几种依赖注入的方式?首先分两种:手动注入 自动注入doCreateBean->populateBean->autowireByName->unsatisfiedNonSimpleProperties->中的PropertyDescriptor在自动注入的时候,有一定的条件,就是属性必须有对应的set和get方法手动注入在XML中定义Bean时,就是手动注入,因为是程序员手动给某个属性指定了值。<bean name="userServ

2022-03-23 22:03:12 1146

原创 Spring之Bean生命周期源码解析

1.启动接口介绍具体的流程图:Spring扫描底层流程 | ProcessOn免费在线作图,在线流程图,在线思维导图 | AnnotationConfigApplicationContext接口主要做了两件事情:1.scan 2.加载非懒加载的spring对象 68和70行是java中的JFR机制,相当于查看69行代码执行的黑盒子(耗时,性能等) ClassPathBeanDefinitionScanner接口主要是把扫描到的BeanDefinition注册到spring容器中

2022-03-21 07:53:29 918

原创 c语言中offset和container_of宏的讲解

1.offset宏的讲解# define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)1)((type *) 0) =》0地址强制转化为type类型的指针;2) ((type *)0)->MEMBER =》 访问type结构中的MEMBER数据成员3) &(((type *)0)->MEMBER) =》去除type结构中数据成员member的地址4) (size_t)(&(((type *

2020-11-25 14:41:13 718

原创 c语言位数组(基于linux内核代码引发的思考)

首先来看一下linux内核代码,如下:#define BIT_PER_LONG (CHAR_BIT * sizeof(unsigned long))#define BIT_MASK(idx) (1UL << ((idx) % BIT_PER_LONG))#define BIT_WORD(idx) ((idx) / BIT_PER_LONG)/* Helpers */static inline void __set_bit(unsigned idx, unsigned long *bm

2020-11-24 20:17:19 384

原创 c中形参修改值问题(指针传递和值传递)

首先,写代码的时候,写出类似如下的代码,最后出现了段错误:#define SIZE 10void EncryptUpdata(int *ctx){ ctx = (int *)malloc(sizeof(int) * SIZE); return;}int main() { int *ctx = NULL; EncryptUpdata(ctx); UseCTX(ctx); return 0;}写出这样的代码,主要是对函数参数传递的本质没有很深的了解。最关键的一点就是,永远要记住,形

2020-11-11 16:34:21 1484

原创 shell中的info和error

function __tee { tee -a $@}function logInfo(){ echo -e "`date '+[%Y-%m-%d %H:%M:%S]'` Info: $@" | __tee XXX.log}function logErr(){ echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'` Error: $@\033[0m" | __tee XXX.log exit 1}

2020-11-10 16:48:22 1814

原创 数据报文如何从网卡到应用层

前面的物理层和数据链路层先不介绍。此处通过IPv4进行介绍1.进入网络层首先看ip头结构:struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) // 小端 __u8 ihl:4, // 首部长度(4位):首部长度指的是IP层头部占32 bit字的数目(也就是IP层头部包含多少个4字节 -- 32位),包括任何选项 version:4;

2020-10-22 10:23:06 847

转载 C++深拷贝和浅拷贝有什么区别,如何使用?

题目: 深拷贝和浅拷贝的区别是什么?你会如何使用它们?解答: **浅拷贝不复制数据,只复制指向数据的指针,因此是多个指针指向同一份数据。 深拷贝会复制数据,每个指针指向一份独立的数据。**通过下面的代码可以明显看出他们的区别:struct Test{ char *ptr;}void shallow_copy(Test &amp;src,Test &amp;dest){ ...

2018-08-23 15:07:13 1451

转载 C++浅谈哈希表和STLmap

题目: 对比哈希表和STL map。哈希表是怎么实现的?如果输入数据规模不大, 我们可以使用什么数据结构来代替哈希表。解答: 对比哈希表和STL map 在哈希表中,实值得存储位置由其键值对应得哈希函数值决定。因此,存储在哈希表中得值是无序得。在哈希表中插入和删除的时间复杂度都是o(1)。实现一个哈希表,冲突处理时必须的。对于STL中的map,键/值对在其中是根据键进行排序的。它使用...

2018-08-23 10:42:58 1330

转载 C++函数指针

函数指针是指向函数的指针变量。c在编译的时候,每一个函数都有一个入口地址,该入口地址就是函数指针指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。 函数指针有两个用途:调用函数和做函数的参数。函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关: bool length_compare(const st...

2018-08-14 10:46:49 169

转载 互联网协议入门1

一.概述 1.1五层模型 分别为:物理层,链路层,网络层,传输层,应用层二.物理层 它就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。三.链路层 3.1定义 单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义? 这就是”链接层”的功能,它在”实体层”的上方,确定了0和1的分组方式。3.2以太网协议...

2018-08-13 14:38:17 104

转载 C++解析char *p与char p[]

首先来看一道题目:#include "stdio.h"char *get_string_1(){ char p[] = "hello world!"; return p;}char *get_string_2(){ char *p = "hello world!"; return p;}int main(){ char *p; ...

2018-08-08 09:51:30 1595 2

转载 C++重载操作符的函数定义 详细解读

重载操作符的函数定义为什么一定是如下的形式呢?ostream &amp; operator &lt;&lt; (ostream &amp; output, const ClassType &amp; object){ output &lt;&lt; ... ... return output;}这里有三个问题: 1)函数返回类型为什么是引用? 2)第一个参数...

2018-08-04 16:51:21 212

转载 C++成员在类中的偏移量 & 类成员指针

首先来看一道编程题:写出输出的结果#include &lt;stdio.h&gt;class A{public: A() {m_a = 1; m_b = 2;} ~A() {} void fun() {printf("%d %d", m_a, m_b);}private: int m_a; int m_b;};class B{publ...

2018-08-03 10:42:56 2011

转载 C++中map的操作及基本用法

一.Map简介 Map是STL的一个容器,它提供一对一的hash。 1)第一个可以称为关键字(key),每个关键字只能在map中出现一次。 2)第二个可为关键字的值(value)。Map以模板(泛型)方式實現,可以儲存任意類型的變數,包括使用者自定義的資料型態。Map主要用於資料一對一映射(one-to-one)的情況,map內部的實現自建一顆紅黑樹,這顆樹具有對數據自動排序的功能。...

2018-08-02 11:31:37 358

转载 C++STL常见面试题1

1.说说vector的底层(存储)机制。 vector就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据的时候,会自动申请另一片更大的空间(一般是当前容量的百分之50),然后把原来的数据拷贝过去,接着释放原来的空间。2.说说list的低层机制 以节点为单位存放数据,节点的地址在内存中不一定连续。每次插入或删除一个节点,就配置或释放一个元素空间。3.什么情况下用v...

2018-08-02 11:21:51 444

转载 C++前置声明的应用与陷阱

一.前置声明的使用 有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:// A.h#include "B.h"class A{ B b;public: A(void); virtual ~A(void);};//A.cpp#include "...

2018-08-01 08:54:11 445

空空如也

空空如也

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

TA关注的人

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