- 博客(99)
- 收藏
- 关注

原创 怎么学好算法和数据结构的经验分享
无论是什么语言,算法毫无疑问都是重中之中,算法也依托于数据结构的实现 下面分享下我的自己的经验,(不要一上来就去刷leedcode,会把你弄懵逼的)、 先打好基础,学好数据结构 我呢是在b站上看黑马的数据结构视频 https://www.bilibili.com/video/BV1Cz411B7qd?from=search&seid=4347812097765338960 学完这个,对数据结构的了解,是有本质的提升的 当然你也可以有更好的学习视频,我们也可以分享交流哈 leedcode刷题 lee
2021-01-15 14:53:10
416

原创 一名走过弯路的程序员心得 :基本功的重要性
看过身边很多人,包括可能现在在看这篇博客的你,也是一样,开发中调用着各种api,以为自己就特别的牛逼,包括之前我也是哈,所以我觉得有必要要分享我的感悟 :基本功的重要性 我是一名大三学生,以前在学校外包团队写项目,代码就是去网上复制粘贴,然后调用,说好听点,叫Api调用工程师,原理什么的都不知道,框架很容易上手,crud一顿操作,啪的一下很快啊,写项目确实很快,但是半年前我在牛客网看别人的面经,一问三不知,这种情况,怎么有机会去大厂呢?当即决定,在宿舍开始恶补基础,基础超级重要,当然补基础是一个相当漫长的时
2021-01-12 14:42:33
362
3
原创 一次实习开发中写出代码死循环的教训
今天在开发中 编写一个接口 需要涉及到数据迁移,由于是大表 在一开始就考虑了很多东西,多线程,数据一致性,性能优化等等,反而在do while的代码中忽略了最重要的东西,要保证代码不会出现死循环,不能影响线上业务,后面在单元自测中发现cpu上升到99,debug定位到代码存在死循环 死循环的原因是 由于代码出现异常 跳过了中止条件的累加 使得中止条件一直不成立 所以在编写循环的代码时候,一定要确保 中止条件能被执行 try { }catch (Ex
2021-07-11 22:18:21
338
原创 纠正对容器的认知
Java中的并发容器 List Set Map Queue 这些容器对应线程不安全的有 ArrayList 、LinkedSet、HashMap、PriorityQueue 等等 这些可以采用Collections.synchronized 方法包装成对应线程安全的,或者是直接使用Java提供对应的线程安全的包 List list = Collections. synchronizedList(new ArrayList()); Set set = Collections. synchroniz
2021-07-11 22:09:15
136
原创 关于堆的复习
堆的本质 堆的本质是一种优先队列,理解起来可以一种二叉树 堆的逻辑实现 我们往一个队列的尾部去添加元素,然后与他的上一层元素进行比较,判断要进行上浮 还是下沉 手写堆实现 手写堆 这里贴很久之前我跟着黑马视频写过的代码 /** * 堆的实现(由完全二叉树加一个数组实现) * 父节点大于两个子结点 */ public class Heap< T extends Comparable< T > > { /** * 定义一个数组 存放堆中的数据 */
2021-07-10 17:03:04
125
原创 CountDownLatch 和 CyclicBarrier 实现线程之间的同步
两者的区别 CountDownLatch 主要用来解决一个线程等待多个线程的场景 CyclicBarrier 是一组线程之间互相等待 CountDownLatch 构造方法 使用demo public static void main(String[] args) throws InterruptedException { //创建一个 countDownLatch CountDownLatch countDownLatch = new CountDownL
2021-06-24 15:32:22
154
原创 使用Semaphore实现一个限流器
import java.util.concurrent.Semaphore; /** * @Description 使用Semphare 构建一个限流器 */ public class Restrictor { private Semaphore semaphore; /** * 初始化限制并发流量的大小 * @param size */ public Restrictor(int size) { semaphore = new
2021-06-24 14:24:18
129
原创 拓扑排序之再温习
最近回去做 以前做过的leetcode题目,发现对拓扑排序的定义 有了误解,以为是要按照分层收集才算拓扑排序, 其实不是的 https://leetcode-cn.com/problems/course-schedule-ii/solution/ke-cheng-biao-ii-by-leetcode-solution/ 拓扑排序存在于有向图中,只要按照有向边的方向 收集节点 不会出现整体顺序和有向边相反 即可 比如下图的案例 收集有向图的拓扑 不需要按照层次分层 比如深度搜索获取的结果 可能是 A B
2021-06-19 21:24:28
96
原创 整数溢出处理操作
在算法题 有时候给你限制操作数字的范围 [min,max] 那么可以采用INT_MIN 和 INT_MAX的逆操作去做判断 /** * 判断res * 10 是否会溢出(不在[min,max]范围内) * 这里默认INT_MIN 和 INT_MAX 采用的进制是10 * @param rev * @param INT_MIN * @param INT_MAX * @return */ public boolean o
2021-05-18 10:13:21
476
原创 快排模板
快排很久没写了,原来的实现思路有点绕,今晚请教了一个好友,兄弟给我提供了另外一种实现的思路,发现比较好记,处理更加简单,觉得很赞 记录下
2021-04-18 21:51:37
212
原创 理解Java语言的特性,是否是解释执行
Java特性 考的是我们对Java 语言的全局认知,大概需要分以下去作答,探讨 一、基本的语言特性 面向对象(封装,继承,多态) 反射 泛型 Lambda 二、 丰富的Java类库 集合包,并发包,网络,IO/NIO 三、Java虚拟机 垃圾回收器 平台无关性(JVM运行.class文件) 编译模式有解释 也有 编译(Just - in - time编译实现),混合模式 四、JRE提供了很多辅助工具 javac ,jps,jstack 理解平台无关性(一次编译,到此运行) “一次
2021-04-14 17:14:45
180
原创 前缀和 (一维 和 二维)
什么是前缀和 现在有一个场景,不断的需要我们去计算出数组中 [l , r] 范围的总和 ,常规的处理是每次都去一个一个累加,这样时间复杂度是O(n), 这样显然还是太慢了 下面我们通过记录 前1,前2 … 前n个 元素的和 ,S1,S2…Sn,先对数据进行预处理,接下来对于求 [l,r]的和 我们只需要Sr - Sl -1 时间复杂度是O(1),性能显著的提升 一维数组前缀和 现在用代码进行实现 /** * 一维实现 */ public void oneDimension
2021-04-01 20:05:13
214
原创 回溯算法的模板
public class Backtrack { public void backtracking (/*参数*/) { /* 定义两个成员变量 一个收集满足要求的 结果 一个收集 作为中途尝试的值,进行回退 */ /* if (终止条件) { 存放结果 终止本层循环 return; } 遍历本层
2021-03-30 11:05:29
262
原创 递归的实现套路
递归的题目呢,有时候就能一眼看出来,难的又搞不出来,全靠玄学,其实不然,只要按着步骤走就可以实现 第一步、根据题目现在纸上 画出 递归的状态树 根绝状态树 明确三个点 /** * 根绝状态树 明确三个点 * 1、确定递归的参数 和 返回值 * 根据当层节点 确定参数, 根据 当层节点 和 上一层之间的关系 确定返回值 * 2、确定递归的中止条件 * 看状态树遍历到最底层是什么 就是中止条件 * 3、确定单层的逻辑
2021-03-30 10:04:15
156
1
原创 并查集的实现模板
在题目中,如果是求 对什么合并,或者是图的连通区域的个数之类的,应该考虑使用并查集 下面我总结出一个并查集的模板 package 图论.并查集; import java.util.Arrays; /** * 并查集的实现 */ public class UF_Tree { /** * 根据顶点创建一个数组 * 数组索引对应顶点 值对应他的父节点 */ private int[] eleAndGroup; //计算并查集中分组的个数 pr
2021-03-29 13:22:31
163
原创 图中两种搜索方式的模板
很多题目,需要我们 根据题意构建出图来,进行搜索 这时候,有两种搜索的模板,这里我都是采用二维数组来构建图 深度优先搜索 /** * 深度优先搜索的模板 * 数组构建的图 */ public class ArrayDFS { //根据题意构建有向图 int[][] edges; //标记顶点是否被搜索过 boolean[] marked; /** * 传入一个n * n 的题意矩阵来初始化图 * * @param arr
2021-03-29 10:23:15
190
原创 动态规划 - 入门
什么是动态规划 根据维基百科的解释 将复杂的问题拆分成若干个简单的子问题 每个子问题仅仅解决一次,并保存他们的解 最后推导出原问题的解 能够采用动态规划来解决的问题,通常具备两个特点 最优子结构(最优化原理): 通过求解子问题的最优解,可以获得原问题的最优解 无后效性 某个状态一旦确定,则此后的演变过程不再受此前各状态的影响 ...
2021-03-05 19:50:10
145
2
原创 基数排序
像冒泡,选择,插入,堆,归并,希尔,快速 排序,这些是基于比较的 排序 而计数排序,桶排序,基数排序 这些都不是基于比较的排序,采用的思想是 以空间换时间 下面来介绍一下基数排序 因为数字的每一位都是通过0 ~ 9 组成 ,那么我们只需要对每一位数 进行排序,最后整体就有序 需要先得出他的最大值 和 最小值 ,这样就能得出 推断出他的位数,对每一位采取计数排序 下面的代码版本是 用于正数整数的基数排序 /** * 基数排序 */ public class BaseSort { public st
2021-03-02 22:50:36
128
原创 计数排序
像冒泡,选择,插入,堆,归并,希尔,快速 排序,这些是基于比较的 排序 而计数排序,桶排序,基数排序 这些都不是基于比较的排序,采用的思想是 以空间换时间 下面来介绍一下计数排序 计数的排序的核心思想 通过统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引 因为要计算出排完顺序后 每个整数的最大位置,所以需要开辟一个数组进行存储 数组的长度 : 最大值 - 最小值 数组的定义 : 每个整数 - 最小值 就得到这个整数的索引 数组的值 : 排完顺序后 整数的最大位置
2021-03-02 21:02:32
96
原创 正则表达式入门
学习正则表达式,需要借助工具来测试自己写的对不对 查看效果,可以用https://regex101.com/ 网站在线测试 限定符 ? :代表前面的字符需要出现0 次 或者 1次,即可有可无 例如 used? 代表的是d 出现0次或者1次 *:代表前面的字符可以出现的次数不限制,可以是0次和多次 ab*c +: 代表前面的字符出现 1次以上 ab+c {} :可以指定前面的字符出现的次数 //字符b需要出现6次 ab{6}c //字符b出现在2到6 次的范围内 ab{2,6}
2021-02-26 16:56:47
156
原创 IO流
定义 : Java 中把不同的 输入/ 输出源 ,抽象的表示成流(steam 好处 : 因为Java 中提供IO流的抽象,所以开发者 可以采用一致的IO代码 读写各种各样的IO流节点 分类 1、按照流向 可以分为 输入流 、输出流 输入流 : 只能从中读取数据,不能往里面写入数据 输出流 : 只能从中写入数据,不能往里面读取数据 2、按照操作的数据单元不同,可以分为 字节流、字符流 字节流 : 操作的数据单元是 8位的字节,以InputSteam和OutputSteam 作为基类 字符.
2021-02-21 16:08:08
117
原创 图的进阶
有向图 定义 : 有向图是一副有方向性的图,是由一组顶点 和 有方向性的边 组成的 出度 : 由某个顶点 指出 的边的个数 入度 : 指向某个顶点的边的个数 有向路径 : 由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点 有向环 : 一条至少含有一条边,且起点和终点相同的有向路径 有向图的Api 的设计 import java.util.LinkedList; import java.util.Queue; /** * 有向图 */ public class Di
2021-02-17 22:04:42
150
原创 图 的入门介绍
图的定义和应用 图的定义 图是由一组顶点 和 能够将两个顶点相连的边组成的 图的应用 地图 无向图 图的术语 要表示一幅图,需要表示清楚部分内容 图中所有的顶点 所有顶点的边 下面是实现一个 无加权 无向图的Api import java.util.LinkedList; import java.util.Queue; /** * 无加权 无向图 */ public class Graph { /** * 图中 顶点数 */ privat
2021-02-17 17:59:22
75
原创 关于并查集
什么是并查集 ? 并查集是一种树形的数据结构 并查集可以高效的进行两种操作 查询元素p 和 q 是否属于同一组 合并元素p 和 q 所在的组 下面手动实现一个并查集案例 /** * 并查集的实现案例 */ public class UF_Tree { /** * 记录并查集 中的分组数量 */ private int count; /** * 采用一个数组 数组下标表示元素 * 数组的值表示 所在的树 (用根节点表示) */
2021-02-16 20:18:22
105
原创 MyBatis缓存
MyBatis系统中默认定义了两级缓存 默认情况下,MyBatis是开启了一级缓存(SqlSession级别的缓存,也称为本地缓存) 二级缓存需要手动开启和配置,它是基于namespace级别的缓存 为了提高扩展性,MyBatis定义了缓存接口Cache,我们可以通过Cache接口来自定义二级缓存 一级缓存 一级缓存也叫本地缓存 与数据库同一次会话期间查询到的数据会被放到本地缓存中 程序会先去缓存里面查找,缓存里没有再去查询数据库,并且将记录添加到缓存中 一级缓存失效的情况 sqlS.
2021-01-18 15:55:36
94
原创 SpringMVC执行流程
SpringMVC的执行,全靠内部DistpatcherSelvet 调度 具体的流程 比如用户发起了一条url请求 1、DispatcherSelvet 调用HandlerMapping(映射处理器)解析url,HandlerMapping 根据url 去查找对应的Handler(处理器) 2、HandlerMapping 找到了具体的处理器 HandlerExecution ,返回给DispatchSelvet 3、DispatchSelvet 调用HandlerAdapter(处理器适配器),按.
2021-01-18 15:20:45
89
原创 建造者模式
建造者模式将多个简单对象一步一步组装成复杂对象的过程 使用的条件:构建复杂产品的原材料(类)基本是固定的,只是组装经常变化 结构角色 原材料 抽象的建造者(定义构建的方法) 建造者 (根据原材料去构建出产品) 指挥官(指挥让那个建造者去建造,不同的建造者建造出来的是不一样的产品) 具体的过程 (这里就不结合其他的设计模式,主要讲明白建造者设计模式为主) 原材料 /** * 原材料1 */ public class Product1 { } /** * 原材料2 */ public cl.
2021-01-18 11:31:24
92
原创 类实例化顺序
引入阿里巴巴的一道面试题 public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i");//3 public static int n = 99; public int j = print("j".
2021-01-17 16:33:45
115
原创 工厂模式
工厂模式,将创建对象实例的任务交给工厂去完成,让使用者和被使用者之间的解耦 工厂模式和单例模式是最佳的合作伙伴,可以搭配使用 比如,我实现一个抽象工厂的案例 先用枚举搞一个单例对象 public enum Singleton { INSTANCE; } 编写一个抽象工厂 /** * 抽象的工厂 */ public interface AbsFactory { //定义一个创建类实例的方法,交给子类工厂去实现 public Object createInstance .
2021-01-17 15:07:06
148
3
原创 单例设计模式
什么是单例设计模式 采用一定的方法保证整个软件系统中,某个类只能存在一个对象实例 实现单例设计模式七种方法(保证安全) 1、饿汉式 (静态常量) /** * 1、饿汉式 (静态常量) */ public class Singleton_1 { //构造器私有化 private Singleton_1 () { } //类加载的时候直接将对象new 出来 private static Singleton_1 instance = new Singleton
2021-01-17 14:27:13
108
2
原创 设计模式开篇
设计模式的目的 代码重用性 (相同的代码,不用多次编写) 可读性 (代码规范) 可扩展性(增加新功能点,比较方便) 可靠性 (增加新功能,对旧的功能没有影响) 程序高内聚,低耦合 设计模式的七大原则 单一职责原则 每个类只完成一件事情(原子的,不能再被拆分的) 如果是方法比较少,可以将单一职责 推后到方法上 接口隔离原则 一个类对另一个类的依赖应该建立在最小的接口上 比如一个接口A 有三个方法 @interface A { void method1(); void method2(); voi
2021-01-17 11:52:01
144
3
原创 反射机制Reflection
1、静态语言和动态语言 静态语言 : 运行时结构不可变 动态语言 : 运行时,代码可以根据某些条件改变自己结构 Java 依赖反射机制,可以看成是一门“准动态语言” 2、Java Reflection 反射机制运行程序在执行期间 借助Reflection API 去读取到类的内部信息,并且直接操作内部属性和方法 Class c= Class.forName("java.lang.String"); 加载完类后,会产生一个Class 对象(一个类只有一个Class对象),我们通过这个Class对象查
2021-01-16 23:52:26
138
原创 注解Annotation
1、什么是注解 注解是从JDK5.0 开始引入的技术 可以看成是Java类,方法的一个扩展模板 可以附加在package , class , method , field 等上面 , 相当于给他们添加了额外的辅助信息 2、自定义注解 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation 接口 import java.lang.annotation.*; //定义一个注解 @Target(value = {ElementType.METHOD
2021-01-16 22:10:32
102
原创 SQL编写和执行顺序
SQL编写顺序 select distinct 字段 from 表1 join 表2 on 联表条件 where 搜索条件 group by 分组字段 having 分组条件 order by 排序字段 limit 分页大小 SQL执行顺序 from 表1 on 联表条件 join 表2 where 搜索条件 group by 分组字段 having 分组条件 select distinct 字段 order by 排序字段 limit 分页 .
2021-01-16 20:29:10
183
原创 SQL优化
1、大批量插入数据 主键有序插入(先对数据进行排序后插入) 关闭唯一性校验,等插入完后重新开启 手动提交事务 直接在一句insert 里面完成,避免重复的获取连接 比如 优化前 insert into tb_test values(4,'Tim'); insert into tb_test values(1,'Tom'); insert into tb_test values(3,'Jerry'); insert into tb_test values(5,'Rose'); insert int
2021-01-16 16:56:55
139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人