- 博客(42)
- 问答 (1)
- 收藏
- 关注
原创 《人月神话》读书笔记——项目进度问题简析
导致项目进度出现问题的因素1、评估技术方案与工作量时忽略可能的风险误区:乐观主义,一切都将良好的运作,每项任务仅会花费他应当花费的时间问题的根源:创造性工作的实现结果依赖其实现介质,软件的实现介质仅为程序员的思维,是易于掌控的,而人的构思是有缺陷的,缺陷导致了工作量评估的失真大型项目的任务需要被拆解成若干个小任务,即使每个小任务能不出差错,但项目整体的工作量并不是任务工作量的叠加,小任务组合排序的过程中会有很大概率出现未知的问题2、认为投入人力与投入时长可以互换误区:成本可以理解为人力乘时
2022-05-10 22:39:51 268
原创 代码规范总结
异常处理应当区分业务异常与未知异常,对于业务流程上出错的,应当手动向外抛出封装好的业务一场流量入口1、流量入口需要做好参数校验与权限校验2、流量入口入参出参应当做好封装,出参应当包含统一的结果信息3、流量入口层不应当处理业务逻辑,只做简单的参数转换与结果封装,业务逻辑交由下层完成4、流量入口应当捕获所有异常并转换为异常码/异常信息返回,不应当对外抛出异常系统交互1、应当设置一层防腐层来调用外部的接口,防腐层完成模型转换,异常处理等工作,将外部系统的差异与异常全部隔离在防腐层2、防腐层应当捕
2022-04-13 16:46:45 226
原创 面向切面编程与Spring中的AOP
面向切面编程与Spring中的AOP文章目录面向切面编程与Spring中的AOP一、引入——代理模式与面向切面1、场景假设2、静态代理3、动态代理4、什么是面向切面二、术语与概念1、切面(Aspect)2、连接点(Joint Point)3、通知(Advice)4、目标对象(Target Object)5、切点(Point Cut)6、织入(Weaving)7、引入(Introduction)三、Spring中的AOP1、基于xml的aop2、基于注解的aop3、对Spring AOP优点的一些理解一、
2020-11-13 14:50:19 482
原创 Java Class类文件结构
Java Class类文件结构文章目录Java Class类文件结构一、字节码——无关性的基石二、纵观Class文件结构三、魔数与文件版本四、常量池五、访问标志六、类索引、父类索引与接口索引集合七、字段表集合八、方法表集合九、属性表集合一、字节码——无关性的基石当我们使用命令行来运行Java程序时,会先使用javac将java文件编译成class文件,然后使用java命令运行class文件。那么有没有思考过class文件的作用与结构呢?Java语言在诞生之初相较于其他语言来讲一个很大的竞争力就是Ja
2020-10-29 17:00:29 774
原创 平衡二叉树——AVL树(Java实现)
平衡二叉树——AVL树文章目录平衡二叉树——AVL树1、二叉搜索树的缺点2、AVL树的性质3、为何能保持平衡3.1、判断失衡的方式——平衡因子3.2、四种失衡的情况3.3、解决失衡的方法——旋转3.4、四种情况对应的旋转方式4、平衡二叉树实现4.1、节点结构4.2、AVL树完整代码4.3、测试1、二叉搜索树的缺点平衡二叉树是二叉搜索树的改进版,二叉搜索树用来快速的对数据进行查找,可以将原先O(n)的复杂度降低到O(logn),但这是在理想情况下的结果,若在原序列是有序的情况下,构建出的二叉搜索树就是线
2020-10-22 19:51:05 473 3
原创 MySql基础语句总结
MySql基础语句总结文章目录MySql基础语句总结一、数据库管理二、表管理1、表的创建2、主键管理3、更改三、数据管理——增删改查1、插入2、更新(修改)3、删除4、查询4.1、基础查询4.2、条件查询4.3、查询结果排序4.4、查询结果限制4.5、模糊查询4.6、查询结果分组4.7、联合查询4.8、多表连接四、常用函数一、数据库管理SHOW DATABASES;##查询所有数据库USE 数据库名;##使用数据库SELECT DATABASE();##查看当前数据库CREATE DATABAS
2020-10-15 14:37:43 446
原创 JavaWeb——Servlet
JavaWeb——ServletServlet概述Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。在Java中想要创建Servlet需要实现Servlet接口,一般情况下我们只需要继承HTTPServlet类并重写部分方法即可。需要注意的是Servlet和GenericServle
2020-09-25 19:04:45 227
原创 MySQL事务——JDBC实现、MyBatis实现与MyBatis整合Spring实现
MySQL事务——JDBC实现、MyBatis实现与MyBatis整合Spring实现一、什么是事务首先来看一个生活中十分常见的场景——网上购物。在网上购物时我们挑选完自己心仪的商品并选定号需要购买的数量后就需要进行付款了,我们假设我们需要支付1000元,那么当我们进行付款时,系统会将商品数量减去我们需要的数量,并在我们的账户中扣除1000元,再将卖家账户的余额增加一千元,并生成订单,看似很简单,一气呵成并不会有什么问题,但如果在减完商品数量后发现我们的余额不足,又或是在扣除了我们的余额后系统出现了故障
2020-09-23 10:39:14 783
原创 深入了解JVM垃圾收集机制
深入了解JVM垃圾收集机制文章目录深入了解JVM垃圾收集机制一、哪些内存需要被回收?1、引用计数法2、可达性分析算法3、方法区的回收二、如何进行回收——垃圾收集算法1、标记——清除算法2、标记——复制算法3、标记——整理算法三、何时进行回收1、触发垃圾回收的条件2、进一步了解引用3、finalize方法四、分代收集理论——对象的分配与回收1、理论前提——几个假说2、新生代与老年代3、垃圾收集行为的分类4、从垃圾收集的角度看对象的生命周期a、对象的创建b、Minor GC时发生了什么c、长期存活对象的晋升d
2020-09-19 20:44:54 151 1
原创 深入理解String、StringBuffer与StringBuilder
String、StringBuffer与StringBuilderStringString是Java中处理字符串最常见的类,然而比较特别的是,String是被final修饰的,并且String中用来存储字符串的char数组value也是final的,并且是平private的,这意味着用户不仅不可以改变value的引用,也没有办法修改value的值,因此String是一个不可变类,在每次对String对象进行更改的时候,例如对String进行拼接,都会生成一个新的对象,然后将指针指向新的String对象。
2020-09-08 11:00:02 357 1
原创 Java内存结构与内存溢出实验
Java内存结构与内存溢出实验文章目录Java内存结构与内存溢出实验一、程序计数器1、作用:2、线程私有:二、Java虚拟机栈1、作用:2、线程私有:3、局部变量表:4、异常:StackOverflowError:OutOfMemoryError:三、本地方法栈四、Java堆1、作用:2、线程共享:3、异常:五、方法区1、作用:2、运行时常量池:六、关于OutOfMemoryError的实践1、Java堆的溢出2、虚拟机栈的溢出3、方法区溢出4、运行时常量池溢出一、程序计数器1、作用:程序计数器是
2020-09-06 17:27:01 642
原创 Lambda表达式
Lambda表达式Lambda表达式是一个匿名函数,是在Java 8中出现的新特性,其允许把函数作为方法的参数传递。lambda表达式可以代替部分匿名内部类,使得代码更加简洁高效。lambda表达式的基本格式:(参数1,参数2,......,参数n) -> 表达式;(参数1,参数2,......,参数n) -> { 表达式1; 表达式2; ...... 表达式n;}说明:一个Lambda表达式可以有0个参数或任意多个参数,并且参数的类型可以声明也
2020-09-05 14:36:18 243 2
原创 深入理解Java异常处理
Java异常处理详解文章目录Java异常处理详解一、什么是异常,为什么要处理异常?二、异常的种类1、Throwable:2、Error:3、Exception:三、异常的抛出与捕获1、异常的抛出——throw:2、异常的捕获与处理——try、catch块:3、catch中抛出新的异常:4、抛向上级——throws:5、必须执行的代码——finally:6、try、catch与finally的执行顺序7、finally与返回值变量暂存8、finally造成的异常丢失四、异常的匹配五、自定义异常一、什么是异
2020-09-04 16:56:37 397 2
原创 LeetCode打卡——33.搜索旋转数组排序
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:输入: num
2020-07-30 16:44:33 142 2
原创 LeetCode打卡——200.岛屿数量
LeetCode打卡——200.岛屿数量题目描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:[['1','1','1','1','0'],['1','1','0','1','0'],['1','1','0','0','0'],['0','0','0','0','0']]输出: 1示例
2020-07-30 15:57:12 159 1
原创 LeetCode打卡——62.不同路径
LeetCode打卡——62.不同路径题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> 向下 -> 向右3. 向下 -> 向右 -
2020-07-30 15:44:44 848
原创 LeetCode打卡——322.零钱兑换JAVA
LeetCode打卡——322.零钱兑换题目描述:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例:示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1思路:涉及到选与不选的问题,很明显可以用动态规划来解,我们可以
2020-07-25 12:40:09 227 1
原创 MyBatis框架——概念与基本用法
MyBatis框架——概念与基本用法一、简介1、三层体系架构在了解什么是MyBatis框架之前,我们需要先回忆一下在软件体系结构中学习到的三层体系架构(表现层、业务层与持久层),表现层顾名思义用于向用户展现页面与信息,是与用户直接接触的,表现层采用MVC模式,即Model模型、View视图与Controller控制器;业务层将项目的业务中所有的操作封装成方法;持久层则用于建立实体类与数据路表间的映射,完成对象数据和关系数据的转换。MyBatis是持久层的框架2、什么是MyBatisMyBatis是
2020-07-23 21:02:47 470 1
原创 计算机网络——基础概念与层次结构
计算机网络——基础概念与层次结构一、常用名词概念1、局域网(LAN)局域网是在某一区域由多台计算机互联组成的计算机组,一般覆盖范围为方圆几千米内2、城域网(MAN)城域网是在一个城市范围内建立的计算及通信网,通过城域网可以将不同地点的主机、数据库以及LAN等互相连接起来3、广域网(WAN)广域网又称外网、公网,是连接不同地区局域网与城域网计算机通信的远程网,覆盖范围从几十公里到几千公里,可以连接多个地区、城市和国家,横跨多个洲并能提供远距离通信,形成国际性的远程网络4、MAC地址MAC地址
2020-07-20 15:02:20 783 2
原创 编译原理(1)——文法和语言
编译原理(1)——文法和语言一、符号串与语言1、字母表: 字母表Σ\SigmaΣ是一个有穷符号集合字母表的运算:并集乘积(交集):若Σ1\Sigma_1Σ1和Σ2\Sigma_2Σ2是两个字母表,则他们的乘积Σ1Σ2={ab∣a∈Σ1,b∈Σ2}\Sigma_1\Sigma_2=\{ab|a\in\Sigma_1,b\in\Sigma_2\}Σ1Σ2={ab∣a∈Σ1,b∈Σ2}幂运算:字母表Σ\SigmaΣ的幂运算(ϵ\epsilonϵ代表空串){Σ0={ϵ}Σn=Σn−
2020-06-27 14:12:20 531
原创 Redis主从复制与哨兵机制
Redis主从复制与哨兵机制文章目录Redis主从复制与哨兵机制一、主从复制1、什么是主从复制2、同步的两种方式2.1、全量同步2.2、增量同步3、主从复制的实现二、哨兵机制1、什么是哨兵2、哨兵的作用2.1、监控2.2、提醒2.3、故障转移3、哨兵的定时任务4、哨兵间的自动发现5、主观下线与客观下线6、故障转移6.1、选举领头Sentinel6.2、故障转移7、实践——故障转移模拟一、主从复制在了解哨兵机制前先来了解一下主从复制。在实际的应用过程中常常会遇到一些高并发高数据量的场景,对缓存提出了高可
2020-06-16 20:27:26 640
原创 Redis缓存穿透、缓存雪崩与缓存击穿
Redis缓存穿透、缓存雪崩与缓存击穿在实际应用中Redis常常与MYSQL等传统数据库一起使用,Redis看作是MYSQL的缓存,当收到一个查询命令时,首先到Redis中查找,若Redis中不存在该条记录再访问MYSQL进行查询,查询到结果后再将结果放入缓存中缓存穿透缓存穿透指的是在查询一个一定不存在的数据时,由于缓存是不命中的,所以需要从数据库中查询,查不到数据则不写入缓存,这将导致不存在的数据每次请求都要到数据库中查询,如果大量请求同时请求一个不存在的产品,这些请求就会全部被送到持久层数据库,给
2020-06-13 16:18:51 141
原创 Redis数据类型及命令
Redis数据类型一、StringString是redis最基本的数据类型,也是最简单的key-value类型,value可以是字符串,也可以是数字等类型,一个键最大能存储512M。String类型是二进制安全的,可以包含任何数据,包括序列化的对象、图片的二进制数等1、赋值命令:SET KEY_NAME VALUE,设置给定key对应的值,若key已存在则覆盖旧值SETNX KEY_NAME VALUE,若key不存在,则设置对应的键值,返回1,若key已存在则不设新值且返回0,使用来解决分布式锁
2020-06-11 10:31:58 605
原创 初识Redis——概念与配置
一、Redis简介Redis是一个高性能(NoSQL)的、开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,提供多种语言的API什么是NoSQL: 即Not-only SQL,NoSQL表示非关系型数据库为什么要使用NoSQL: 传统的关系型数据库在应对超大规模和高并发的SNS类型的web2.0纯动态网站上存在很多问题,包括高并发数据读写、对海量数据高效率存储和访问、对数据库的高扩展性和高可用性需求。NoSQL的产生就是为了解决大规模数据集合多种数据类型
2020-06-09 09:46:40 173 2
原创 初识Class类和反射
初识Class类与反射文章目录初识Class类与反射一、Class类概述二、class对象的获取2.1、通过getClass()方法2.2、通过类的类字面常量class获取2.3、通过forName(String className)方法2.4、三种方法的比较三、Class类与反射3.1、获取类的构造函数3.2、获取类的私有方法3.3、获取类的私有属性四、总结1、反射的优点:2、反射的缺点:一、Class类概述Class类的原码中有这样一段注释:“Instances of the class {@co
2020-06-07 20:55:09 400
原创 深入理解java多线程
Java线程文章目录Java线程一、线程概述二、线程的创建三、线程的启动四、线程优先级五、线程相关的一些方法1、sleep()方法2、yield()方法3、join()方法六、线程同步1、什么是同步问题?2、锁3、阻塞4、线程安全5、同步的另一种方式——volatile关键字七、死锁八、Object类中与线程有关的方法1、wait()方法2、notify()/notifyAll()方法九、总结一、线程概述什么是线程:线程是操作系统所能进行运算调度的最小单位,是进程中的一个执行流程,一个进程可以运行多
2020-06-05 20:50:29 234
原创 Java内部类详解
Java 内部类一、概述java类除了我们常见的,直接定义在java文件中的之外,还有一种定义在类内部的类被称为内部类。内部类包括四种:成员内部类、局部内部类、匿名内部类和静态内部类。二、成员内部类成员内部类是最普通的内部类,其定义在另一个类的内部。成员内部类可以定义费静态的属性和方法,不可以定义静态属性和方法,也不可以定义静态代码块,但可以定义static final类型的属性。内部类是外部类的成员,只有当外部类初始化的时候,内部类才会初始化。内部类的创建不可以直接使用构造方法创建内部类,只能
2020-05-30 22:07:08 348
原创 Java Object类
java Object类 java.lang.Object类是Java所有类的根节点,Java中所有的类都继承了Object类。Object类的常用方法1、equals()顾名思义,equals()方法用于判断两个对象是否相等,要注意的是这里的相等是指两个对象的地址是否相等,即是否是同一个对象,等价于“==”,因此对于所有继承于Object的类来说,如果希望得到两个对象的内容是否相等,通常需要覆盖equals方法,例如String类就覆盖了equals方法class ob{ String
2020-05-30 15:08:49 105
原创 Java集合整理
Java集合一、集合概念 C++的STL给我们提供了vector、list、stack等方便好用的容器,在java中也同样拥有一些类似的容器模板,这个模板被叫做集合。集合将一些基本的和使用频率极高的基础类进行封装增强后再以一个类或接口的形式提供。集合中存放着一系列对象,并且长度是可变的。不同的集合由不同的供和特点,适用于不同的场合。 集合类的框架 从图中可以看出,java集合主要分为两大块,Collection集合和Map映射,其中Collection下
2020-05-29 22:09:06 211
原创 JavaWeb购物平台小项目
JavaWeb购物平台小项目最近也快到期末了,web程序设计的课程也迎来了第一次大作业,内容是要做一个购物平台,用户能够添加购物车,购买商品,留言,反馈等,而管理员可以添加商品,浏览反馈,查看账务等,花了一周时间终于做好了。首先是数据库的设计项目整体的架构如下,没有用到特殊复杂的技术,只是简单的使用了JavaBean,Servlet等基础内容,毕竟还没有学到JEE和Spring,目前还只自己多去了解。整个项目的功能如下:在数据库的连接上采用了单例模式,将构造函数设为私有,只能在类内部实例化一
2020-05-29 20:34:02 4720 17
原创 Java正则表达式
java正则表达式1、正则表达式的作用 正则表达式定义了字符串的模式 正则表达式可以用来搜索、编辑和处理文本2、正则表达式的匹配规则字符描述\A匹配字符串开头\b匹配一个字边界,即字与空格的位置,如“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”\B匹配非字边界,如“er\b”匹配“verb”中的“er”,但不匹配“never”中的“er”\d匹配数字字符,等效于[0-9]\D匹配非数字字符,等效于[ ^ 0 -
2020-05-20 18:59:45 173 1
原创 0-1背包变体——双机调度
0-1背包变体——双击调度问题描述双机调度问题:有n项任务, 任务i 的加工时间为ti , i=1,2,…,n. 用两台相同的机器加工,从0时刻开始计时,完成时间是后停止加工机器的停机时间. 问如何把这些任务分配到两台机器上,使得完成时间达到最小?设给定实例如下:t1=1,t2=5,t3=2,t4=10,t5=3,给出一个加工时间最少的调度方案。解决思路算法描述算法:DMschedule输入:任务数量n、所有任务耗时序列work[n]①初始化totalTime=0②for i=0 to
2020-05-10 21:40:34 1733 1
原创 动态规划——最长公共子序列
动态规划——最长公共子序列设计与实现最长公共子序列问题的算法;解决思路首先需要明确子序列的概念,子序列与子串并不是一种东西,子序列我们可以理解为在一个序列中删除任意多个字符,剩余字符按原有顺序组成的序列就是原序列的子序列,其中删除的字符可以使连续的也可以是不连续的,对于任意一个字符来说,有删除与不删除两种选择,那么对于一个长为n的序列,他就有2^n个子序列。我们想求两个序列的最长公共子序列,最简单的方法就是生成一个序列的所有子序列,然后检查这些子序列是否是另一个序列的子序列,并找到最长的公共子序列。
2020-05-10 21:36:37 345
原创 动态规划——0-1背包问题
动态规划——0-1背包问题问题描述设计与实现求解0-1背包问题的动态规划算法;0-1背包问题:给定n个重量为w1,w2,w3…wn,价值为v1,v2,v3…vn的物品和容量为C的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大解决思路算法表述算法knapsack_dy输入:物品重量表weight[n]、物品价值表value[n]、物品个数n、背包容量n输出:最大价值①for i=0 to limit do② if weight[0] &l
2020-05-10 21:28:11 1008
原创 动态规划——矩阵链乘法
动态规划——矩阵链乘法设 A1, A2 , … , An 为矩阵序列,Ai 为 Pi-1 Pi 阶矩阵,i = 1, 2, … , n. 试确定矩阵的乘法顺序,使得元素相乘的总次数最少.*解决思路算法描述①初始化数组m[i][j]为0②for r=2 to n do③ for i=1 to n-r+1 do④ j=i+r-1⑤ m[i][j]=m[i+1][j]+ P_(i-1)P_iP_j⑥ s[i][j]=i⑦ for
2020-05-10 21:15:32 394
原创 分治算法——最邻近点对
分治算法——最邻近点对设计与实现查找平面上的最邻近点对问题的算法。解决思路如果说用暴力的方法来解决这道题,我们需要将所有的点两两进行比较,两层循环的时间复杂度为O(n),那么如何降低时间复杂度呢?如果空间中只存在一个点,那么就不存在最近点对,如果空间中只有两个点时,最近点对就是这两个点,那么当空间中有三个点时,我们便可以将空间划分为两个部分,左半部分有两个点,右半部分有一个点,那么我们就可以将问题划分为求左半部分,右半部分以及交界处的最近点对的最小值。可是当点越来越多的时候,我们应该如何求得两个子控件
2020-05-10 20:41:26 2709 2
原创 分治算法——求逆序对数
分治求逆序对数问题描述在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他对各种不同信息的兴趣,从而实现个性化服务。对于不同的排名结果可以用逆序来评价他们之间的差异。考虑1,2,……,n的排列i1,i2,……in,如果其中存在ij,ik使得j<k但是i1>ik,那么就称ij,ik是这个排列的一个逆序。一个排列含有逆序的个数称为这个排列的逆序数。设计和实现统计逆序的分治算法,并对算法进行时间复杂度分析。解决思路寻找数组中的逆序对数,暴力的做法就是
2020-05-10 20:32:16 2666
原创 查找中位数(分治策略)
问题描述设计与实现查找数组的中项问题的算法;解决思路 要找出一个数组的中位数,最简单的方法当然是将数组排序,但快速排序的时间复杂度也需要O(nlogn),我们可以寻找更快的算法来解决。首先对于一个长度为n的有序数组a[n],若n为偶数,则中位数为(a[n/2]+a[n/2-1])/2,若n为奇数,则中位数为a[n/2],那么问题的关键就是找到a[n/2]和a[n/2-1],然而这是在...
2020-03-30 17:30:48 12353 2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人