自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(179)

原创 SpringMVC, java, 过滤器, 拦截器, 监听器, Filter, Intercept, Listener

文章目录一.过滤器1.java代码,写个类实现Filter接口(implements Filter)2.在web.xml如下小菜:1.判断是否是Ajax请求2.另外一般出来编码问题的时候会直接在web.xml中加上这段:这个不需要再写java代码,因为它指向的代码是org.springframework.web.filter.CharacterEncodingFilter已经存在的。直接复制可用,无需改动。二.拦截器1.java代码部分,需要一个继承了HandlerInterceptorAdapter抽象类

2020-10-12 15:54:44 81

原创 分布式事务,这一篇就够了

文章目录基础理论事务分布式事务强一致性、弱一致性、最终一致性CAP 原则BASE 理论柔性事务幂等操作分布式事务使用场景转账下单扣库存同步超时分布式事务的解决方案两阶段提交/XATCC本地消息表可靠消息最终一致性尽最大努力通知分布式事务实战两阶段提交/XATCC可靠消息最终一致性本地消息表最大努力通知总结基础理论事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务应该具有

2020-09-16 14:37:24 114

原创 面试之不得不说的数据库索引

文章目录MySQL索引原理索引目的索引原理磁盘IO与预读索引的数据结构详解b+树b+树的查找过程b+树性质建索引的几大原则B+Tree相对于B-Tree有几点不同:索引实战题型一题型二题型三题型四题型五MySQL索引原理索引目的索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者ze开头的单词呢?是不是觉得如果没有索引

2020-09-15 16:52:43 11

原创 详解java锁之java“锁“事

文章目录1. 乐观锁 VS 悲观锁2. 自旋锁 VS 适应性自旋锁3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁无锁偏向锁轻量级锁重量级锁4. 公平锁 VS 非公平锁5. 可重入锁 VS 非可重入锁6. 独享锁 VS 共享锁结语Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍1. 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的

2020-09-14 16:05:40 27

原创 线程安全的List, 从Vector 到 SynchronizedList 到 CopyOnWriteArrayList

文章目录大部分人会脱口而出:用Vector,这样只会让面试官鄙视!除了Vector,你还会别的吗?你至少还得说得上这种:java.util.Collections.SynchronizedList它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性,Syfinal List list;SynchronizedList(List<E> list) { super(list); this.list = list;}nch

2020-09-10 16:27:35 27

原创 彻底搞懂String, 字符串常量池, intern方法

来看一段代码:public static void main(String[] args) { String s = new String("1"); s.intern(); String s2 = "1"; System.out.println(s == s2); String s3 = new String("1") + new String("1"); s3.intern(); String s4 = "11"; System.out

2020-09-09 10:29:39 39

原创 面试: 再看数据库与缓存一致性问题

读取数据库是比较耗时的操作,如果每次都需要去数据库读取数据,会对数据库造成一定的压力,程序性能也会比较低下,所以需要引入缓存。缓存是提升程序性能的最重要、最有效、也是最简单的手段之一。引入缓存后,读操作会先去缓存中看下,如果没有命中缓存,才去读取数据库,然后把读取出来的数据再放到缓存中去,这样下一次读操作就可以命中缓存了,如果命中缓存,就可以直接把数据返回出去了。写操作,除了修改数据库,还需要删除缓存,因为不删除缓存,读的操作读到的永远都是缓存中的旧数据。先删除缓存,后修改数据库这个方案显然是有

2020-09-07 16:41:41 38

原创 面试: 排序算法总结

文章目录排序算法总结一、排序算法种类二、性能比较三、使用场景简单排序算法冒泡排序选择排序插入排序复杂排序算法快速排序归并排序堆排序希尔排序高级排序算法计数排序基数排序桶排序排序算法总结查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还

2020-09-07 14:53:12 40

原创 海量数据面试题

文章目录1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?2. 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。4. 海量日志数据,提取出某日访问百度次数最多的那个IP。5. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.

2020-09-04 15:25:08 122

原创 彻底搞懂 MySQL 事务的隔离级别

MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。文章目录事前准备数据事务并发可能出现的情况脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom)事务的隔离级别读已提交(READ COMMITTED)可重复读(REPEATABLE READ)可串行化(SERIALIZABLE)隔离级别的实现原理查看当前会话隔离级别设置隔离级别事前准备数据mysql> create table city( -> id

2020-09-04 13:46:06 28

原创 Java中创建对象的5种方式

文章目录1.使用new关键字2.使用Class类的newInstance方法3.使用Constructor类的newInstance方法4.使用clone方法5.使用反序列化作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码1.使用new关键字这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和

2020-09-04 10:50:20 32

原创 Java对象的序列化和反序列化, serialVersionUID作用

文章目录一、序列化和反序列化的概念二、JDK类库中的序列化API三、serialVersionUID的作用一、序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化。  把字节序列恢复为对象的过程称为对象的反序列化。  对象的序列化主要有两种用途:  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;  2) 在网络上传送对象的字节序列。在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对

2020-09-04 10:42:47 36

原创 Java 并发编程:volatile的使用及其原理

文章目录一、volatile的作用二、volatile的使用三、volatile的原理一、volatile的作用我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用Synchronized来解决问题。而volatile关键字就是Java中提供的另一种解决可见性和有序性问

2020-09-03 11:03:10 22

原创 Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

一、线程的状态Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。New:新建状态,当线程创建完成时为新建状态,即new Thread(…),还没有调用start方法时,线程处于新建状态。Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源。处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来调度。Running:运

2020-09-03 09:51:13 25

原创 Java 并发编程:Synchronized底层优化, 偏向锁、轻量级锁、 重量级锁、原理与实现

一、重量级锁现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。JDK中对Synchronized做的种种优化,其核心都是为了减少这种重量级锁的使用。

2020-09-02 15:45:18 18

原创 面试之redis事务

MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项:Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 > 在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保证原子性。EXEC命令会触发执行事务

2020-08-20 17:33:55 48

原创 leetcode 33. 搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5,6,7,0,1,2], target =

2020-08-17 17:19:36 17

原创 session和cookie区别

本来 session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。 而 cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。可以认为是 session 的一种后端无状态实现。而我们今天常说的 “session”,是为了绕开 cookie 的各种限制,通常借助 cookie 本身和后端存储实现的,一种更高级的会话状态实现。所以 cookie

2020-08-14 16:49:27 24

原创 面试, Mysql优化, MySQL性能优化的21个最佳实践

文章目录1. 为查询缓存优化你的查询2. EXPLAIN 你的 SELECT 查询3. 当只要一行数据时使用 LIMIT 14. 为搜索字段建索引5. 在Join表的时候使用相同类型的列,并将其索引6. 千万不要 ORDER BY RAND()7. 避免 SELECT \*8. 永远为每张表设置一个ID9. 使用 ENUM 而不是 VARCHAR10. 从 PROCEDURE ANALYSE() 取得建议11. 尽可能的使用 NOT NULL12. Prepared Statements13. 无缓冲的查询

2020-08-03 16:42:42 44

原创 try、catch、finally用法总结

try、catch、finally用法总结:1、不管有没有异常,finally中的代码都会执行2、当try、catch中有return时,finally中的代码依然会继续执行3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不

2020-07-08 17:35:10 69

原创 Oracle 常用系统函数,以及示例

–一.字符型函数----1.ASCII©和CHR(I)函数,字符和ASCII之间的转换SELECT ASCII(‘Z’) Z FROM DUAL;SELECT CHR(90), (32) S FROM DUAL;----2.CONCAT(S1,S2) 函数, S2连接到S1后SELECT CONCAT('Hello ',‘World’) INFOMATION FROM DUAL;----3.INITCAP(S)函数, 将字符串中每个单词第一个字母大写, 单词中其他字母小写SELECT IN

2020-06-18 13:11:27 80

原创 JAVA8十大新特性,lambda表达式详解

一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:interface Formula {double calculate(int a);default double sqrt(int a) { return Math.sqrt(a);}}Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqr

2020-06-02 18:44:58 69

原创 ConcurrentHashMap实现线程安全的底层原理, 1.7和1.8的比较

ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对;Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。Hash...

2020-04-26 09:23:58 166

原创 Redis五种数据类型及应用场景, 原理加图解

一. 五种数据类型图解二. String类型string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。value其实不仅是String,也可以是数字。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据...

2020-04-25 21:01:52 114

原创 微信网页版二维码扫码过程发生了什么

第三方网站应用微信登录技术实现如下:二维码的获得用户打开网站后,网站后台根据微信OAuth2.0协议向微信开发平台请求授权登录,并传递事先在微信开发平台中审核通过的AppID和AppSecrect等参数;微信开发平台对AppID等参数进行验证,并向网站后台返回二维码;网站后台将二维码传送至网站前端进行显示;微信客户端授权登录用户使用微信客户端扫描二维码并授权登录;微信客户端...

2020-04-25 18:04:01 342

原创 设计模式七大原则, 单一职责原则,开闭原则, 里氏替换原则, 依赖倒置原则, 接口隔离原则,合成/聚合复用原则 迪米特原则

1.单一原则(Single Responsibility Principle):一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;a、业务对象(BO business object)、业务逻辑(BL business logic)拆分;2.里氏替换原则(LSP liskov substitution principle):子类可以扩展父类的功能,但不能改变原有父类的功...

2020-04-18 17:42:43 159

原创 盛最多水的容器,LeetCode#11, 双指针

盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。题解: 双指针做法, 分别指向两端, 然后每次移动短的一边指向的, 比如说[1,8,...

2020-04-18 09:48:45 91

原创 String,StringBuffer,StringBuild区别与联系

(1)string 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承。是不可变对象,一旦创建,就不能修改它的值。 3,对于已经存在的Stirng对象,修改它的值,就是重新创建一个对象,然后将新值赋予这个对象 不可改变的Unicode字符序列池化思想,把需要共享的数据放在池中,用一个存储区域来存放一些公用资源 以减少存储空间的开销。在...

2020-04-17 11:22:24 71

原创 HashMap实现原理及源码分析, 面试

一. 实现原理HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。//HashMap的主干数组,可以看到就是一个Entry数组,初始值为空数组{},//主干数组的长度一定是2的次幂,至于为什么这么做,后面会有详细分析。transient Entry<K,V>[] table = (Entry&lt...

2020-04-16 22:03:15 51

原创 数据库重要的五个概念

1. 缓存与数据库一致性问题, 对着个问题深有体会, 这是之前美团面试官的问题, 当时的回答并没有答得多么好, 只说到了先删缓存再修改数据库, 以及线程加锁, 之后写了一篇博客深入学习了下, 分很多种情况, 在先操作数据库还是先操作缓存的问题上通用的是先淘汰缓存再写数据库, 缓存与数据库的操作的架构上的优化主流方案是, 增加一个服务层来向上层屏蔽数据访问与修改的细节., 非主流的是所有写操作走数据...

2020-04-15 08:54:30 107

原创 正则表达式匹配, LeetCode10, 动态规划

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。’.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = “aa”p = “...

2020-04-10 11:38:25 59

原创 红黑树与平衡二叉树的原理和区别

一.平衡二叉树平衡二叉树或者是空树,或者是具有如下特征的二叉排序树:(1 )左子树和右子树的深度之差的绝对值不超过1;(2)左子树和右子树也是平衡二叉树。若将二叉树上结点的平衡因子(Balance F a ctor, BF)定义为该结点左子树和右子树的深度之 差,则平衡二叉树上所有结点的平衡因子只可能觅-1、0和1。只要二叉树上有一个结点的平衡 因子的绝对值大于1 , 则该二叉树就是不平衡...

2020-04-09 16:28:13 944

原创 括号生成,LeetCode #22

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]题解:已用的左括号数一定不小于已用的右括号数, 这样可以剪枝很多, 而且这样得到的序列是满足要求的, 故dfs即可还有一种方式是递推, 动态规划, 合法序列...

2020-04-09 10:09:23 27

原创 面试之HTTPS, HTTP与HTTPS的区别, HTTPS的请求流程

一.Http与https的区别HTTP:超文本传输协议。HTTPS:安全套接字层超文本传输协议HTTP+SSLHTTP:客户端和服务器端传递的是明文的消息。HTTPS:将明文进行加密后再在客户端和服务器之前进行传递。HTTP采用80端口,而HTTPS采用443端口。HTTPS需要申请证书。HTTPS采用非对称加密和对称加密两种加密方式来保证传输信息的安全性:...

2020-04-08 18:34:19 259

转载 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

一. FCFS 调度(先来先服务)磁盘调度的最简单形式当然是先来先服务(FCFS)算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。例如,考虑一个磁盘队列,其 I/O 请求块的柱面的顺序如下:98,183,37,122,14,124,65,67如果磁头开始位于柱面 53,那么它首先从 53 移到 98,接着再到 183、37、122、14、124、65,最后到 67,磁头移动柱面的...

2020-04-08 18:25:33 3152

原创 机器人的运动范围,LeetCode 面试#13, vector 形参前加&, 未加是传值

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少...

2020-04-08 09:11:03 31

原创 笔试选择题相关

1.选择在最近的过去很久未访问的页面予以淘汰的算法称为()。正确答案: BOpt.LRUMFULFUOPT:Optimal page replacement algorithm 最佳页面替换算法。预测哪个页面最晚出现,就替换哪个页面。LRU:Least Recently Used 不要译成“近期最少使用算法”,Recently Used是“最近使用”,Least为否定词,结果...

2020-04-07 18:24:24 124

原创 jvm,java 虚拟机 面试问题集锦

1. java8中的运行时数据区?Java8没有方法区(java7中还存在)的概念了,原来方法区中的内容分配到了堆中和MetaSpace中。程序计数器: 线程切换后能回到正确的执行位置java虚拟机栈: 描述java方法执行的线程内存模型, 每个方法执行时,java虚拟机同步创建一个栈帧本地方法栈: 与java虚拟机栈发挥的作用相似, 区别在于虚拟机栈为虚拟机执行java方法(字节码)服...

2020-04-07 14:31:37 93

原创 岛屿的最大面积,LeetCode #695

岛屿的最大面积给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)示例 1:[[0,0,1,0,0,0,0,1,0,0,0,0,0],...

2020-04-07 11:09:12 71

原创 整数反转,LeetCode#7

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。记录下来的原因完全是没注意最后说...

2020-04-06 10:29:55 39

空空如也

空空如也

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