自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 HashMap深度解析------奶妈型剖析

HashMap底层学习数据结构JDK1.8之前使用的是数组加链表的数据结构,JDK1.8之后使用的是数组加链表加红黑树,在链表长度超过8时候加入红黑树,红黑树的加入使得时间复杂度从O(n)变成了O(logn)基本属性//默认初始化容量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //最大容量static final int MAXIMUM_CAPACITY = 1 << 30;//默认的负载因子static

2020-08-16 10:16:33 266

原创 Leetcode 213-220刷题笔记(非困难题目)

213.打家劫舍2该题目和之前的打家劫舍有点类似,不过该题目是一个的家庭是环形(代表第一位和最后一位不能够同时盗窃)。讲这道题我们可以将环形进行拆分,既然首位不发同时获取到,那么我们不如将这个环拆分成两个单列表(一个不包含第一家,一个不包含最后一家),根据这个情况的话我们可以将两个单列进行两次打家劫舍,取最大值即可。注意:有两种特殊情况需要进行考虑一下,长度 = 0 / = 1,因为无法数组无法进行割舍。 public int rob(int[] nums) { if(nums.

2020-12-24 16:16:40 163

原创 Leetcode 191-210刷题笔记(非困难题)

198.打家劫舍题目要求两个相邻的家不能同时被偷(暗示偷窃需要间隔n个家(n >=1))。看到这种题目,我们很容易联想到使用动态规划的思想进行求解。我们声明一个dp数组用于保存偷窃到该户时,能够产生的最大价值。那么这个动态规划的状态转移方程式是什么?我们通过需要间隔可以发现,最基本有两种偷窃模式:偷窃当前门户,那么获得上上个的最大价值和当前门户的价值。不偷窃当前门户,则我们可以获得上一户的最大价值。就可以得出 dp[i] = Max(dp[i-1],dp[i-2]+nums[i])

2020-12-20 17:13:45 211 1

原创 Leetcode171-190刷题笔记(非困难题)

171.Excel表列序号该题目就有点类似于一个进位为26的一个进制转换的题目。 public int titleToNumber(String s) { int ans = 0; for(int i=0; i<s.length(); i++) { ans *= 26; ans += s.charAt(i) - 'A' + 1; } return

2020-12-19 15:36:54 253 3

原创 MVC和ORM模式

MVCModel(模型) View(视图) Controller(控制器):是一种软件的设计规范,将业务逻辑(Controller),数据部分(Model),显示部分(View)进行分离。Model常常是与数据库相关的部分(javabean)View通过View给前端进行数据的显示,比如我们查询一些数据的信息,需要显示给前端。Controller比如Servlet,我们通过Servlet获得数据,并进行处理,返回一个对应Model中数据给View。ORM全程Object-Relation

2020-12-18 15:28:24 359 1

原创 Leetcode 151-160刷题笔记(非困难题目)

151.反转字符串的单词该题目有点类似于字符串的反转,但是该题目需要保证的是字符串内的单词反转后仍然是原先单词,并且格式以“单词1 单词2 单词3”的格式(即需要去除多余空格)针对于这么频繁的字符串操作我们自然就想到使用的是StringBuilder类刚好他自带了一个reverse()方法用于字符串反转,剩下的部分我们只需要对空格进行处理和内部单词的顺序进行处理。1.空格部分我是用的计数法,对多次重复出现的空格采取删除。2.内部单词顺序我采用正常的字符串反转的方法,对其反转,则需要精准截取字符串即

2020-12-15 16:14:44 69

原创 Leetcode141-150刷题笔记(非困难题目)

141.环形链表该题目是判断该链表是否存在环形结构,我们可以使用额外O(N)空间对结点进行保存,看是否存在重复。也可以使用我们常用的快慢结点法,判断快慢结点是否会碰头。 //判断是否为环形链表 public boolean hasCycle(ListNode head) { //快慢指针法 ListNode slow = head; ListNode fast = head; while(fast != null &amp

2020-12-12 17:21:23 100

原创 Leetcode 131-140刷题笔记(非困难题目)

131.分割回文串该题目使用的是回溯法,在添加到集合前,我们需要判断一下是否为回文串,如果不是则不添加。在是否为回文串我们可以采用动态规划的思想,对这个字符串进行一个预处理。 //字符串拆分成回文子串 public List<List<String>> partition(String s) { List<List<String>> lists = new ArrayList<>(); if(s.

2020-12-10 16:59:31 97

原创 Leetcode 121-130刷题笔记(非困难题目)

121.买卖股票的最佳时机该题目是只允许买卖一次股票,那么就对于我们买卖的时机需要斟酌。我们买卖股票肯定不能选择亏本生意,所以说必须买入 <= 卖出,并且买入要晚于卖出。根据这一特性,我们通过一个 min 的变量标记最低点,如果碰到比最低点还低的值,那么我们就可以选择更换最低点,不然则用以前的 min 计算卖出利润。 //卖股票最佳时机 public int maxProfit(int[] prices) { int ans = 0; //标记一

2020-12-09 16:10:18 95

原创 Leetcode111-120刷题笔记(非困难题目)

111.二叉树的最小深度该题目和之前的最大深度有点类似,但是该题目因为是求的是从根节点出发到最近的一个叶子结点,所以当我们出现结点只有一边子树的时候,我们需要走单边,而不是碰到了子树就返回,那么算出来的结果就是有问题的(举例是树退化成链表的样式) //树的最小深度(从根结点出发,到达最近的叶子结点的结点个数) public int minDepth(TreeNode root) { if(root == null) { return 0;

2020-12-06 16:08:09 94

原创 Leetcode 101-110刷题笔记(非困难题目)

101.对称二叉树该题主要就是通过比对对应位置的值是否相同,难点在于如果选取对位(因为是对称),通过观察我们可以发现,他是两个节点比对结束后,一个的左子树和另一个的右子树进行比对,比对结束后在比对前一个的右子树和现在的左子树,通过这带点我们可以发现关系。在这里插入代码片 //对称的二叉树 public boolean isSymmetric(TreeNode root) { return compare(root,root); } public boole

2020-12-05 17:09:27 124

原创 Leetcode 91-100刷题笔记(非困难题目)

91.解码方法该题目有点类似于与跳台阶问题,使用的是动态规划算法。我们可以选择截取后面一位,或者截取后面两位,如果后面一位符合逻辑则加上前面的dp值,两位也是一样的。1.一位需要保证值 > 02.两位需要保证 10 <= 数值 <= 26满足以上条件才能说明是合格的编码,才能够截取。 //解码(动态规划) public int numDecodings(String s) { int len = s.length();

2020-12-03 16:06:34 138

原创 Leetcode 81-90刷题笔记(非困难题目)

81.搜索旋转排序矩阵2该题和之前的也是类似,区别在于该题存在重复元素的可能性,所以需要针对这个重复元素进行一个处理,其余部分的思路和以前的那个题目是一样(二分法)该题针对重复元素,我这里是选择跳过,直到遇到非重复元素为止。 //搜索旋转数组的变种(包含重复元素) public boolean search(int[] nums, int target) { int left = 0; int right = nums.length - 1;

2020-12-02 15:29:43 96

原创 Leetcode 71-80刷题笔记(非困难题目)

71.简化路径该题目就是使用了一个双向队列进行操作,没有什么难度 public String simplifyPath(String path) { String[] change = path.split("/"); Deque<String> deque = new LinkedList<>(); for(int i=0; i<change.length; i++) { if(change[i

2020-12-01 15:42:59 86

原创 Leetcode61-70 刷题笔记(非困难题目)

61.旋转链表该题目我们的主要思路可以从旋转链表 -> 找到链表环的断开位置。1.首先需要将链表成环,并且记录链表长度。2.将旋转次数进行缩减(比如转几圈和转一圈的位置是一样的),使用于length取余的方式。3.寻找断开点 public ListNode rotateRight(ListNode head, int k) { if(head == null) {return null;} //将链表成环 ListNode temp =

2020-11-30 16:39:05 82

原创 Leetcode 51-60刷题笔记(非困难题目)

53.最大子序和该题目主要的思考就是在遍历数组时候是否考虑加上前面数组。例如样例 [-2,1,-3,4,-1,2,1,-5,4]我们从 下标 1 开始遍历,此时prev数组 = -2,那么此时我们如果将 -2 加入子数组中那么会导致综合减少(因为prev数组和 < 0),所以此时应当将 1 作为新子数组的头部,继续向后遍历(此时需要记录最大子数组和的值) //最大子数组和 public int maxSubArray(int[] nums) { if(nums.l

2020-11-29 15:34:48 80

原创 Leetcode 41-50刷题笔记(非困难题目)

46.全排列全排列的概念我们在高中就学习过了,就题目所给的[1,2,3]三个数的全排列我们都知道一共有3 * 2 = 6个。简单点就是第一位有3种选择,第二位有2种选择,第三位只有1中选择,所以是3 * 2 * 1 = 6。根据上面我们可以思考得到,其实就是针对每一位的放置需要进行特殊的考虑。所以该题的话,我们可以采用回溯算法,通过更改对应位置(第一位,第二位。。。)的元素并添加到list中,并且递归到下一位(此时可选元素会 - 1),这样的方式完成该题目 //全排列 public

2020-11-28 16:50:03 81

原创 Leetcode31-40刷题笔记(非困难题目)

33.搜索旋转排序数组一看到这种排序数组 + 搜索的题目,我们应当直接联想到二分查找(专门针对于有序的Logn快速查找)。二分查找基本思路就是通过有序性使得每次搜索都可以丢弃一半的元素,从而达到高效的搜索策略。但是这道题有点区别在于,虽说他是有序的,但是他是经过了一定的旋转,所以导致不是完全的有序,应该说是一种部分的有序。我们在进行二分查找的时候,将数组一分为二以后,一定会有一半是完全有序,一半是部分有序(也可能刚好完全有序)。例如:4,5,6,7,0,1,2left = 0 right =

2020-11-27 17:33:59 268

原创 Leetcode 21-30 刷题笔记(非困难题目)

21.合并两个有序链表该题目思路十分简单,就是两个指针指向两个链表即可然后进行比较结果从而指针移动,这里直接放上代码。 //合并两个有序链表 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode head = new ListNode(); ListNode temp = head; while(l1 != null && l2 != null)

2020-11-24 16:23:45 109

原创 TCP拥塞控制

1.拥塞的定义计算机网络中的带宽,交换机中的缓存和处理机等,都是网络的资源。在某段时间,若对网络的资源超过了该资源所能承载的可用部分,网络性能会变差,这就是拥塞。2.拥塞控制拥塞控制就是防止过多的数据注入网络中。拥塞控制是一个全局性的过程,与流量控制不同,流量控制是端对端通信的控制。2.1.慢开始发送方维持一个拥塞窗口cwnd的状态变量。拥塞窗口的大小取决于网络带宽的拥塞程度,并且是在动态变化。发送方让自己的发送窗口等于拥塞窗口,但是考虑到接收方部分,发送窗口可能小于拥塞窗口。慢开始:算法思想是

2020-11-21 17:30:20 293

原创 G1垃圾回收器-----基本知识及原理解析

G1介绍(Garbage first)G1主要面向的是服务端的垃圾回收器。在G1之前,JVM的主要垃圾回收器采用的是物理分代的思想,将内存区域严格的划分成年轻代(young GC)和老年代(major GC),然后针对于年轻代和老年代使用不同的垃圾回收器进行GC操作,直到G1,G1采用的是对整个堆进行回收,并且G1使用的分区region思想将内存划分成了许多的分区。虽说G1不使用严格将内存分为年轻代和老年代,但是在逻辑层面G1还是将分区region贴上了标签Eden,Survivor,Old,也是一种分

2020-10-15 11:20:28 2501

原创 Kafka基本知识

Kafka特点1.高吞吐量,低延迟。2.可拓展性:集群支持热拓展。3.持久性:消息被存储在硬盘中,支持数据备份。4.容错性:允许集群结点失败。5.高并发:支持上千个客户端进行读写。Kafka的组成broker:kafka的节点(服务器)topic:用于存储消息的逻辑概念,实际存储消息的是topic中的patition(分区),一个topic可以拥有多个partitionpartition:用于存储消息的真正位置replica(副本):每一个partition都会有一个或者多个replic

2020-10-14 21:55:13 190

原创 缓存与数据库双写一致性问题

前言首先我们需要知道现在的访问90%甚至更多为读请求,剩余部分才是写请求,并且随着目前网络的发展,使得数据库逐渐无法承受住用户的请求,所以现在的企业都会在数据库访问前引入一层或者多层缓存用来处理读请求(通常使用Redis)。虽然缓存即为有效的提高了读多写少的场景的效率,但是遇到写请求的时候,就需要考虑一个问题,缓存和数据库的数据两个问题的双写一致性问题。双写一致性问题首先针对于数据库只存在写操作,但是针对于缓存的话我们有两种选择(删除缓存,更新缓存),如何选择写缓存的操作也十分关键。因为缓存和数据

2020-10-14 09:17:48 132

原创 Redis知识整理-------保姆级教学

1.Redis介绍redis是一个单线程的、开源的key-value存储的数据库,具有以下特点:1.redis支持持久化,能够将数据存放在磁盘中,待下次开启时候再次加载。2.redis具有丰富的数据结构:string,liist(双向),set,zset,hash3.redis支持数据备份,即master-slave(主从模式)Redis的优势:1.基于内存操作,读写速度快,2.支持事务,操作具有原子性。3.支持过期,发布订阅。4.redis通过队列完成了串行访问,减少了传统数据库对串行访

2020-10-11 14:42:06 151

原创 Leetcode 11-20刷题笔记(非困难题目)

11.盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。解题思路:本题针对这种有两条边界的问题,一般都会想到使用双指针方法。主要的算法考虑好后,那么就就需要针对问题进行判断如何让指针进行移动。这里因为我们需要求的是最大的盛水量,然后该题

2020-10-09 18:20:52 501

原创 Leetcode 1-10刷题笔记(非困难题目)

1.两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解题思路:1.暴力枚举,不做介绍,时间复杂度O(N^2)2.hash运算,也是一种分治法思想,将两数之和的运算可以拆分成在选

2020-10-08 18:55:58 216

原创 设计模式(创建型)-------------原型模式-------------保姆级教学

定义原型模式其实就是对对象的拷贝,原型体现在和原来的对象完全一致。应用方面的话对于一个复杂的对象如果我们有多个方面需要对其进行修改操作并且操作之间相互隔离,此时就需要原型模型。浅拷贝首先我们需要编写一个用于测试的类package design_pattern.prototype;import java.util.Date;//实现Cloneable接口有点类似于序列化接口,只是用于标识,没有具体的方法需要实现public class People implements Cloneable{

2020-10-03 15:14:05 73

原创 设计模式(行为型)----------模板方法模式--------保姆级教学

定义通过定义一个模板结构,该结构中如果是子类都需要的方法则在模板抽象类中完成,如果是需要子类进行重写的方法(即多样性方法),则将方法的实现延迟到子类中(即定义为抽象方法)。具体实现这里我通过炒菜的过程来简单代表模板方法的实现1.首先我们需要定义一个模板(模板一定是一个抽象类)package design_pattern.template;/** * 模板方法模式 * */public abstract class AbstractCook { public void pourO

2020-10-02 16:45:12 95

原创 设计模式(行为型)--------策略模式--------保姆级教学

定义通过编写一个公共接口,让具体算法实现该接口的方法,使得各个算法可以无缝替换并且不影响客户端。策略模式就相当于将算法和本身类所解耦,之后我们会将所有算法对象赋值给父类接口。这样客户端可以通过需求的改变从而更换自己的算法(算法本身无法决定选择哪一个算法,而是由客户端选择使用那一种算法)具体实现(样例)1.首先我们需要定义一个公共接口,实现该接口的类实现抽象方法即为算法的具体实现。(我这里写的是一个根据不同节日,商铺会进行不同折扣的打折促销活动)package design_pattern.stra

2020-10-02 16:30:06 70

原创 设计模式(创建型)----------建造者模式------------保姆级教学

定义将一个复杂对象的构建和定义分离,使得同样的构建过程通过传入参数不同可以创建不同的复杂对象。这个构建过程中是用户不知道的,用户只管获取到目标复杂对象。具体实现(样例)1.我们需要创建一个复杂类(即目标复杂类),这里我的复杂类为主机。package design_pattern.builder;public class Computer { public String CPU; public String mainBoard; public String hardDis

2020-10-02 15:58:07 93

原创 Git配置和使用

下载去官网下载速度很慢,建议使用淘宝镜像下载淘宝镜像下载Git配置(使用git bash即Linux 命令行进行操作)基本命令git config -l:显示本地git配置git config --system --list:显示本地git系统部分配置(配置文件在安装目录Git/etc/gitconfig文件中)git config --global --list:显示本地git用户部分配置(配置文件在用户路径下的.gitconfig文件中)配置命令配置用户(必须)git con

2020-09-20 19:49:28 375

原创 类加载和类加载器部分讲解

使用new关键字实例化对象时

2020-09-10 15:22:35 211 2

原创 I/O-----多路复用-----select,poll,epoll讲解

必知部分我们都知道Linux下一切皆文件,如果要对数据进行操作,那么我们就需要打开对应的文件,文件描述符为一个非负整数,每个进程在自己的PCB中存放了一张文件描述符表,而文件描述符就是这个表的索引,用于寻找对应的文件。fd:文件描述符。0代表标准输入,1代表标准输出,2代表标准错误。select()select()函数主要任务就是用于监听多个文件描述符的属性的变化。select()监听的文件操作符有(可读操作符,可写操作符,异常操作符),调用select()后会阻塞在这里,直到有事件发生(即可读、可

2020-09-09 21:04:25 131

原创 操作系统-------基本知识汇总

前言针对于本博客内容仅用于面试方面知识进行一个汇总,并不代表所有操作系统的内容。(说到底就是要面向面试学习了)正文操作系统基本名词并行并行是指同一时刻,能够执行多个线程或者进程。(并行需要多个CPU或者多个核心,让不同的进程或者线程在不同的位置执行)并发宏观上是指一个CPU或者一个核心能够执行多个进程或者线程,微观上是指在一个核心内通过调度算法(例如轮询,时间片)使得多个进程或者线程看起来像是同时进行。(实际上是切换速度太快了,但是实质上仍然是只能执行一个)共享共享是指系统内的资源可以被并

2020-09-04 11:34:51 208

原创 关于static和继承重写问题的部分讲解

前言写这个内容是因为我自己小看这个static和重写的学问了,在刚才笔试中出现了不少疑问选项,发现自己的知识盲区,所以在这里进行一个统一讲解。(内容可能有点杂)staticstatic是静态的修饰符,可以修饰类,类的方法,类的属性。static修饰类static修饰类的话,只能够修饰内部类。非static内部类众所周知,如果向在外部获取内部类的对象,必须通过外部类的一个方法间接获取,无法直接new出来。static内部类的话,就可以直接new出来。但是针对于static内部类,直接new也分两

2020-08-31 17:49:04 211

原创 链表反转------Java实现

主要思想根据链表反转,一般大家容易想到的解决方式可能是使用一个栈将每个节点遍历,然后弹出第一个栈顶设置为head,后面依次指向,并且更改最后一个结点的next = null(不更改的话,那最后一个结点会指向倒数第二个结点,而倒数第二个结点又指向最后一个结点,即循环指向)。因为上述方法实现起来非常简单,但是需要使用一个格外的Stack用于保存结点。我这里是使用递归的方法,下面说一下主要的设计思想。首先,因为我们是需要对链表进行反转的,所以肯定是需要递归到尾结点(即递归出口),而且在找寻到尾结点之前是不能

2020-08-27 15:14:55 116

原创 排序算法-------Java实现------保姆级教学

排序算法冒泡排序冒泡排序对大家来说应该是非常不陌生吧,这个排序算法的思路也是十分的简单,主要是以趟作为单位,每趟通过相邻的两个数组元素比较选出一个最大(最小)的数放在数组的最后。(可能唯一需要注意的就是只需要进行数组元素数 - 1 趟即可完成排序)这个因为实在太简单,直接上代码package sort.test;import java.util.Arrays;public class TestBubble { public static int[] arr = {4,10,22,5,

2020-08-26 17:35:18 136

原创 Java----NIO讲解------保姆级教学

序章在将NIO之前,我们必须要了解一下Java的IO部分知识。BIO(Blocking IO)阻塞IO,在Java中主要就是通过ServerSocket.accept()实现的。NIO(Non-Blocking IO)非阻塞IO,在Java主要是通过NIOSocketChannel + Seletor实现的。AIO(Asyc IO)异步IO,目前不做学习。BIO简单实现服务器和客户端package net.io;import net.ByteUtil;import java.io

2020-08-25 17:03:11 357

原创 计算机网络------系统学习

计算机网络----概念计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。计算机网络----性能指标1、速率计算机发送出的信号都是数字形式的。比特(bit)来源于binary digit,意思是一个”二进制数字“,因此一个比特就是二进制数字中的一个1或0。比特也是信息论中使用的信息量的单位。网络技术中的速率指的是数据的传送速率,它也称为数据率或比特率。速率的单位是bit

2020-08-21 17:49:59 2437

原创 MySQL知识系统学习(SQL篇)--------保姆级教学

SQL语句部分针对数据库操作查看所有数据库(返回所有数据库的名字)show databases查看当前数据库(返回当前数据库名字)select database()创建数据库create databases 数据库名 charset = UTF-8

2020-08-20 19:55:29 186 1

空空如也

空空如也

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

TA关注的人

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