- 博客(38)
- 收藏
- 关注
原创 进制转换题
1:0x前缀可有可无,所以可以先用startsWith(“0”)判断字符串是否需要切割前两位。3:前一位字符需要比后一位多乘一次16 => A * 16 * 16 + A * 16。2:Integer.parseInt(“A”,16) 可以直接把字符转为16进制。写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。所以可以用顺序从前往后循环,每循环一次就把前面的值乘16。输入0xAA 得到 170。
2023-03-23 18:16:29
246
原创 HandlerInterceptor
简单介绍拦截器的用途preHandle调用时间:Controller方法处理之前执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行若返回false,则中断执行,注意:不会进入afterCompletionpostHandle调用前提:preHandle返回true调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作执行顺序:链式Interce
2021-04-23 14:13:25
1797
原创 String 转 LocalDateTime 抛出异常
某次需要将String类型转为LocalDateTime做时间比较的时候抛出异常代码public boolean checkOrderAndCampaignEndDate(String orderEndDate, String CampaignEndDate){ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDateTime orderTime = LocalDateTime.parse(o
2021-03-29 10:14:19
818
原创 异常java.lang.IllegalArgumentException: Invalid character found in method name解决办法
新导入的项目springboot启动报错java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:422) at org.apache.coyote.http11
2021-03-21 16:32:00
3329
原创 两个集合取相同元素和不同元素以及单个集合去重
一、找到2个集合中相同和不同的元素此处需要使用Collection集合所提供的一个方法:removeAll(Cellection list)实现代码如下:import java.util.ArrayList;import java.util.Collection;import java.util.List;public class Test {public static void main(String args[]){//集合一List _first=new ArrayList();
2021-03-02 10:41:20
1121
原创 git删除本地分支以及远程分支(简单粗暴)
1.删除本地分支git branch -d branch/…但是该分支必须完全和它的上游分支merge完成(了解上游分支,可以点击查看链接),如果没有上游分支,必须要和HEAD完全merge所以直接用git branch -D branch/…2.删除远程分支git push origin --delete branch/…...
2021-02-23 16:23:11
733
原创 异常java.net.UnknownHostException解决方法
这种异常可能是公司项目的一些配置中心之类的读取不到,需要手动到hosts文件中添加如下127.0.0.1 xx.xx.xx.x(对应的链接)这样就能访问到了
2021-02-20 17:47:37
2143
原创 编译错误java.lang.ExceptionInInitializerError 解决方法
一般都是jdk版本问题,检查一下自己的jdk版本,我就因为初始版本是jdk10所以出现异常
2021-02-20 17:41:25
2088
原创 idea debug断点调试
debug模式基本界面debug常用按钮介绍1.如果你的光标在其它行或者其它页面,点击这个按钮可跳转到当前代码执行的行。2.一行一行的往下走,如果这一行上有方法不会进入方法。3.如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法。4.强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。5.从步入的方法内退出到方法调用处,此时方法已经执行完毕,只是还没有完成赋值。6.断点回退,就是回退到上一个方法调用的开始处。7.运行到光标处..
2020-11-05 10:17:43
542
原创 java8 stream流 (遍历、排序、分组、去重)
遍历foreach遍历list.forEach(str-> System.out.println(str));流遍历List list = new ArrayList();list.add(“a”);list.add(“b”);list.add(“c”);list.add(“d”);List list3 = new ArrayList();// 过滤字符串为a的元素list.stream().filter(str -> !“a”.equals(str)).forEa
2020-11-05 09:59:32
3889
原创 秒杀场景实战优化,jmeter压测
先从我们最原始的秒杀结构开始。设置一个商品表:id 商品名 价格 库存 介绍设置一个订单表:订单id 商品id 库存以下是我们用户在点击购买时生成订单的过程:下单接口通过传入商品id执行下单操作。1.先查出商品库存,如果库存少于0则返回“商品库存已售完”。2.库存不为0,创建秒杀订单。3.最后再在数据库中进行库存减1。开始秒杀相关优化:乐观锁(状态控制)在我们的减库存sql语句不能再写传统的基础写法,这里要使用乐观锁来保证并发场景下的线程安全!(状态控制:数据库控制的行锁,不会
2020-11-05 09:26:29
733
转载 Java中的String为什么是不可变的? -- String源码分析
什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。区分对象和对象的引用对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = "ABCabc"; Syst
2020-10-13 15:24:43
221
原创 谈谈数据库事务
首先事务用一句简单的话来说,事务就是逻辑上的操作,要么都执行要么都不执行。如最常见的转账。 那么事务是如何来保证这种操作的呢?一、事务的ACID原子性:事务视为一个整体要么全部成功要么全部失败。以转账为例子:在事务中的扣款和价款两条语句。在数据库管理系统中,默认情况下一条sql就是一个单独的事务,事务是自动提交的。只有显示的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。保障事务原子性是数据库管理系统的责任,为此许多数据源采用日志机制。例如:sql server
2020-10-09 21:06:30
168
原创 数据库常见的优化方案
一、数据库设计方面选取最合适的字段属性 关系型数据库虽然支持大数据量的存取,但是一般来说都是表越小,执行速度越快。因此在满足业务需求时,尽可能的将字段宽度设置小一点。避免使用NULL字段,很难查询优化且占用额外索引空间。数据库索引 索引是提高数据库性能的最常用方法。通常情况下索引应该建立在那些用于join连接,where判断,orderby排序字段上。 &nb
2020-10-09 15:52:12
456
原创 synchronized 和Lock区别以及可重入锁(ReentrantLock)
对于synchronized 还没理解的可以先看看我之前写的这篇博客讲解synchronized 先对synchronized有一个初步了解:https://blog.youkuaiyun.com/dekulugu/article/details/108929818一、synchronized 和Lock区别知道了synchronized 和Lock,他们都是实现了多线程的加锁,那么我们就要明白什么时候适合什么锁。区别如下:Lock是java的一个interface接口,而synchronized是Java
2020-10-07 18:43:22
1350
1
原创 synchronized详解及偏向锁、轻量级锁、自旋锁、重量级锁
要了解synchronized的原理及应用场景就得先了解并发编程是什么,对并发编程不了解的话可以看看这篇博客:https://blog.youkuaiyun.com/dekulugu/article/details/108754623一、synchronized的基本使用为什么要使用synchronized?在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。synchronized关键字可以保证在同一时刻,只有一个线程可以执行某个方法或代码块,同时synchronized
2020-10-05 18:29:45
879
原创 采用websocket如何实现多人聊天
1.网页版即时通讯背后的原理http协议和服务器推送技术:http协议为无状态,单向性的协议。单向性:必须由客户端发起的一个请求建立的连接,服务器接收请求,把数据返回给客户端,典型的一请求一响应。无状态:服务器与客户端通过http协议建立连接,当我们浏览器向服务器发送请求然后服务给我们应答,当我们再一次向服务器发送请求时,对于服务器来讲,在它看来这个请求是一个全新的用户。(在http协议中为了解决这种无状态的问题提出了cookie和session)那么基于http协议的特性想简单实现一个在网页上显
2020-10-04 20:52:36
1095
原创 简单回顾jvm及垃圾回收机制
jvm初步理解1、什么是运行时数据区? javac 指令:编译java文件生成class文件 java指令:运行class文件即将数据放到jvm中 class文件运行,后将不同的数据放到jvm中不同的位置这就是运行时数据区的由来2、运行时数据区的划分PC寄存器(计数器)(存储当前线程执行方法的记录,下次接着下去,不用从头开始。) 每一个线程都有一个计数器,专门用于存储当前线程正在执行方法的所在位置。java虚拟机栈一个线程表示一个java虚拟机栈,方法的执行可以通过压栈的方式
2020-10-02 21:25:37
217
原创 深入理解设计模式:单例模式
单例模式什么是单例模式应用场景以及优缺点单例模式的实现什么是单例模式单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。单例模式实现的两个步骤:将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用
2020-09-29 16:24:38
179
原创 高并发问题解决方案(乐观锁悲观锁实现)
对于高并发秒杀系统,我们的核心关注点就在于商品的抢购过程中,这里我们就以一般的购物为例子,当我们们库存只有1000个时,某时刻开放购买时有200000人同时购买应该怎么应对,秒杀系统存在以下技术难点:短时高并发、负载压力大读多写少竞争资源是有限的,不能多买,不能少买,不能重买。秒杀过程中我们最主要的关注点就在商品的库存上,这里我们先给出一个我们最熟悉的商品库存更新语句:update t_goods_infoset amout = amout - #{buys}where code =
2020-09-29 14:59:37
1622
转载 hashmap 中equals和hashcode方法的区别
众所周之,String 、Math、还有Integer、Double。。。。等这些封装类重写了Object中的equals()方法,让它不再比较句柄(引用),而是比较对象中实际包含的整数的值,即比较的是内容。而Object的equals()方法比较的是地址值。一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。
2020-09-29 09:17:17
2434
原创 最长有效括号(利用栈处理,动态规划)
本题选自力扣32.最长有小括号本题共有两种解法:1.利用栈处理 2.动态规划法首先先从容易理解的栈处理法开始,动态规划法如果之前没有接触过可以先浏览这篇博客https://blog.youkuaiyun.com/dekulugu/article/details/108572140,从一道简单移动的动态规划算法题开始理解利用栈处理对于遇到的每个 ’ ( ’ ,我们将它的下标放入栈中.对于遇到的每个 ’ ) ',我们先弹出栈顶元素,并且尝试匹配当前这个右括号如果栈为空,说明这个右括号没有左括号能进行匹配,我们
2020-09-27 20:31:24
386
原创 Springboot集成redis
Springboot集成redisredis是什么?为什么要用redis?Redis集成过程redis相关知识redis是什么?为什么要用redis?Redis是现在最受欢迎的NoSQL数据库之一,是一款内存高速缓存数据库。Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。使用C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。特点:Redis以内存作为数据存储介质,读写数据的效率极高。Redis跟
2020-09-26 17:13:28
134
原创 记录springboot集成mabatis使用过程
1.定义MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。2.配置使用maven来构建项目,只需将下面的依赖代码置于 pom.xml 文件中:<dependency> <grou
2020-09-26 16:04:35
124
原创 通俗易懂学会快速排序
首先给出快速排序的基本思想:1.我们先选出一个中心轴(pivot),然后将小于pivot的数字放在pivot的左边,将大于pivot的数字放在pivot的右边。注:这里的中心轴我们可以随意选择数组中的任意一个数字,但是为了方便,每次选择中心轴我们都选数组最左边的数为中心轴。中心轴(pivot)的作用就是将我们原本无需的数组分为两部分(这两部分是一般都是无序的),左边的小于中心轴,右边大于中心轴。2.这样我们就相当于得到了左右两个数组,然后再分别再两个数组中再分别取中心轴,完成和第一步一样的操作,直到
2020-09-25 16:13:56
286
原创 索引机制深入浅出
索引机制深入浅出什么是索引,为什么要用索引索引的数据结构三级目录什么是索引,为什么要用索引数据库索引是一种为了加速数据表中行记录检索的数据结构。注意:数据库中的索引存储于磁盘中。这里我们给出一个例子select * from t_user where id = 102;这里我们不使用索引的时候,我们会在这个表中依次查找id=102的这条数据,如果说我们这个数据库存储的是千万乃至上亿的数据量时,可以想到这个工作方式多么浪费性能。所以这时候索引的优势就出来,索引是一种数据结构,这里就相当于我们把i
2020-09-24 16:38:14
1035
2
原创 多线程相关知识详解!
多线程相关知识详解进程和线程是什么?线程的生命周期创建线程的多种方式线程安全和线程锁进程和线程是什么?进程:在我们的电脑上有很多单独运行的程序,这每一个程序都有一个独立的进程,进程之间相互独立,比如我们电脑上的qq,微信,电脑管家等。线程:进程想执行任务就需要依赖线程,一个进程中至少有一个线程。那么什么是多线程呢?先来了解一下串行和并行。串行:就是一个线程执行执行多条任务时,必须先执行完A,然后再执行B,最后执行C。并行:比如在下载多个文件时开启多条线程,多个文件同时进行下载,这里是严格
2020-09-23 20:05:07
463
原创 经典面试题:盛最多水的容器(双指针法)
例题:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49这道题目简单来说就是x轴乘y轴能够得到的最大面积(y轴取较小的那一个)这道题目采取双指针法解题(后面我们再讲解双指针法的正确性)示例:[1
2020-09-23 10:13:22
333
原创 2020春招面试总结(一):计算机网络知识点
一、三次握手和四次挥手"三次握手"的详解+图解所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。以下为客户端主动发起连接的图解:握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:1)首先客户端向服务器端发送一段TCP报文,其中:标记位为SYN,表示“请求建立新连接”序号为Seq=X(X一般为1)随后客户端进入SYN-SENT阶段。(2)服务器端接收到来自客户端的TC
2020-09-22 15:21:48
569
原创 HashMap原理和面试问题总结
一、首先先熟悉一下HashMapHashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null值,因为key不允许重复,因此只能有一个键为null.另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap不能保证随着时间的推移Map中的元素次序是不变的。HashMap基于hashing原理,当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取
2020-09-18 15:45:33
370
原创 最长回文子串深度理解动态规划
例题 力扣5.最长回文子串解法一:暴力法首先直接分析题解要在一串字符串内找到最长的回文子串,我们很容易就能想到暴力法。我们可以列举出所有的长度大于2的字符串,然后再拿来做判断它是否是回文子串。这里列举几点可以注意的地方:在做这种截取字符串的时候我们不能每次都把得到的字符串进行截取,这样不仅判断麻烦而且截取字符串的过程中也会占用时间复杂度,最好的方法就是记录他的位置最后得到最大的值再截取。如用一个 int begin 记录开始的位置,int maxlen记录总长度最后用substring(
2020-09-16 17:20:15
243
原创 如何通俗易懂的理解递归思想
递归题目做了不少,每次做完都感觉递归很简单很好想到,但是隔段时间再做递归相关题目,时不时还会被递归给绕晕。递归虽然效率低但是在解决很多问题的时候递归也是我们最容易想到的解决方法。这里强调一下在理解递归的时候需要注意的问题!!!在理解递归的时候我们只需要把他当作普通函数来看,只不过在开始的几次调用时它没有办法得出结果。一定是只考虑函数当前层的逻辑内容,只需弄清楚这一层循环中我们的输入输出是什么。第三点也是每个初学递归最容易犯的错误,不要强行用脑debug递归函数的调用,这样一开始就被绕进去了。(
2020-09-16 11:10:31
2870
原创 动态规划算法解题思路
在做动态规划类题目时最大的感觉就是能够分析出这道题目需要用动态规划算法来解,却没有办法构建出解题步骤,看到别人的分析时候又感觉代码很简单但是自己却想不出。其实这还是没有理解到动态规划算法的基本思想。这里我们通过一道例题来进行分析由于相邻房屋不能偷,如果我们从前往后思考当我们偷第一家那么我们就不能偷第二家,如果我们偷第二家我们就不能偷第三家…这时发现我们每走一步问题都为发生改变。此时我们就应该换个角度思考从后往前看:假如我们现在有5家房屋当我们选择偷第五家的时候,那么最大金额 = 第五家金额 +
2020-09-14 09:42:55
3360
2
原创 关于数据库多表查询操作
记录数据库多表查询相关操作给定两张表当我们只是简单的要求提供person的一下信息时:FirstName, LastName, City, State我们首先想到的就是我们使用最多的语句:select P.FirstName,P.LastName,A.City,A.State from Person as P,Address as A where P.PersonId=A.PersonId;如果此时加上特殊条件无论 person 是否有地址信息,都需要基于上述两表提供 person 的这些
2020-09-13 11:11:11
428
原创 关于深度优先搜索和广度优先搜索算法分析
深度优先和广度优先题解分析什么是深度优先算法什么是广度优先搜索通过一道算法题目来理解两种搜索算法什么是深度优先算法深度优先搜索(Depth-First-Search)是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。这个举例一个简单的树结构
2020-09-12 16:00:26
852
1
原创 简单记录关于一些算法题目中针对字符串的处理
一些常用的字符串api1.substring(1,2)从1位置开始截取,2位置结束(包含1位置不含2位置)2.Integer.valueOf()通过Integer.valueOf()将字符串强转为int类型int num = Integer.valueOf(str);3.trim()去除字符串空格,得到的是一个新字符串4.charAt()通过chatAt(i)取出字符串中对应下标的字符5.split()分隔字符串abc efgsplit(" ")就是通过空格分隔字符串6.toUpp
2020-09-09 16:53:12
362
2
原创 回溯算法以及剪枝问题理解
回溯算法以及剪枝问题理解关于递归的简单回顾关于力扣第77题:组合关于递归的简单回顾程序调用自身的编程技巧称为递归。举例说明一下:public void Recursion(int n){ if(n>0){ Recursion(n-1); printf("%d\n",n); }}当n=2的时候首先执行Recursion(2),接着执行Recursion(1),最后结果就是1和2。递归的调用实质就像是一个堆栈,当我们执行Recursion(2)的时候发现无法得到结
2020-09-08 16:50:07
1108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人