- 博客(48)
- 收藏
- 关注
原创 HttpServlet响应Web客户端的请求流程
1)Web客户向Servlet容器发送Http请求;2)Servlet容器解析Web客户的Http请求;3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;4)Servlet容器创建一个HttpResponse对象;5)Servlet容器调用HttpServlet的service方法,这个方法中会根据request的Method来判断具体是执行doGet还是doPost,把HttpRequest和HttpResponse对象作为service方法的参数传给Ht
2022-08-30 14:54:38
156
原创 HashMap底层分析
当将元素放到当前位置存在 hash 碰撞时,且元素个数大于 8 个的时候,就会转换为红黑树进行存储。该方法是当链表满足转换为红黑树的条件之后,将当前节点数组转换为红黑树。3、插入非线程安全(哈希碰撞、扩容导致的旧值覆盖问题)1、使用的尾插法进行新键值对的插入。2、插入之后再判断是否需要扩容。...
2022-08-30 14:46:45
182
转载 常见的SQL优化方法
SQL优化的一些方法A、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。B、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from test where number is null可以在number上设置默认值0,确保表中number列没有null值,然后这样查询:select id from t where num = 0C、应尽量避免在 whe
2021-05-31 14:56:21
366
原创 RabbitMQ原理,学习笔记
一、rabbitmq简介1.1 MQ介绍——什么是MQ消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。为什么会产生消息队列?有几个原因:1.不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队
2021-05-20 11:21:57
271
2
原创 Java设计模式——策略模式
概念讲解策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式。策略模式的英文原话是:Define a family of algorithms, encapsulate each one, and make theminterchangeable.意思是:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。策略模式的通用类图如图
2021-05-12 21:25:10
205
2
原创 京东集团------面经
自我介绍,项目经历SpringBoot的启动流程,与Spring的区别spring-boot-starter的作用SQL语句的执行流程从SQL层面和数据库数据存储层面讲一下如何提高查询效率聚簇索引和非聚簇索引索引加到数据字段和字符串字段的执行效率count(*)、count(主键字段)、count(1)三者的执行效率线程的五种状态synchronized的执行流程wait() 与 sleep() 的区别多线程执行synchronized方法阻塞的原理和过程Full GC 和 Yo..
2021-05-12 20:18:48
201
6
原创 携程面经凉经
整数翻转项目经历、实习经历HashMap的底层实现动态规划解决哪些问题、时间复杂度红黑树的特点、时间复杂度、线程安全性左旋右旋七层网络模型以及各自的作用TCP如何保证数据传输的可靠性UDP协议为啥不可靠TCP重试机制volatile解决哪些实际问题常用Linux命令常用的GC算法、回收哪里的垃圾、栈帧中的需要回收吗docker的作用和特点...
2021-05-12 20:10:34
150
原创 Java线程池--------ThreadPoolExecutor
Java线程池导语:在Java中,大家都知道,多线程开发往往都面试中以及工作中经常处理的一类技术难题,而线程池则是我们在开发中,必不可少的并发框架,因为它可以有效的利用线程,使其发挥最大的作用。想要做到这一点,我们应该对于它的原理以及是如何进行工作的,掌握清楚。...
2021-03-10 11:46:48
110
原创 InnoDB中的事务的隔离级别和实现
一、实习经历二、场景题加入有A、B两个账户,现将A账户的1000元转账到B账户上,问具体有哪些方法?方法一、同步代码块这种方法是自己当时回答给面试官的,但是,面试官提出:对单机应用是可以使用的,而对于很多服务来说,其他请求同样执行这样的操作,对于开发者来说的话,无疑增加了代码的冗余度,过于繁琐。方法二、数据库层面这种方法是通过给数据库上锁,来完成转账操作。这里先进行数据库事务与锁相关知识的学习。数据库的事务1、概念事务是对数据库操作的序列,这些序列是不能够被拆开来执行的,要么
2021-03-08 20:03:01
196
原创 InnoDB行锁的算法——Record Lock、Gap Lock、Next-Key Lock
InnoDB存储引擎支持行级锁,那么,对于行级锁的概念,相信大家都能够理解,==就是添加在数据行上的锁,==而对于InnoDB来说,是通过怎样的算法来实现行级锁的呢?A、Record Lock——只在单个行记录上的锁B、Gap Lock——间隙锁,锁顶一个范围,但是不包括记录本身C、Next-Key Lock——Gap Lock + Record Lock,锁定一个范围,同时包括记录本身Record Lock:它总是去锁住索引记录,如果InnoDB存储引擎表在建立时没有设立任何索引,则改存储引.
2021-03-07 21:02:59
428
1
原创 InnoDB中的一致性锁定读、一致性非锁定读
一致性非锁定读是指InnoDB存储引擎根据行多版本控制来读取当前执行数据库中的数据。一、概念分析当线程对数据库中的某行数据进行DELETE、UPDATE操作时,如果该行上面有排他锁(XLock)的存在,则该线程不会等待该锁的释放,而是读取该行的一个快照数据,来完成数据读取。之所以称之为非锁定读,是因为在线程读取数据时,不用等待数据行上锁的释放。二、实际案例测试准备工作:建立两个数据库连接Session,模仿并发访问数据库建立Session A,在该会话中,我们开启一个事务,执行SELE.
2021-03-07 00:40:44
287
5
原创 Redis学习(三)—— 文件事件和时间事件
1、Redis服务器是一个事件驱动程序,服务器处理的时间分为时间事件和文件事件2、文件事件处理器是基于Reactor模式实现的网络通信程序。3、文件事件是对套接字操作的抽象:每次套接字变为可应答(acceptable)、可写(writable)、可读(readable)时,相应的文件事件就会产生。4、时间事件分为定时事件和周期性事件5、服务器一般情况下,只执行serverCron函数一个时间事件,而且这个事件是一个周期性事件6、文件事件和时间事件之间是合作关系,服务器会轮流执行这两种事件
2021-01-29 22:55:33
279
原创 Redis学习(二)—— AOF持久化
1、AOF文件通过保存修改数据库的写命令请求来记录服务器的数据库状态所有命令都是以Redis命令请求协议的格式进行保存。2、命令请求会先保存到AOF缓存区中,之后再定期写入并同步到AOF文件中。3、appendfsync选项的不同值会对AOF持久化的安全性和服务器的性能造成很大程度的影响4、服务器在加载AOF文件时,是通过重新执行其中的请求命令进行还原数据库的状态5、AOF重写会产生一个新的AOF文件,只不过相比之下,体积更小6、AOF重写是通过读取数据库中得键值对来实现的,程序无需
2021-01-28 12:29:11
125
原创 Redis学习(一)——RDB持久化
文章目录概括1、RDB持久化的概念该功能是将Redis内存中的数据库状态保存到磁盘中,避免数据意外丢失。2、RDB文件它是经过压缩的二进制文件,有多个部分组成,用于保存和还原Redis服务器所有数据库中的所有键值对。RDB文件结构REDIS:是一个常量值,占用了五个字节,通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否RDB文件。db_version:占用4字节,它的值是一个字符串表示的整数,这个整数记录了RDB文件的版本号,例如:0006表示RDB文件第六版datab
2021-01-22 17:43:37
112
1
原创 面试终结者——“红黑树”实现原理
红黑树(Red Black Tree)是一种自平衡的二叉搜索树,(也叫二叉查找树,该树的结构特点是左子树的键值总小于根节点的键值,右子树的键值总大于根节点的键值),以前也叫平衡二叉 B 树(Symmetric Binary B-Tree)。预备知识树的知识结构图,大致如下所示:平衡二叉搜索树平衡二叉搜索树,英文简称BBST,经典常见的有AVL树和红黑树。1、二叉搜索树,是二叉树的一种,英文简称BST,前文有介绍过。2、平衡:就是说当节点数量固定时,左右子树的高度越接近,这棵二叉树越平.
2020-12-21 22:37:54
547
原创 Linux操作系统中的五种IO模型
自己最近看到了IO模型,自己找了部分资料,进行了下面的总结,便于日后的学习回忆和知识的巩固,希望也能够帮助到你们,大家一同学习,一同探讨问题。我们都知道,在Java中,主要有三种IO模型,它们分别是阻塞式IO(BIO)、非阻塞式IO(NIO)、异步IO(AIO)。这部分内容,这里有另外一篇文章中进行了知识要点的总结,大家可以去搂一眼。Java面试常考的 BIO,NIO,AIO 总结我们这篇文章主要针对Linux操作系统的IO模型进行简要的说明,对于Java语言层面的IO模型和Linux中的IO模型.
2020-12-21 00:00:52
339
1
原创 Java对象存活的判断方法(引用计数、可达性分析)
判断对象是否仍在存活谈起对象回收,大家可能脑海中都哦会浮现出自己对于各个收集算法的理解和不同的感悟,以及该各个收集算法的区别,我呢,也进行了简要的总结,大家可以看看下面这篇文章,对于其中内容进行点评指正,我们一同学习:JVM中经典的垃圾收集算法但是,回收对象的问题解决了, 那么该如何去找到这个对象呢?也就是说,在Java堆中,同时包括新生代,老年代,我该如何去进行可回收对象的标记呢,这就是这篇文章,我们来探讨的问题了:引用计数法通俗的理解,引用计数法可以根据字面意思理解为:我们可以在一个对象中添加
2020-12-19 00:01:56
578
原创 C语言实现二叉树的各种递归非递归遍历(前序、后序、中序、层级遍历)
二叉树遍历#include <stdio.h>#include <stdlib.h>#define NULL 0#define M 100//定义结构体 // 定义一个用于存储节点的二叉树,用于数据的存储,和后面遍历取值 typedef struct node { int data; int count;//count是为了计数用。在后序遍历中,子树的根节点在第一次遍历的时候不会输出,只有在第二次遍历的时候才输出。 struct node *l
2020-12-15 22:03:46
715
原创 子类和父类中方法调用问题总结
昨天晚上,自己在牛客网上刷了一道关于父类子类方法引用的问题,当时感觉很蒙蔽,已经上床了,就带着问题直接睡了,今早起来,把问题复现,自己又深入的了解了一下,打算记录一下这次收获的东西,希望能够帮助到大家。问题原文public class Test { public static void main(String[] args) { System.out.println(new B.getValue()); } static class A { .
2020-12-12 22:14:30
2319
原创 JVM运行时数据区域和各区域特点
JDK、JRE的区别JDK:Java程序设计语言、Java虚拟机、Java类库JRE:Java类库API中的Java SE API子集、Java虚拟机运行时数据区域JVM在程序运行时,会将自己管理的内存空间分为一下几个区域,实现内存的高效利用。每个区域各自的用途都不尽相同,所以它们的创建时间和销毁时间也有所不同,有些跟着虚拟机进程来创建销毁,有的则根据用户线程进行创建和销毁。根据《Java虚拟机规范》,将内存划分为一下几个运行时数据区域:接下来我们来看看,具体每一个区域的作用和它们锁存储的
2020-11-30 20:52:01
141
原创 SpringCloud微服务实战——服务降级处理过程分析
最近自己看到了SpringCloud微服务实战的Hystrix这一块,就简单的将这一块中的服务降级跟大家说一说。Hystrix的概念以及其作用断路器模式源于Martin Fowler的Circuit Breaker一文中。断路器本身是一种开关装置,用于在电路撒谎给你保护线路过载,当线路中有电器发生短路时,该装置能够及时切断故障电路,很好的保护其他电路不受影响。应用到微服务这一块,主要解决的是由于网络延迟等各种故障原因,让服务请求进行降级处理,让服务更加具有容错性。Hystrix服务降级原理分析这
2020-11-29 22:42:47
513
原创 常用Linux命令手册,持续更常用
硬链接和软链接ls -i #查看文件的inodeln fileName hard_link_name #给 fileName 创建对应的硬连接 hard_link_nameln -s fileName soft_link_name #给 fileName 创建对应的软连接 soft_link_name字符处理ls -l /etc/init.d | more #使用管道可以使得 | 之前的命令输出的内容作为该符号之后命令的输入#搜索文本grep [-icnv] '需要匹配的字符串' f
2020-11-20 00:51:51
158
原创 volatile关键字的内存语义
volatile关键字的理解当我们声明一个变量为 volatile 时,程序对于该变量的读和写就会变得十分特别,具体的特别之处,我们还是要看看 volatile 关键字的内存语义,观察其特别之处。下面是一个简单的例子,通过这个例子我们来具体说明 volatile 关键字的内存语义class VolatileFeatures { volatile long value = 0L; pulbic void set(long val) { value = val; } public void
2020-11-17 21:54:58
158
原创 happens-before原理简介
由来和具体概念从JDK5开始,JSR-133使用 happens-before 来实现变量的内存可见性问题。在JMM中,如果一个操作执行的结果需要对另外一个操作可见,那么二者必定要存在 happens-before 关系。与开发人员密切相关的 happens-before 规则1、程序顺序规则:一个线程中的每个操作,happens-before 于该线程中的其他任意后续操作。2、监视器锁规则:对于一个锁的解锁,happens-before 于对该锁的加锁。(有锁才能解锁)3、volatile 变
2020-11-17 21:52:20
632
原创 相同二叉树、对称二叉树的判断
给定两颗二叉树,判断这两颗树在结构上是否相等。示例如下:贴出自己的实现//对应节点class TreeNode { int val; TreeNode left; TreeNode right; TreeNode (){} TreeNode (int val) { this.val = val; } TreeNode (int val, TreeNode left, TreeNode right { this.val = val; this.left = left;
2020-11-10 01:46:59
115
原创 Redis的五种对象类型
基本概念Redis是一个基于内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持五种常见的对象类型:字符串(String)哈希(Hash)列表(List)集合(Set)有序集合(Zset)对象类型与编码Redis 使用对象来存储键和值,在Redis中,每个对象是由redisObject结构表示。redisObject结构主要包含三个属性:type、encoding 和 ptr。typedef struct redisObject { //记录对象数据类型 un
2020-11-08 15:20:42
574
转载 HashMap底层——解决Hash冲突(开放地址法)
开放地址法1、Hash函数Hash函数就是将任意长度的输入转化成固定长度的输出的一类函数举例说明比如说我的输入是任意一个自然数(0,1,2,3…),而我要求经过一个函数后我的输出的数的范围要在0-9这样一个范围之间。很容易想到,我们可以使用Hash函数:key就是输入;在哈希表(散列表)里,Hash函数的作用就是将关键字Key转化为一个固定长度数组的下标,以便存取键值对<Key,Value>Hash冲突解决的两个办法链地址法.开放地址法所谓开放地址法就是发
2020-08-26 13:07:17
2581
转载 HashMap底层——解决Hash冲突(链地址法)
1、链地址法次日清晨,大臣们按时上朝,接着讨论昨日的话题。“昨日Hash函数的选择我们已经有了具体的方案了,那就只剩下冲突的解决问题了”,王大臣率先发话。“要解决冲突其实也不难,既然会有多个元素被Hash到同一个位置,而这个位置只能存储一个元素,那么我让这个位置可以存储多个元素不就可以了吗?”,何大臣说道。“哦,怎么个弄法?”王大臣问道。“用链表啊,来一个元素加一个,让这个位置存储一个指针,指向一个链表,让所有相同位置的元素都放在这个链表中”,何大臣回答道,接着又画了一个图。“在存储的时候,如
2020-08-26 12:44:11
4220
13
转载 HashMap底层——Hash函数及其设计
1、查找速度的困扰算法国自建立起,就以快速为至高的荣誉,O(n^2) 时间复杂度的设计常常被人嫌弃,一般都想着弄个O(logn)。算法国最近遇到了一个问题,就是随着处理数据的逐步增大,查找的时间越来越大了。之前用的数组和链表,最后改成二叉查找树,可是这些都需要和其中的元素进行比较,比较的次数越多,查询的速度就越慢。国王想着能不能有一种办法,查找某个元素的时候,不需要比较,直接就得到这个元素,时间复杂度直接就为O(1),和集合中的元素个数就没有关系了。2、初次的方案国王召集各大臣讨论此事“如果不
2020-08-26 11:43:28
402
原创 微服务之SpringCloud(一)——Eureka服务治理组件
Spring Cloud——Eureka底层源代码解析基础概念Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。主要模块构建服务注册中心服务注册与发现Eureka的基础架构Eureka的服务治理机制Eureka的配置源码解析1、属性加载过程准备工作,搭建起一个基础架构,通过引入依赖,文件配置,开启启动类注解这三步的类似操作,进行服
2020-08-14 01:43:58
186
1
原创 Mybatis基础概念+缓存机制原理图解
Mybatis缓存机制默认情况下,Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存指 SqlSession 级别的缓存,当同一个 SqlSession 中进行相同的SQL语句查询时,第二次以后的查询就不会从数据库中查询,而是直接从缓存中获取,一级缓存最多缓存1024条 SQL。二级缓存指可以跨SqlSession的缓存,是 mapper 级别的缓存,对于 mapper 级别的缓存,不同的 SqlSession 是可以共享的。一级缓存原理(SqlSe
2020-08-06 00:34:07
384
原创 JVM中经典的垃圾收集算法
分代收集理论由于当今商业虚拟机的垃圾收集器,大多遵循“分代收集”这一理论,而他时间里在两个假说之上:弱分代假说 绝大多数对象都是朝生夕灭的。强分代假说 熬过越多次垃圾收集过程的对象就越难以消亡。根据这两则假说,开发者奠定了多款常用垃圾收集器的一致设计原则收集器应该将 Java 堆划分为不同的区域,然后根据回收对象根据它的存活年龄来分配到不同的区域之中进行存储。现在设计者都会将 Java 堆设计成新生代,老年代两个区域。标记 - 清除算法该算法根据其名称就可以猜测出它的执行原理。首先对于
2020-07-26 10:22:42
143
原创 JVM中几种经典的垃圾收集器
Serial 收集器该收集器是最基础、历史最悠久的收集器,是一个单线程工作的收集器,是在客户端模式下的默认新生代垃圾收集器,并不是说他只会使用一个处理器或者一条收集线程去完成垃圾收集工作,侧重强调当它进行垃圾收集时,必须暂停其他所有工作线程,直至它收集结束。优点简单高效(在单线程下相比较)额外内存消耗最小不足之处用户线程由于垃圾收集而导致的停顿需要进一步提升ParNew 收集器该收集器是Serial收集器的多线程并行版本,除了使用多条线程进行垃圾收集之外,其余行为完全包括了Serial收
2020-07-26 09:36:56
197
原创 基于Java的AtomicInteger类实现原子操作
原子的本意是:“不能被进一步分割的最小粒子”,而原子操作的意思是:“不可被中断的一个或者一系列操作”。首先先说说处理通过怎样的方式实现了原子操作:使用总线锁保证原子性首先,我们应该明白什么是总线锁总线锁:使用处理器提供的一种LOCK #信号,当一个处理器在总线处理一个变量时,其他处理器的请求被阻塞,正在处理当前变量的处理器独占共享内存。1、方法提出背景当多个处理器对同一个共享变量进行读改写操作时,共享变量会被多个处理器同时操作,不能够保证操作的原子性。举个例子,有一个共享变量 i 现在要进行
2020-07-23 13:29:14
245
原创 反转链表(代码+图解)
反转链表反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL代码public ListNode reverseList(ListNode head) { ListNode prev = null; //定义一个前置节点 ListNode curr = head; //将head所指向的节点进行标记 while (curr !=
2020-07-23 00:39:45
501
原创 给定一个非负索引K,K <= 33,返回杨辉三角的第K行(LeetCode 杨辉三角 || )
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。关于杨辉三角的结构特点,在这里不做过多赘述,请大家自行百度获知。代码实现class Solution { public static List<Integer> getRow(int rowIndex) { //定义一个可以装入List的List集合 List<List<Integer>> result = new ArrayList<>();
2020-07-22 08:36:34
687
原创 对于RestFul编码风格的理解
Resultful风格:GET 用于查询资源POST 用于创建资源PUT 用于更新服务端的资源的全部信息PATCH 用于更新服务端的资源的部分信息DELETE 用于删除服务端的资源...
2020-07-07 15:31:23
331
原创 面试总结
最近自己参加了深圳某公司的面试,将面试官提出的问题以及自己的理解贴出来,便于日后学习、巩固知识。问题一:了解单例模式吗?讲讲它的实现方法?回答:单例模式是Java设计模式的一种,谈及设计模式,它是程序员在软件开发过程中,为了解决一些问题而提出的最佳解决方案,主要分为1)创建型模式单例模式、原型模式、工厂...
2020-02-05 14:43:23
135
原创 Java内部类的使用方法
自己将Java内部类的理解跳出来,自己日后忘记了,再翻出来看看。Java内部类分为静态内部类、成员内部类、局部内部类、匿名内部类public class OuterClass { //私有静态变量 private static int radius = 1; private static String out_b = "outer priv...
2020-02-02 19:49:10
139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人