- 博客(60)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Java基础问题
一.for循环的流程问题:例题:package demo;public class testFor { static boolean foo(char c) { System.out.print(c); return true; } public static void main(String[] args) { int i = 0; for (foo('A'); foo('B') && (i
2020-10-28 10:10:02
217
原创 Java8新特性-Lambda表达式与Stream API
简介Stream是Java 8的新特性。Stream让开发者能够以一种声明的方式处理数据源,将处理的数据源看做一种Stream(流),Stream(流)在Pipeline(管道)中传输和运算,支持的运算包含筛选、排序、聚合等,当到达终点后便得到最终的处理结果。Lambda表达式简介简而言之,Lambda表达式可以用来实现匿名类,简化了代码。举例:测试用的函数式接口package algorithm;/** * 测试用的函数式接口(只有一个抽象方法的接口) * @author : kun
2021-03-01 14:49:04
214
原创 服务熔断与服务降级
服务熔断与服务降级微服务雪崩效应:在微服务项目中存在很多远程调用的情况,例如A调用B,B调用C,假如在某一时间C服务出现故障了,但是调用链路依然保持着,随着时间的推移,对B服务的调用积累的越来越多,造成B服务的崩溃,进而造成A服务的崩溃。服务熔断:服务熔断是应对微服务雪崩效应的一种微服务链路保护机制。 当调用链路的某个微服务出现故障时,会进行服务的降级,熔断该节点微服务的调用,对于后续请求统一调用兜底方法,当检测到该节点微服务调用响应正常后恢复调用链路。服务熔断流程:在一个时间窗内,当请求数及错
2021-02-18 17:26:23
286
2
原创 Spring - Bean生命周期
概述Spring Bean的生命周期主要分为以下四个阶段:实例化属性赋值初始化销毁我们可以从源码的doCreateBean()方法里,发现前三个步骤,关于销毁是在容器关闭的时候进行的。截取部分源码:在这四个主要的生命周期内,有很多的扩展点,下面我对这些拓展点进行分类说明:作用于多个Bean的接口InstantiationAwareBeanPostProcessor作用于实例化阶段的前后,执行对应的before和after方法。BeanPostProcessor作用与初始化阶段的
2021-01-26 17:40:28
146
原创 关于hashCode()和equals(),看这一篇就够了!
我们经常被问到hashCode()方法和equals()方法的用法,以及什么时候需要重写这两个方法的类似问题,本文是我对这两个方法的一些理解。一、equals()和"==" 提到equals()和"==",我们首先来理解一下它们的联系与区别。对于基本数据类型,==比较的是两边的值,对于引用类型,比较的是两个对象的地址是否相等。 equals()用来比较两个对象是否相等,如果我们不重写equals方法的话,用的是Object类里的eq
2021-01-07 17:33:08
239
原创 LeetCode题目:53. 最大子序和 解题思路及Java实现
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。解题思路:使用贪心算法即可。每次循环如果sum<0 直接将sum置为0即可。Java代码:public class Demo53 { public int maxSubA
2020-12-18 16:51:29
93
1
原创 事务隔离级别与脏读、幻读、 不可重复读
我们知道,事务的四大特性是A(原子性)、C(一致性)、I(隔离性)、D(持久性)。事务隔离级别就是为了满足隔离性的机制。在并发场景下,如果没有一定的处理方式,就会出现脏读、幻读、不可重复读三类问题。脏读:事务A在执行过程中,修改了某数据,事务B读取了修改后的数据,然后事务A进行了回滚操作,这个时候事务B读取到的数据就是"脏数据"。不可重复读:事务A读取了两次数据,在这个过程中事务B修改了这部分数据并提交,导致两次读取出来的数据不一样。幻读:和不可重复读有点像,事务A读取两次数据,在这个过程中事务B
2020-12-16 15:26:05
142
原创 内存泄露和内存溢出
内存泄露和内存溢出最近排查项目组问题的时候,收到了一些页面卡顿和内存溢出的问题,写一篇文章复习下内存泄露和内存溢出的知识。内存泄露:程序使用一块内存,但是并没有释放它,通过堆积最终导致内存溢出。通常是存在一些无法被GC回收的对象,这些对象没有作用,却会一致占用内存。内存泄露是代码层面的问题,可以通过修改我们的程序来避免。内存溢出:即程序在申请内存的时候,发现内存不够了。通常是因为JVM设置的内存过小、没有释放资源、一次性加载过多数据等等。解决办法可以分为两种:一是增大JVM内存,二是修改我们的程序,从
2020-12-14 17:25:25
164
原创 解读类加载、类初始化与实例化
要理解类加载和类初始化,必须了解类的生命周期,类的生命周期可简要概括为五个阶段,即加载、连接、初始化、使用、销毁五个阶段。类加载通常指类生命周期的前三个阶段:加载阶段:加载阶段就是把经过编译后的字节码文件加载进内存,即把类信息加载进jvm的方法区中,并在堆中创建一个Class对象,来作为类信息的入口。类加载的时机和虚拟机的实现有关,有的实现是在类被使用之前就进行加载,有的是在只有使用的时候才去加载,我们常用的虚拟机就采用了后面这种实现。连接阶段:连接阶段可细分为:验证、准备、解析三个阶段。验证:
2020-12-11 16:53:17
344
原创 IDEA使用.gitignore文件以及文件失效的解决办法
.gitignore文件我们本地的工程,有一些文件不需要加入到版本管理中,但是会出现在我们的列表里,这个时候就要用到.gitignore文件来过滤这些我们不想上传到仓库的文件了。文件格式举例:# Default ignored files/workspace.xml#忽略所有.svn目录.svn/#忽略所有target目录target/#忽略所有.idea目录.idea#忽略所有.iml文件*.iml.gitignore文件没生效原因是我们的本地已经有了原来不想纳入版本管理的文
2020-12-11 11:28:16
1317
2
原创 理解分布式CAP定理
CAP原理概念:C(一致性):指分布式系统中每个节点的数据备份在同一时刻保持一致。A(可用性):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。P(分区容忍性):系统不能在一定时间内完成数据的一致性的情况下(例如部分节点宕机、网络状况等),必须在C和A中做出选择分析与取舍:CAP三种特性无法同时满足,我们只能同时满足其中两个,对于分布式系统来说P是必须要成立的,否则就违背了分布式系统的初衷。CP:舍弃了A(可用性),就意味着要牺牲用户的体验,等待每个节点的数据备份都同步后,才允
2020-12-09 16:33:29
365
原创 LeetCode题目:49. 字母异位词分组 解题思路及Java实现
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。解题思路 :将每个字符串转为字符数组,然后用Array.sort()排序,排序后再转为字符串,作为key存储到hashmap中,hashmap的value是一个l
2020-12-07 22:25:17
144
原创 详细解读深拷贝与浅拷贝
深拷贝和浅拷贝clone()方法首先介绍一下拷贝的核心clone()方法,clone()方法和new关键字都会构建出一个新的对象。当我们使用new关键字来创建对象的时候,后面会跟要创建对象的类型,根据类型来分配内存空间,然后调用相应的构造方法,来填充对象的各个属性,这样对象就创建好了,我们可以使用它的引用,来进行操作。clone()方法创建对象需要依赖一个已经存在的对象,对象对应的类需要实现Cloneable接口(这个接口里面没有内容,起到了一个标识的作用,执行clone()方法的时候Jvm会检测对
2020-12-04 08:54:55
170
原创 LeetCode题目:48. 旋转图像 解题思路及Java实现
题目:给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例 2:给定 matrix =[[ 5, 1, 9,11],[ 2, 4, 8,10],[13, 3, 6, 7],[15
2020-12-02 18:14:44
206
1
原创 Java锁机制的理解(欢迎指正)
锁机制首先介绍一个重要的概念:CAS:即比较并设置,这个操作是原子的。首先进行比较,如果原值要进行更改,再更改之前会比较原值是否发生过改变,如果没有的话就会执行更改,如果发生过改变,就不会进行更改。一、乐观锁和悲观锁(宏观分类)从宏观角度,将锁分为了两类乐观锁:读取数据的时候,认为数据没有被修改,不会加锁。如果要更新数据的话,会检查从读取到要更新这段时间里,数据是否有改变,如果有,就重新读取,再次尝试更新,再次进行检查。适用于写操作比较少的情况。悲观锁:读取数据的时候,认为数据会被修改。每次读取
2020-11-30 15:12:48
106
原创 快速排序思路及Java实现
主要思路: 找一个标准数,将比标准数小的数放在它的左边,比标准数大的数放在右边,再利用递归思想,对左右两部分重复上述步骤。最坏情况下时间复杂度为O(n^2),一般情况下时间复杂度为O(logn)快速排序是不稳定的。体现在如果数组内有相等的元素,这些元素可能会改变位置。package algorithm;import java.util.Arrays;public class QuickSort { public static void quickSort(int[] arr,int st
2020-11-27 11:02:59
128
原创 docker基本命令
Docker概念Docker有三个基本概念:仓库(Repository),镜像(Image)和容器(Container)。仓库(Repository) 是一个集中存放镜像的空间。我们写的代码可以上传到Github仓库中,类似的,Docker的镜像就能上传到Docker Hub仓库,以便镜像的分发部署。Docker Hub是官方的公开服务,每个账号可以建立一个免费的私有仓库。镜像(Image) 是一个特殊的文件系统,其中存储了应用和环境的所有数据,镜像在构建之后是静态的,不可改变的。容器(Cont
2020-11-26 18:29:29
108
转载 dockerfile 与 docker-compose的区别
先简单理解 docker 的使用过程,它分为镜像构建与容器启动。镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。而如果涉及多个容器的运行(如服务编排)就可以通过 docker-compose 来实现,它可以轻松的将多个容器作为 service 来运行(当然也
2020-11-26 09:18:15
80
原创 LeetCode题目:46. 全排列 解题思路及Java实现
题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:回溯法。通过一个另外的数组来标记哪些位置上的元素被使用过了。代码:package top100;import java.util.ArrayList;import java.util.List;public class Demo46 { List<List
2020-11-25 17:05:55
124
原创 正则表达式
元字符:元字符注释.匹配除换行符外的任意字符\w匹配字母、数字、下划线、汉字\s匹配任意空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束限定符:限定符注释*重复零次或多次+重复一次或多次?重复零次或一次{n}重复n次{n,}重复n到更多次{n,m}重复n到m次转义:如果要匹配的字符串中包含了元字符和限定符等,在这些字符前加\进行转
2020-11-24 18:58:36
68
原创 LeetCode题目:39. 组合总和 解题思路及Java实现
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target = 8
2020-11-23 19:38:53
249
1
原创 Leetcode题目:34. 在排序数组中查找元素的第一个和最后一个位置 解题思路及Java实现
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]解题思路:给定的数组为排序好的数组,不需要再排序,要求复杂度为O(log
2020-11-18 11:14:48
135
原创 LeetCode题目:32. 最长有效括号 思路及Java实现
题目:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路:字符串转为字符数组,将所有可以匹配的字符数组的下标记录下来,找到最长连续数列的长度,就是最长有效括号的子串的长度。Java实现:package top100;import java.util.ArrayList;import j
2020-11-16 17:12:51
186
原创 LeetCode题目:23. 合并K个升序链表 解题思路及Java实现
题目:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = []输出:[]
2020-11-13 16:58:07
163
原创 LeetCode题目:22. 括号生成 解题思路及Java实现
题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]解题思路:深度优先遍历的实践,这里用递归实现。递归方法需要传入代码:package top100;import java.util.ArrayList;import java.util.List;public class Demo22 { pri
2020-11-12 16:07:27
174
原创 LeetCode题目:21. 合并两个有序链表 解题思路及Java实现
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:递归也很简单,这里先不用递归的方法,定义一个游标和虚拟头节点,游标先指向头节点,比较两链表的当前节点的值,取较小的那个节点赋给游标的next域,然后让游标后移一位,当任意一个链表遍历到头,让游标的next域指向另外一个链表当前遍历到的节点。代码:package
2020-11-10 16:20:38
141
原创 LeetCode题目:20. 有效的括号 解题思路及Java实现
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:栈的灵活运用。将字符串转为字符数组,遍历数组,遇到{ [ ( 分别将它们的反括号压入栈,遇到 } ] ) 就弹出栈顶元素,看是否和遍历到的字符一致,如果栈为空或者匹配不成功,返回false,最后返回的时候要判断栈里是否还有反括号。代码:package top100;
2020-11-09 18:26:15
134
原创 LeetCode题目:19. 删除链表的倒数第N个节点 解题思路及Java实现
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?思路:定义两个指针,第一个指针先后移n位,然后两个指针一起后移,当第一个指针到达链表尾部,第二个指针指向的就是倒数第n个节点的前一个节点。package code;public c
2020-11-05 15:58:17
188
原创 LeetCode题目:17.电话号码的字母组合 解题思路及Java实现
题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。思路:典型的递归题目Java实现:package code;import java.util.ArrayList;import jav
2020-11-04 20:44:11
111
原创 LeetCode题目:15. 三数之和 思路及Java实现
题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]思路:三数相加等于零等同于两个数的和等于另一个数的相反数。先将数组排序,方便遍历,然后定义三个指针,sum、left、right,sum指向
2020-11-04 20:37:21
839
原创 LeetCode题目:11. 盛最多水的容器 解题思路及Java实现
题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。如图:所求矩形面积的宽为较短的高度。(不能倾斜)思路:由于取的是较短的那个边的高度为矩形的宽,所以,定义两个指针,分别指向数组的左右边界,比较两边的大小,较短的边界向中间移动,每移动一次,重新比较两边的高度,计算矩形的面积,
2020-11-03 17:19:56
134
原创 LeetCode题目:5. 最长回文子串 解题思路及Java实现
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路:将字符串转为字符数组,定义两个指针,left和right分别指向第一个元素和第二个元素,right往后移,遍历数组,每次后移,判断left和right中间是否存在回文子串,存在的时候记录回文子串的长度和最左、最右两个字符的索引,下一次获取到回文子串的时候比较该
2020-11-03 16:20:47
146
原创 LeetCode题目:3.无重复字符的最长子串 两种解题思路及Java实现
题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。思路:题目要求找出的是长度,首先将字符串转为字符数组,然后定义两个指针,通过右指针遍历数组,右指针每后移一位,就判断它当前指向的元素和它与左指针中间范围的字符有没有重复的,如果存在,这时字串长度为right-left,让左指针指向那个重复元素的后一个元素,继续后移右指针,右指针移动的时候,一直记录最长子串长度,如果碰到前面有重复元素,子串长度为right-left+1。static int lengthOfLongestSubstrin
2020-11-02 09:15:47
190
原创 LeetCode题目:2.两数相加 解题思路及Java实现
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。例如:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路:题目里给的是各自的位数是按照逆序存储的,所以从低位开始相加,主要是要
2020-10-28 20:19:50
214
原创 LeetCode题目:1.两数之和 解题思路及Java实现
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。思路:两数的和已知,可以遍历数组,计算target减去数组元素的值,将它作为key,遍历到的数组元素下标作为value存到map中,下一次循环通过containsKey来查map中是否有可以和当前元素相加等于target的key,如果有的话取出value,这样一来就能取到两个下标了。代码:package cod
2020-10-28 20:09:56
185
原创 分布式session实现思路及代码
思路: 登录成功后,生成token来标识用户,写到cookie中,并传到客户端,客户端在随后的访问中都在cookie中传这个token,服务端拿到token后根据这个token获取对应的用户信息。 为了实现分布式session,用redis统一管理session信息。具体实现:首先在登录的时候需要生成token并写到cookie中。同时也将token和用户信息存到redis中。这里要注意设置过期时间。public void addCookie(Customer customer,HttpServl
2020-10-22 15:57:08
155
原创 关于ArrayList、LinkedList、Vector的总结和区别
ArrayList总结:ArrayList是List接口的一个数组的实现,随着向ArrayList中不断添加元素,其容量也自动增长非同步,线程不安全允许null元素,允许重复元素iterator和listIterator方法返回的迭代器是快速失败的。(快速失败fail-fast:在创建迭代器之后,除非通过迭代器自身的remove或add方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException。因
2020-10-21 17:20:53
107
原创 Java反射机制
概述最近在读公司框架源码的时候,多处用到了反射,现在写一篇文章来复习一下反射这部分的知识。反射的核心是JVM在运行时才动态加载类、调用方法、访问属性。如果你需要用到某方法,但是那个方法是私有的,这个时候你就可以通过反射去执行这个私有方法,并且获取私有变量。功能实现首先需要获取一个类的Class对象获取类的Class对象主要有三种方式:Person person = new Person();Class personClass1= person.getClass();Class perso
2020-10-19 14:45:16
71
转载 理解Java序列化
1.实现序列化:1)让类实现Serializable接口,该接口是一个标志性接口,标注该类对象是可被序列2)然后使用一个输出流来构造一个对象输出流并通过writeObect(Obejct)方法就可以将实现对象写出3)如果需要反序列化,则可以用一个输入流建立对象输入流,然后通过readObeject方法从流中读取对象2.作用:1)序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输与网络之间;2)为了解决对象流读写操作时
2020-10-16 10:15:13
65
原创 关于抽象类和接口的常见问题总结
首先抽象类里可以有抽象方法,也可以有具体的方法。如果子类是非抽象类,那么这个子类必须去实现父类里面所有的抽象方法(重写),而抽象类里的非抽象方法会被继承。另外,接口中所有的方法都是抽象的,接口中可以定义数据成员,但必须是常量。如果抽象类来实现接口,不必实现接口中所有的方法,其余方法可以交给抽象类的子类实现。也就是说,一个子类继承了某抽象类,这个抽象类又实现了某接口,抽象类中若没有实现接口中所有的方法,这些没有实现的方法就由子类实现。...
2020-10-10 10:41:46
410
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人