JAVA
Sirius_7
霍格沃兹在读学生
展开
-
Java HashMap中的getOrDefault(key, defaultValue)方法以及一些思考
写在前面其实最近发现很多api虽然使用的不是太多,但是真的还蛮有用的,可以极大的节省代码空间,避免代码冗余的情况发生。getOrDefault(key, defaultValue)这个api其实是在hashmap还比较常用的,从map中去取一个值的时候,如果该值存在,那么就返回该值对应的value,反之如果不存在,那么将会返回默认值:defaultvalue在一些特定的场景中,或者说特定的数据结构中这个api还是非常好用的。应用实例以力扣381题为例子说一下吧:题干设计一个支持在平均 时间复原创 2020-10-31 22:12:17 · 871 阅读 · 0 评论 -
Spring框架中的IOC初步理解
写在前面Spring框架中的IOC初步理解终于到了Spring框架的学习,看了一堆资料,几乎每种资料都会先去强调IOC的重要性。那么,什么是IOC???名词解释一波:inversion of control 反转控制。那么,深入的理解一下:反转什么?控制什么? ------反转创建对象的控制权:创建对象的控制权一直在我们手里,通过new方法即可。但是spring里面的ioc是将创建对象的控...原创 2020-09-15 16:12:54 · 149 阅读 · 0 评论 -
git命令详细记录
Git命令记录在这里对git的相关操作在这里详细记录一下,方便自己日后的复习操作。首先在本地指定目录创建git本地仓库:git init然后将指定的项目从远程仓库上git下来:git clone git@仓库地址接着查看当前分支:git branch根据实际的需要,创建自己的分支:git branch newbranch接着将自己创建的本地分支push到远程仓库去:git push origin newbranch...原创 2020-09-15 16:12:19 · 134 阅读 · 0 评论 -
希尔排序---一种特殊的插入排序(Java实现)
什么是希尔排序希尔排序也是一种插入排序,属于直接插入排序的增强,也被称为缩小增量的插入排序。基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难原创 2020-08-16 16:42:38 · 309 阅读 · 0 评论 -
<细节向>jdk1.8中HashMap底层链表转红黑树的阈值为什么是8?红黑树转链表为什么是6?
先看源码/* * Implementation notes. * * This map usually acts as a binned (bucketed) hash table, but * when bins get too large, they are transformed into bins of * TreeNodes, each structured similarly to those in * java.util.TreeM原创 2020-08-12 10:51:26 · 2585 阅读 · 4 评论 -
Java多线程之两个线程轮流打印
写在前面在整个Java多线程中,线程轮流进行某种操作可以说是非常常见的一种场景,下面以一道实际的场景题为例,进行总结记录。场景需求两个线程轮流打印内容:线程A:A线程B:1线程A:B线程B:2线程A:C线程B:3不多bb,上代码import java.util.ArrayList;/** * 多线程循环打印1A 2B 3C */public class testThread { // 用一个全局变量实现轮流输出的标志位 private static volat原创 2020-07-27 15:52:07 · 1920 阅读 · 1 评论 -
Thread线程类实体方法join( )的理解
写在前面这里总结一下主要是因为网上有关于join( )的一些介绍太过于稀碎,而且都是你抄我,我抄你,所以今天简单的总结一下。概述join( )方法,线程类的实体方法。用于在当前线程中加入其它线程运行。譬如在线程A中利用join( )加入线程B之后,线程A就会被阻塞掉,从而去执行线程B。当线程B执行完之后,线程A回到就绪态,等待cpu调度执行。原理很简单,底层通过调用线程类的静态wait()方法,让当前线程释放锁。测试一下给出一组测试用例:/** * 主要是来验证一下join()方法的运行机理原创 2020-07-23 17:07:55 · 198 阅读 · 0 评论 -
一文清晰梳理数据库锁机制
写在前面关于数据库锁机制的问题,目前网上的文章大多条理混乱,没有逻辑,故今天系统的梳理一下,也方便自己日后复习。加锁策略区分首先从大的方向去区分,即加锁策略上区分,分为了乐观锁和悲观锁:乐观锁:顾名思义就是非常乐观,非常相信真善美,每次去读数据都认为其它事务没有在写数据,所以就不上锁,快乐的读取数据,而只在提交数据的时候判断其它事务是否搞过这个数据了,如果搞过就rollback。乐观锁相当于一种检测冲突的手段,可通过为记录添加版本或添加时间戳来实现。悲观锁:对其它事务抱有保守的态度,每次去读数据都原创 2020-07-21 16:27:33 · 134 阅读 · 0 评论 -
关于MyBatis的Mapper.xml文件中resultType的问题
写在前面最近在实际业务开发的时候还是发现了一些问题的,现在特总结一下。问题来源关于mybatis内部返回查找或者组查找是返回list类型的问题:mybatis会自动把查找结果放入到一个list中的,所以你的resultType应该是写的list集合内部的元素的类型,而不是List类型。例如:在一个ids表中只有id列,且数据类型为Long;那么范围查找的语句可以是:select * from ids where id>=19 and id<=99;这个结果自动返回的就是一个Lis原创 2020-06-14 11:25:16 · 2810 阅读 · 0 评论 -
从ThreadLocal实际应用实例了解ThreadLocal
ThreadLocal是个啥?首先,官方的解释叫做:线程本地变量。这个解释给绝大部分人都是一头雾水。现在我用尽可能直白的语言来解释一下。ThreadLocal是Thread的属性threadlocals的管理工具,就是将一个变量拷贝给每个线程一份,每个线程对这个变量的操作是彼此独立的,不会相互影响。而threadlocals的底层则是一个ThreadLocalMap,这个Map的底层key值是ThreadLocal的虚引用,而Value则是实际的每个线程的所要使用的变量值。案例一:两个线程不适用Thr原创 2020-06-07 22:02:24 · 176 阅读 · 0 评论 -
剑指offer系列-----item53 判断一个树是否为对称二叉树
题干:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:思路1:做出此二叉树的镜像二叉树,和原二叉树进行对比,完全一样那么是对称的,反之不是思路2:就直接按照对称二叉树的定义逐层比较即可,这里使用第二种方法具体解法:class Solution { public boolean isSymmetric(TreeNode root) { return (root==null || judge(root.le原创 2020-05-31 16:10:06 · 112 阅读 · 0 评论 -
剑指offer系列-----item52 找出二叉树的下一个节点
题干:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针,即node.next的最终所指一定是二叉树的根节点。思路:思路1:首先中序遍历这个二叉树,然后把节点按照顺序放入到list内部,然后再根据传入的node进入到list中找下一个节点即可。思路2:直接一边中序遍历,一边找这个值,那么时间复杂度为O(N),空间复杂度可以降到O(1),主要的方法就是分情况进行讨论即可。具体的规律可以总结如下:仔细观察,可以把中原创 2020-05-31 16:06:21 · 111 阅读 · 0 评论 -
剑指offer系列-----item51 判断一个链表是否有环,如有找到入口
题干:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:思路有2:1.利用额外的空间记录链表中的节点,出现重复的节点便是循环入口;2.利用快慢指针,,慢指针一次移动一个节点,快指针是慢指针的速度二倍。二者相遇后,再取一个指针从表头出发,另外一个从相遇节点出发,二者再次相遇的点便是链表中的环入口。这里的思路1,较为简单,直接利用HashMap进行记录即可,关键是思路2,较为抽象,这里给出一个简单的证明:具体解法:方法1:import java.util.Has原创 2020-05-31 15:55:46 · 136 阅读 · 0 评论 -
走进serialVersionUID
serialVersionUID这玩意儿是个啥?为啥要用这玩意儿?在序列化中,serialVersionUID就相当于一把钥匙。在一个类或者实际对象被序列化之后,反序列化时一旦发现serialVersionUID不匹配,那么反序列化是不会成功的。所以这玩意儿就是一个认证工具。这玩意儿怎么用?如果自己不去申明自定义的serialVersionUID,程序会自动根据类的信息生成默认的serialVersionUID,这个serialVersionUID对类的细节要求非常高,一旦类发生变化,都有可能导致se原创 2020-05-31 11:28:19 · 193 阅读 · 1 评论 -
剑指offer系列-----item50 字符流中第一个不重复的字符
题干:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:思路:其实这道题和输出字符串中第一个不重复的字符是一样的(利用HashMap记录每个字符出现的次数),只不过这里是字符流。换句话说,这里的字符串并不是一次性给好的,而是一个一个输入的,并且输出的第一个只出现一次的字符也原创 2020-05-19 20:08:34 · 135 阅读 · 0 评论 -
剑指offer系列-----item48 构建乘积数组
题干:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)思路:此题目直接拿暴力法解决的,如果大家有好的方法,欢迎讨论。public class item53 { public static int[] multiply(i原创 2020-05-19 18:10:19 · 121 阅读 · 0 评论 -
剑指offer系列-----item47 输出数组中的重复数字
题干:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:利用hashmap记录每个数字的出现次数即可。这是一道非常简单的题目,故这里也就不再花费太多的时间描述,直接给出解决代码如下:import java.util.HashMap;/*输入一个数组,找出里面有无重复数,有的原创 2020-05-19 17:59:37 · 152 阅读 · 0 评论 -
剑指offer系列-----item46 求两数之和的问题
题干:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:首先可以明确,这种算数运算大部分都可以被位运算去代替。因为在计算机中是只有二进制数的,所有的加减乘除本身也是对二进制数的操作。具体我们来总结一下这道题的思路:不用加减乘除做加法题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号1、位运算1.解题思路使用位运算实现加法1、一位加法普通加法异或1 + 1 = 01 ^ 1 = 0(错误)1 + 0 = 11原创 2020-05-19 17:57:45 · 128 阅读 · 0 评论 -
解决不起眼而又危险的循环依赖问题
首先看下面代码:/*循环依赖问题的解决验证 */public class test2 { public static void main(String[] args){ A a=new A(); B b=new B(); a.b=b; b.a=a; }}class A{ public B b;// public A(){// b=new B();// } publi原创 2020-05-18 15:23:24 · 246 阅读 · 1 评论 -
剑指offer系列-----item46 求累加和问题
题干:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:如能使用乘除法,那么求和公式搞定。不能就要使用短路法进行解决:ublic class Solution { public int Sum_Solution(int n) { int sum=n; boolean b = (n>0) && ((sum+=Sum_Solution(n-1))&g原创 2020-05-16 15:55:41 · 135 阅读 · 0 评论 -
剑指offer系列-----item45 围成圈报数的问题
题干:有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)思路:实现围成一个圈,那么肯定是要循环的。循环的思路我认为有二:(1)循环链表;(2)循环队列(队尾出队头再进)这里为了方便原创 2020-05-16 15:43:29 · 168 阅读 · 0 评论 -
剑指offer系列-----item43 扑克牌顺子
题干:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在原创 2020-05-16 15:40:06 · 116 阅读 · 0 评论 -
剑指offer系列-----item42 反转输入的字符串
题干:将输入的字符串进行反转后输出思路:其实这种题目一看到就会去想到一种数据结构:栈。栈的特性是先进后出,所以将字符串按原顺序入栈之后,再出栈就可以实现该字符串的反转。具体代码如下:public class item43 { public static String ReverseSentence(String str) { Stack<String> reverseStack = new Stack<>(); String [] s原创 2020-05-16 15:14:25 · 102 阅读 · 0 评论 -
填坑向---补充上一篇博文中的深拷贝浅拷贝问题
利用序列化实现深拷贝//序列化实现深拷贝test_copy test857 = new test_copy(25,'T',new TreeNode(100));//将次对象序列化进入文件中ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/tmp/test2020"));out.writeObject(test857);out.close();//反序列化读出来test_copy test9896 =原创 2020-05-14 16:47:48 · 119 阅读 · 0 评论 -
你真的懂Java中的浅拷贝和深拷贝么?
写在前面:其实深拷贝和浅拷贝这个概念,不仅仅只是Java中独有的概念,很多地方都适用。目前网上的各种资料,对二者的描述我认为是模糊不清的,甚至有一些是错误的,简直是误人子弟!这篇博客主要是从源码角度总结一下浅拷贝和深拷贝的区别。概述:浅拷贝和深拷贝的概念都是针对对象而言的,且都是可以通过生成一个新的对象完成对原始对象的拷贝。那么区分的关键在什么地方:深、浅二字。1.浅拷贝浅拷贝的实现方法为重写继承制Object类的clone( )方法,见下:protected native Object clo原创 2020-05-12 20:53:55 · 216 阅读 · 1 评论 -
剑指offer系列-----item41 字符串循环左移
题干:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:直接用StringBuffer进行拼接,具体的拼接方法,要用左移位数对str的长度取余,取余结果为真正的移动位数,时间复杂度在O(n)。具体的代码如下:public class item42 {原创 2020-05-11 22:53:39 · 139 阅读 · 0 评论 -
剑指offer系列-----item40 递增数组中等于目标数的两个数
题干:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:这道题,其实和item39的思路蛮相似的,都是可以利用双指针来解决问题。只不过,item39的双指针是起始二者相邻,而这道题的双指针一个应该在链表首部,另外一个应该在链表末尾。具体代码见下:import java.util.ArrayList;public class item41 { public class Solution { publi原创 2020-05-11 16:54:55 · 135 阅读 · 0 评论 -
剑指offer--item39 连续几个数字等于目标数
题干:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路:这种连续的问题,自然想到双指针加滑动窗口。规定两个指针i,j。这段区域的和用等差数列求和为num即可。如果num<sum,那么要把j增加,即窗口原创 2020-05-11 14:33:15 · 146 阅读 · 0 评论 -
剑指offer系利-----item38 找出数组中唯一的两个只出现一次的数字
题干:一个数组,仅有两个数字出现一次,其他都是两次,找出这两个数字思路:思路:还是和当时的那道题目一样,用HashMap记录每个数字出现的次数,返回唯一两个get为0的数,加个flag分开即可整合以上思路后,源码如下:import java.util.HashMap;/*找出一个数组中的两个唯一出现过一次的数字,其他数组都出现了两次。思路:还是和当时的那道题目一样,用HashMap记录每个数字出现的次数,返回唯一两个get为0的数,加个flag分开即可*/public class item原创 2020-05-10 19:48:30 · 156 阅读 · 0 评论 -
听说你也要学SpringBoot?来看看我写的入门篇吧!
写在前面:SpringBoot作为业界优秀的框架,早已被各种大厂普遍应用,这得益于其优秀的性能和较为简便的配置。今天来总结一下SpringBoot的入门级配置。SpringBoot的环境搭建较为简单,主要分为三步:1.创建maven工程这点儿我就不多做赘述了~都懂滴2.在工程内添加SpringBoot的起步依赖如下<!-- 配置SpringBoot环境首先要添加SpringBoo...原创 2020-05-07 17:01:29 · 129 阅读 · 0 评论 -
剑指offer系列-----item37 判断一棵树是否为平衡二叉树
题干:输入一棵树,判断其是否为平衡二叉树思路:所以这道题本质思路是递归public boolean IsBalanced_Solution(TreeNode root) { if(root==null){ return true; } if(Math.abs(TreeDepth(root.left)-TreeDepth...原创 2020-05-07 15:17:18 · 143 阅读 · 0 评论 -
剑指offer系列-----item36 树的高度
题干:输入一棵二叉树,输出这棵树的高度。思路:这道题思路有2:1.利用BFS每层遍历时叠加高度因为在树的遍历中,BFS天生具有层级遍历的优势,那么在遍历每层的过程中去叠加一个高度,最后自然可以计算出这个二叉树的总高度。public int TreeDepth1(TreeNode root) { Queue<TreeNode> queue = new Link...原创 2020-05-07 15:13:27 · 93 阅读 · 0 评论 -
剑指offer系列-----item35 一个数组中某个数字出现的个数
题干:这是一道简单题,太简单了我就不写思路了,看源码就都能懂啦~/* 在排序数组中找目标数字出现的个数 一看到了排序,想到二分法,但是是统计个数,我认为不必二分,最差就是个O(n)的时间复杂度 */public class item35 { public int GetNumberOfK(int [] array , int k) { if(array...原创 2020-05-07 15:04:57 · 105 阅读 · 0 评论 -
剑指offer系列-----item34 第一个只出现一次的字符
题干:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路:HashMap记录每个字符和出现的频率(就只用1和2即可,省时省力),然后按顺序get,第一个get到1的字符返回即可,或者放一个变量自加,来确定下标。具体代码如下:public class item33 { ...原创 2020-05-07 15:03:17 · 115 阅读 · 0 评论 -
剑指offer系列-----item33 输出第n个丑数
题干:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:思路比较清晰,也是目前比较流行的一种思路,具体见下:因为这个number只包含2,3,5的因子,所以根据以2,3,5来做判断和维护。令number数组里的第一个元素为1。因为我们要让丑数数列有序,所...原创 2020-05-07 11:19:17 · 125 阅读 · 0 评论 -
想入门SpringBoot整合MyBatis,看我这一篇就够了
写在前面:MyBatis作为业界优秀的持久层框架,应用广泛,与各类web框架都有着良好的整合性。今天在博客里主要总结一下SpringBoot与MyBatis的整合入门,非常简单,放心看下去吧。1.添加MyBatis起步依赖在前几篇博客中提到了,起步依赖算是SpringBoot的一大特点之一。所以大部分优秀的组件与SpringBoot整合额第一步都是添加起步依赖。在pom.xml中添加:&l...原创 2020-05-06 15:33:01 · 305 阅读 · 2 评论 -
剑指offer系列-----item32 把数组排成最小数
题干:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:把数组变成String的list,然后两个两个比较,因为s1+s2的长度和s2+s1的长度是一致的,所以如果s1+s2与s2+s1的大小判断只需要判从首个字符开始即可(所以调用的String类的compar...原创 2020-05-04 16:33:46 · 117 阅读 · 0 评论 -
Java8中的Lambda表达式(一文秒懂lambdm表达式)
写在前面关于lambda表达式,网上的资料不少,但是仔细看一看就会发现,写的良莠不齐,且大部分博文的表达较差,词不达意,所以这里自己进行一次总结,方便日后复习。什么是Lambda表达式?lambda表达式,是Java作为面向对象的编程语言在函数式编程方面的一些拓展和优点合并。***Lambda 允许把函数(行为)作为一个方法的参数(函数作为参数传递进方法中)***。在lambda表达式子出...原创 2020-05-04 16:18:40 · 869 阅读 · 1 评论 -
剑指offer系列-----item31 从1到n个整数中,包含1的个数有几个?
题干:如题所示,从1到n个整数中,包含1的个数有几个?思路:这道题最最直接的思路应该是数学解答方法,即利用纯数学归纳总结出结果。但是有点儿复杂,且容易错。本文中采用递归法,对问题进行解答。首先给出代码如下:public int countDigitOne(int n) { return dfs(n);}private int dfs(int n) { if (...原创 2020-05-04 10:08:27 · 131 阅读 · 0 评论 -
剑指offer系列-----item30 一个数组的最大连续子序列之和
题干:输入一个数组,输出这个数组的最大连续子序列之和。思路:思路有2,第一种传统的动态规划思路。这种可以划分为多个子问题叠加的题目利用动态规划解决是最最经典的思路。具体代码如下:public int FindGreatestSumOfSubArray(int[] array) { int dp[]=new int[array.length]; dp[0]= array[0]...原创 2020-05-04 09:54:16 · 123 阅读 · 0 评论