自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

张毅的博客

你只管努力,剩下的交给天意

  • 博客(121)
  • 收藏
  • 关注

原创 leetcode 78.不含重复元素数组的子集

题目描述:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。解题步骤:方法一:采用广度优先遍历BFS,从空集开始比如:代码: public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> alllis...

2020-04-23 11:24:41 972

原创 基本的数据结构与实现

一 链表java中有很多集合类底层都是通过链表来实现的。所以我们必须得掌握链表的数据结构。1. 线性表线性表的两种存储结构:顺序存储结构和链式存储结构。• 顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。• 链式存储结构:地址可以连续也可以不连续的存储单元存储数据元素2. 单链表对于链表,里面主要有几个重要的信息,对于每一个节点(比如上一节讲到的A,B,C三处)都...

2020-04-10 21:56:05 416

原创 java虚拟机基础(一)

java虚拟机基础(一)1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?2.java内存区域 ( java7 )2.1 java虚拟机包含了哪些模块2.2 java7内存结构(运行时数据区)2.3 使用例子理解java7内存结构3. java8内存结构3.1 java8的内存结构图3.2 java7到java8的第一部分变化4. 说一下堆和栈的区别?5.一个java对象是...

2020-04-08 22:19:16 357

原创 java集合(二)HashMap源码分析

java集合(二)HashMap源码分析1. HashMap的put方法的具体流程?2.HashMap的扩容操作是怎么实现的?3.什么是哈希?4.什么是哈希冲突?5.HashMap是怎么解决哈希冲突的?6.为什么HashMap中String、Integer这样的包装类适合作为K?7.TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比...

2020-04-07 22:26:26 198

原创 java集合(一)常见问题

java集合(一)常见问题0. java集合框架1. 说说List,Set,Map三者的区别?2. Arraylist 与 LinkedList 区别?3.ArrayList 与 Vector 区别呢?为什么要⽤Arraylist取代Vector呢?4. HashMap 和 Hashtable 的区别5. HashMap 的长度为什么是2的幂次方6. HashMap 和 HashSet区别7. H...

2020-04-06 21:41:33 1085

原创 leetcode刷题常用算法总结

算法(01)常用算法总结一、动态规划1、何时采用动态规划2、动态规划解题步骤2.1 定义状态2.1 状态转移方程二、滑动窗口1. 滑动窗口法用于解决的问题2. 解题步骤三、双指针法1. 双指针模式2. 解题步骤四、堆栈法1、堆栈法2、解题步骤五、快慢指针法1、快慢指针模式2、解题步骤六、哈希表法1、哈希表2、解题步骤七、区间合并法1、区间合并模式2、解题步骤八、循环排序1、循环排序法2、解题步骤:...

2020-04-03 20:12:16 11452 2

原创 短短两年时间,重拾leetcode

互联网寒冬

2022-09-21 17:47:18 268 3

原创 SpringBoot秒杀项目(项目总结)

秒杀系统的项目主要是为了应对高并发的场景,所以在项目主要包含有几个关键的模块:商品模块、用户登录模块、秒杀模块、秒杀安全优化等等。1. 登录模块主要包括了登录密码的加密和分布式session1.1 登陆密码加密用户登录的时候,登录信息由前端传递到后端是通过http协议进行传输的,由于http协议是明文传输的。所有的登录信息都在其body里面,所以将用户的登录密码进行明文传输安全性较低。所以在传输之前,我们在前端需要对password进行加密,通过MD5进行对称加密。整个加密过程分为两次MD5加密

2020-12-14 15:42:48 3722 5

原创 SpringBoot秒杀项目五(秒杀安全优化)

1.优化思路(1)秒杀接口地址隐藏。防止有人恶意秒杀(2)数学公式验证码。也能防止恶意秒杀。并且能够减轻秒杀系统的瞬时流量,减轻并发量。比如:12306的购票需要输入验证码。这样就能将原先瞬间的并发量削减到10s之内。(3)接口限流防刷。限制一个用户1分钟之内只能访问某个接口10次2.秒杀接口地址隐藏思路:秒杀开始之前,先去请求接口获取秒杀地址接口改造,带上PathVariable参数添加生成地址的接口秒杀收到请求,先验证PathVariable(1)在前端点击秒杀抢购的时候,不直接跳

2020-12-14 15:42:37 436

原创 SpringBoot秒杀项目四(秒杀接口优化)

秒杀接口优化1.秒杀接口优化思路秒杀接口优化的核心就是减少数据库访问。系统初始化将商品库存数量加载到redis收到请求redis预减库存,库存不足直接返回,否则直接进入3.好处:如果库存只有10,10个请求以后的所有请求直接返回秒杀失败,直接挡住了很多请求,不会继续往下执行,大大提高了效率。请求入队rabbitMQ,立即返回排队中比如:12306购票的时候,下订单就会返回正在排队中,如果抢购成功就会返回结果。请求出队,生成订单,减少库存客服端轮询是否秒杀成功2.r

2020-12-14 15:42:27 700

原创 SpringBoot秒杀项目三(页面优化)

1.页面缓存为了防止服务器瞬间访问量较大,我们将页面缓存至redis中,redis缓存的过期时间设置为60s,比较短。页面缓存时间不能太长,因为如果太长的话,页面数据发生 变化缓存是不会及时更新的。 @RequestMapping(value="/to_list", produces="text/html") @ResponseBody public String list(HttpServletRequest request, HttpServletResponse respon

2020-12-14 15:42:19 252

原创 SpringBoot秒杀项目二(秒杀功能及测试)

1.数据库设计商品表CREATE TABLE `goods` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商品ID', `goods_name` varchar(16) DEFAULT NULL COMMENT '商品名称', `goods_title` varchar(64) DEFAULT NULL COMMENT '商品标题', `goods_img` varchar(64) DEFAULT NULL COMMENT '商品

2020-12-14 15:42:05 1707

原创 SpringBoot秒杀项目一(登录功能)

1.数据库设计CREATE TABLE `miaosha_user` ( `id` bigint(20) NOT NULL COMMENT '用户ID,手机号码', `nickname` varchar(255) NOT NULL, `password` varchar(32) DEFAULT NULL COMMENT 'MD5(MD5(pass明文+固定salt) salt)', `salt` varchar(10) DEFAULT NULL, `head` varchar(128)

2020-12-14 15:41:49 350

原创 java反射机制和使用

1.什么是反射?有什么用?在java运行过程种,任何一个类,我们都能获得它的属性和方法,任何一个对象我们都能调用它的属性和方法,这种动态获取信息和动态调用对象属性方法的功能被称为java反射机制。总的来说,反射就是将java类中的各种成分映射成一个个的java对象。Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。2.使用我们首先要获取class对象,才能获取该类的所有属性和方法。1.获取class对象的方式(1) 通过

2020-07-17 10:39:55 146

原创 笔试真题

1.华为笔试第3题题目描述:假如有1米和2米的线段若干,现需要拼接成4米的线段,一共有1+1+1+1,1+1+2,2+2, 3种拼接方法。现在需要拼接m米线段,有C1,C2,C3,…线段可供选择,一共有多少种拼接方法。输入:4 1 2 输入描述:第一个值为需要拼接的线段长度,后面的值为可供选择的线段长度输出:3解题思路:看到该题,和上一题有点类似,有点类似于硬币找零的问题,求一共有多少种找零的方法。首先能想到的就是采用回溯法,列举出所有的可能,但是如果m很大的话时间复杂度太高了。我们可以采用

2020-07-16 16:45:22 630

原创 博弈论

我们通常会遇到关于博弈论类似的题目,本文总结了刷题过程中该类型的题目。1. leetcode 292.NIM游戏题目描述:你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。解题思路:由于每次A和B每个人最多能拿3块石头,那么只要满足一个条件即可获胜:A拿了1-3块石头中,只要有一种情况下B都使无法获胜,那么A一定

2020-07-11 21:00:17 339

原创 模板模式

1.模板模式的作用定义一个操作中的算法骨架,而将算法的一些实现步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。2. 模板模式的实现模板模式就是封装了一部分不可变的方法,扩展了一些可变的方法。就是通过抽象类来其实的,子类继承抽象类,对抽象方法进行扩展。2.1 实现 //抽象类 public abstract class TemplateClass{ public void method1() { System.out.println

2020-07-10 11:30:03 352

原创 Java设计模式

java的各种设计模式在粒度和抽象层次上是各不相同的。1.分类java设计模式按其使用的目的分为三类:创建型模式:与对象的创建有关结构型模式:处理类或对象的组合,比如对类或接口的功能进行扩展行为型模式:对类或对象怎样交互和怎样分配职责进行描述,描述一组对象怎样协作完成单个对象所无法完成的任务通常我们的设计模式都有静态和动态的实现方式:静态:类模式处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了对象模式处理对象间的关系,这些关系在运行时刻是可以变化的,通常通

2020-07-10 11:15:40 151

原创 适配器模式

1.什么是适配器模式适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。通过增加一个新的适配器类来解决接口不兼容的问题,也就是使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。2.如何实现简单来说就是在一个适配器接口中调用另外一个类的方法。适配器:adapter(实现目标接口的类)适配者(被适配的对象):adaptee目标接口:target接口2.1 对象适配对象适配器则是通过关联来完成 //被适配器类 pu

2020-07-10 11:04:56 121

原创 redis中的Zset原理

redis中的Zset原理1.Zset2.redis中的zset为什么不使用红黑树而使用跳跃表3. 跳跃表的实现3.1 跳跃表的查询3.2 插入3.3 删除1.Zsetredis中有一个非常重要的数据结构,那就是Zset。它是一个有序集合,也就是说存储的数据是有序的。说到有序集合,很容易就能想到二叉搜索树,比如AVL树、红黑树、B树、B+树这些数据结构。而Zset底层使用的是什么数据结构呢,其实zset使用的是跳跃表(skipList)的数据结构。什么是跳跃表?它其实是一种随机化的数据结构,一个多

2020-06-26 16:00:03 8901

原创 布隆过滤器

布隆过滤器1. 什么是布隆过滤器2.如何实现2.1 原理2.2 实现3. redis中使用布隆过滤器1. 什么是布隆过滤器布隆过滤器实际上是一种特殊的数据结构,它能够在海量的数据中查询一个给定的数据是否存在其中。比如:从1亿的数据中,查询100个数据。这种情况下就可以使用布隆过滤器。此外,布隆过滤器经常用于解决redis的缓存穿透的问题。什么是缓存穿透?就是在高并发的情况下,要查询的某个字段既不存在于redis缓存中,在数据库中也没有,这样所有的请求瞬间全部落在数据库上,导致数据库崩溃。而

2020-06-24 21:39:37 261

原创 Java序列化与反序列化

Java序列化与反序列化1. 什么是序列化?为什么要使用序列化?2. 使用序列化2.1 错误使用示例2.2 正确使用示例2.3 集合中序列化的使用2.3 正确使用进阶3. 总结1. 什么是序列化?为什么要使用序列化?序列化就是将对象的状态信息转换成可以存储或传输的过程。将对象当前状态存储起来。而反序列化就是从存储区将对象重新创建出来。简单来说,序列化就是将对象转换成一个二进制字节流,方便保存到本地或进行网络传输。2. 使用序列化Java io库提供了两个流来实现对象的序列化与反序列化,Object

2020-06-20 13:37:56 206

原创 同步工具类之CountDownLatch

同步工具类之CountDownLatch1.CountDownLatch的作用2.CountDownLatch的使用3.countDownLatch的原理3.1 countDown原理3.2 await原理4.CountDownLatch与CyclicBarrier的区别1.CountDownLatch的作用CountDownLatch的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。 我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师

2020-06-17 22:01:06 277

原创 代理模式

代理模式1.什么是代理模式2.代理模式的使用场景3.代理模式的实现3.1 静态代理3.2 JDK动态代理2.3 cglib动态代理3.总结1.什么是代理模式代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。这样做的好处是: 在不修改目标对象源码的基础上,通过代理可以实现对目标对象进行扩展。简单来说:就是我们通过在某个接口(Interface)的实现类(preClass)的基础上,新建一个代理对象(proxyClass)来实现该接口。该代理对象中调用了p

2020-06-15 20:24:14 169

原创 ReentrantLock可重入锁的实现原理

ReentrantLock可重入锁的实现原理1. Lock接口2. 公平锁和非公平锁的实现2.1 公平锁2.2 非公平锁3.总结首先先介绍Lock接口,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理.1. Lock接口Lock接口,是对控制并发的工具的抽象。它比使用synchronized关键词更灵活,并且能够支持条件变量。它是一种控制并发的工具,一般来说,它控制对某种共享资源的独占。也就是说,同一时间内只有一个线程可以获取这个锁

2020-06-11 21:17:09 1350 3

原创 java集合(三)ArrayList源码分析

java集合(三)ArrayList源码分析1. arrayList的成员变量2.arrayList的构造方法2.1 无参数构造(空数组)2.2 用指定的初始容量构造一个空列表2.3 构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回3. ArrayList扩容3.1 add方法3.2 ensureCapacityInternal方法3.3 ensureExplicitCapacity方法3.4 grow方法进行扩容4. 总结arraylist最主要的就是扩容机制了,我们来看

2020-06-05 15:23:24 154

原创 java多线程基础(二)

java多线程基础(二)1.ThreadLocal1.2 ThreadLocal原理1.3 ThreadLocal 内存泄露问题1.ThreadLocalThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 ThreadLocal 是 JDK java.lang 包中的一个用来实现相同线程数据共享不同的线程数据隔离的一个工具。如果你创建了

2020-06-03 22:05:26 198

原创 单例模式

1. 单例模式1.1 什么是单例模式概念:单例模式确保某个类只有一个实例。1.2 单例模式的使用Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?不信你自己试试看哦~windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。网站的计数器,一般也是采用单例模式实现,否则难以同步。应用程序的日志应用,一般

2020-06-02 21:18:50 216

原创 LRU缓存机制算法实现

一、什么是 LRU 算法就是一种缓存淘汰策略。计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。二、LRU缓

2020-05-21 17:32:58 433

原创 java多线程基础(一)

java多线程基础(一)1.线程的生命周期及五种基本状态1.线程的生命周期及五种基本状态Java线程具有五中基本状态:新建状态(New):当线程对象被创建后,即进入了新建状态,如:Thread t = new MyThread();就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;运行状态(Runni

2020-05-20 21:15:28 300

原创 leetcode 136. 只出现一次的数字

题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?解题思路:方法一:看到该题,第一想法就是采用hashmap的方法去统计每个数字出现的次数。但是由于要求时间复杂度为线性,空间复杂度为O(1),所以哈希表的方法不行。方法二:(错误的方法)其次想到这和以前的一个题目类似,在数组中寻找唯一重复的那个元素。但是由于数组元素的范围是无法确定的,所以无法采用循环排序的思

2020-05-20 17:58:30 203

原创 leetcode 101. 判断对称二叉树

题目描述:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。解题思路:如果我们将1看作根节点root,镜像对称需要满足,root.left的左节点和root.right的右节点相同;并且root.left的右节点和root.right的左节点相同(1)所以我们需要两颗一样的树root来进行遍历。(2)判断递归结束条件,当两颗树有一个为null,返回false(2)比较isSame(root1.left, root2.right)和isSame(r

2020-05-19 16:22:32 224

原创 leetcode 105. 从前序与中序遍历序列构造二叉树

题目描述:根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出解题思路:通过前序遍历我们可以确定出根节点就是preorder[0],通过中序遍历可以确定出左右子树,再依次递归(1)确定递归结束条件:如果当前子树为null,则返回空(2)通过preorder找到根节点preorder[0],去中序遍历中查找根节点的位置。(3)找到该位置,再递归遍历,给根节点root添加左右子树代码: public TreeNode buildTree(int[

2020-05-19 16:02:48 217

原创 leetcode 79. 在二维网格内搜索单词

题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解题思路:由于我们要在二维数组中寻找路径,所以我们可以采用递归的方式,如果当前路径不符合要求,我们进行回退,所以采用回溯法。(1)我们首先遍历数组,确定一个路径开始的位置(2)重写一个函数isExist,来判断重该位置board[i][j]开始走,是否能够找到一条路径(3)isExist

2020-05-14 15:39:54 1878

原创 MyBatis基础

MyBatis基础 1. 什么是MyBatis?2.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?3.Mybatis 的使用场合4.MyBatis编程的步骤?5.MyBatis的工作原理6.为什么需要预编译?7. #{}和${} 的区别是什么?8. Mybatis都有哪些Executor执行器?它们之间的区别是什么?9.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?9.1 什么是延迟加载?9.2 Mybatis延迟加载的原理?10.在mapper中如何传递多个参数?11.

2020-05-13 20:51:16 284

原创 Redis数据库基础(二)

Redis数据库基础(二)1.Redis的过期键的删除策略?2.Redis的内存淘汰机制?3.Redis如何做内存优化?4.Redis事务的概念?5.在redis集群中哨兵的概念?6.什么是redis集群?redis 集群模式的工作原理?7.分布式寻址都有哪些算法?8.Redis 主从架构原理9.redis分区10.Redis如何实现分布式锁?11.分布式Redis是前期做还是后期规模上来了再做好?为什么?12.如何保证缓存与数据库双写时的数据一致性?注意:这里我们一直在强调的redis是单线程,只是在处

2020-05-13 17:26:22 275

原创 SSM秒杀系统(十二)异步订单超时处理

对于用户提交订单后,没有进行支付,我们需要设置一个超时处理方法,比如:超过30分钟,订单自动取消。采用定时任务来实现实现方式:我们采用定时任务实现,每秒钟执行一次,判断是否超时,超时则将订单自动取消,也就是将订单的状态设置为21.超时任务controller层@Controllerpublic class CheckordrertimeoutTask { @Autowired MsoderService msoderService; public void Checktimeoutor

2020-05-11 17:30:22 901 1

原创 leetcode 50. 实现方法Pow(x, n)

题目描述:实现 pow(x, n) ,即计算 x 的 n 次幂函数。解题思路:该题目首先想到就是采用暴力解决的方法,依次乘起来,不过时间复杂度为O(n),并且由于计算的是乘法,所以开销很大。所以会超出时间限制我们可以换一个思路,采用分治的思想,这样时间复杂度就降到了logn ,只需要不断计算x^(n/2)就行了。x^n = x^(n/2) * x^(n/2)如果采用递归来计算,也就是直接采用自顶向下递归,存在冗余计算,x^(n/2)只需要计算一次即可。所以我们需要自底向上的计算方式,可以采

2020-05-11 10:41:45 384

原创 SSM秒杀系统(十一)消息队列RabbitMQ实现异步订单

SSM秒杀系统(十一)消息队列RabbitMQ实现异步订单十五、消息队列RabbitMQ15.1 rabbitMQ的安装与使用15.2 消息队列使用1.订单模块优化--redis缓存2.订单和支付异步处理2.1 将订单信息和支付信息放到消息队列2.2 MS_YF_ORDER项目中处理消息队列,将数据存放到数据库RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的

2020-05-10 17:18:34 3224

原创 leetcode 75. 颜色分类

题目描述:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。解题思路:初始想法就是排序就能解决了,但是题目要求需要常数空间和一趟扫描。所以就想到可以使用快速排序的思想,将大于1的放左边,小于1的放右边就可以了。也就是采用双指针,左右指针,当左指针的值大于1,右指针的值小于1,交换这两个数。比如:[2,

2020-05-10 15:12:45 436

空空如也

空空如也

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

TA关注的人

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