自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 利用反射实现简易IOC工具

定义一个注解用于放在属性上面给属性赋值@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Property { String value();}定义工具方法,根据提供的类全名以及类属性上注解上的值将对象创建出来(这个工具这里只能处理属性为基本数据类型的自动注入。仅仅当作一个...

2020-04-16 19:29:04 342

原创 策略模式

假设这样一个场景:有一个银行,用户可以办理业务,用户身份有普通客户,土豪,和VIP客户,不同的用户有不同的办理业务过程。我们用来模拟一下。银行:public class Bank { //欢迎普通用户 public void welcome(OrdinaryUser user){ user.doSomething(); } //欢迎土豪用户...

2020-04-16 16:59:59 225

原创 哲学家就餐问题-多线程并发死锁现象

假设下面一个场景:4个哲学家,同坐一张方桌子,共2双筷子,4只筷子;每只放在桌角处,每个哲学家有可能拿到1只,1双,或者没有拿到的情况,只有拿到一双时才能开始用餐;没有一个哲学家能用餐成功的时候就处于僵持状态。使用多线程模拟public class Philosopher extends Thread{ private String name; private C...

2020-04-15 22:20:02 431

原创 Java IO实现单个文件,文件夹的复制

单个文件复制这里需要用到的是字符型文件输入流 (FileInputStream) 和字符型文件输出流 (FileOutputStream)。public class FileUtil{ public static void copyFile(String originalFilePath,String targetPath){ File originalFile = n...

2020-04-15 18:45:46 175

原创 生产者-消费者模型(wait()、notify()、notifyAll()、synchronized的使用)线程安全问题

在刚接触Java线程的时候,对于wait(),notify()以及notifyAll()方法,synchronized修饰符并不是很了解,后面学习到一个例子也称作为生产者消费者模型,下面通过这样一个模型来进行进一步理解线程安全相关的知识。模拟这样一个场景:有一个中心仓库,生产者将生成的商品放入仓库中,而消费者则可以在仓库中获取商品。消费者可以有多个。实现过程:模拟一个仓库:(为了...

2020-04-15 17:58:00 142

原创 String的不可变特性、内部存储结构、重写至Object的几个方法

一、 不可变特性,内部存储结构说到String字符串,可以语义的理解为将一系列字符(char),然后将串在一起,就是字符串了。可以猜测到String的底层也许就是这样构建出来的。 如下:进入源码发现内部结构其实就是一个字符型数组(char[])呈现的,所以字符串中的字符都是拆分成单个字符存入数组的。String字符串又称为不可变字符串;相对应的有可变字符串StringBuilder(...

2020-04-15 15:22:33 219

原创 对于Java枚举的理解

一,Java枚举其实本质是一种特殊的类特殊在于:对于一般的类在定义时是不确定实际使用的时候到底会创建多少个对象,可以具需求不定量的创建其类对象。而枚举是在类定义的时候可以确定对象个数的( 也就是说可以一一列举出来的,固定的数个对象 )。二,通过普通的类描述,简单模拟枚举的特点,从而理解枚举1.枚举的特点是对象个数是确定的,所以首先我们需要确保构造方法私有,才能确定对象不能随意被创建。2.再...

2020-04-13 23:06:35 187

原创 使用Scanner类控制台输入时出现直接跳过输入过程问题

在之前学习java 的时候,有用到过这样一个类Scanner用于在控制台输入内信息,但是在输入的时候偶然出现过一个问题:举个栗子:Scanner input = new Scanner(System.in);System.out.println("请输入姓名:");String name = input.nextLine();System.out.println("请输入学号:");i...

2020-04-10 14:10:39 2362 8

原创 判断字符串是否为空:出现NullPointerException?

在撸代码过程中判断字符串是否为空的时候你是否遭遇过这样一个问题: NullPointerException,不瞒你说,我是踩过这样的坑,555!!!判断字符串非空一般都有这几个条件: str!=null , !str.isEmpty() , !"".equals(str) ,此处的isEmpty() 和 equals(); 其实效果是一样的,其实都是判断判断字符串长度为0...

2020-04-10 12:12:11 673

原创 Java包装类Integer-----那些年我们一起踩过的坑

包装类砸们并不陌生,在实际开发过程中也比较常用,似乎特别容易上手,上来就是Integer.paretInt("123")........... 会用说明它自身封装得比较完善且优化了。从而比较方便了。但是会用就代表你真正理解它本身吗?不见得。

2020-04-09 13:29:52 542 1

原创 Java基本数据类型之初始化可能遇到小坑

Java的基本数据类型其实我们并不陌生,从存储的所占内存从小到大依次是 : byte(字节型)【8bit】, short(短整型)【16bit】, int(整型)【32bit】, long(长整型)【64bit】, float(单精度浮点型)【32bit】, double(双精度浮点型) 【64bit】。在开发的过程中很多时候定义一个变量不会直接自己初始化赋值的,而是直接将某个方法产生过程的结果...

2020-04-02 20:39:29 252

原创 web项目中上传的图片项目重新部署之后被清空如何解决?

前言:我们在web项目中经常有上传图片的功能,上传的图片存在哪里呢?存储方式一般有:存入数据库中,跟随项目相对路径中,还有就是再专门设计一个图片服务器用于图片处理。当图片量大的时候,或者查询数据量大的时候,非常的影响性能,数据库显然不太推荐使用。对于小项目来说,再另外特地为图片操作开一个服务也不太现实,维护等也都比较麻烦。在小项目中,对于每一个体验用户,上传的图片可能...

2020-03-20 16:32:37 938 1

原创 利用bootstrap实现消息提示框的自动弹出与关闭

- 相关的依赖: <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script...

2020-03-16 17:53:59 3078

原创 动态规划之变态青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:(递归思想)贪心算法表达式:f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4) + f(n-5) + … + f(2) + f(1)代码实现:public class Main3 { //f(n) = f(n-1) + f(n-2) ...

2020-03-11 16:39:41 334

原创 动态规划之青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:(递归思想) 要想到达第n阶必须先到达n-1或者n-2台阶处,计算到达n-1和n-2的跳法表达式: f(n) = f(n-1) + f(n-2)代码实现:public class Main { //要跳到上n级台阶,那么在这之前,青蛙必须跳上n-1 或者 ...

2020-03-11 16:36:29 543

原创 动态规划之斐波那契数列

现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。思路:(利用递归思想)表达式:f(n) = f(n-1) + f(n-2)代码实现:public class Main1 { public static void main(String[] args) { //System.out.println(fibo(10)); } //求...

2020-03-11 16:27:04 152

原创 图的广度优先搜索

代码实现//图节点public class MapNode { public String val; public List<MapNode> neighbor;//记录周围的点 public int index; public MapNode(String val, int index) { this.val = val; ...

2020-03-11 16:13:00 141

原创 图的深度优先搜索

代码实现://图节点public class MapNode { public String val; public List<MapNode> neighbor;//记录周围的点 public int index; public MapNode(String val, int index) { this.val = val;...

2020-03-11 16:07:08 151

原创 树的广度优先搜索

代码实现 //普通树结点 public class MapNode { public int val; public List<MapNode> neighbor;//表示当前节点的所有分支节点 public MapNode(int val) { this.val = val; neighbor = ...

2020-03-11 16:00:07 252

原创 树的深度优先搜索

不同于二叉树,普通的树可以有多个分支。需要将所有分支装在一个集合中,并逐一递归搜索。代码实现: //普通树结点 public class MapNode { public int val; public List<MapNode> neighbor;//表示当前节点的所有分支节点 public MapNode(int val) { ...

2020-03-11 15:44:26 463

原创 二叉树的左右双旋和右左双旋

上节我们有讲到用单旋构建平衡树,但是单旋存在局限情况,现在我们来探讨双旋(左右双旋|右左双旋) 。如下图,一颗较为特殊二叉排序树:利用单旋的方式构建一下:最后的结果我们会发现并没有达到平衡效果。然后我们我们使用双旋的方式来构建一下:可以看到成功构建成平衡二叉树了。双旋(左右双旋|右左双旋)代码实现:/** * 二叉树结点 */public class Tre...

2020-03-11 14:38:14 1324 1

原创 二叉树的左旋与右旋

对于在一颗结点和层数比较多的二叉树上查找一个元素时, 二叉排序树的查找效率远远高于一颗普通的树。如下为普通二叉树和二叉排序树:假设查找结点20在普通二叉树上查找: //查找结点static int ct = 0;//记录比较次数public static boolean isExistTreeNode(TreeNode root, TreeNode target){ i...

2020-03-11 13:03:35 3154

原创 二叉排序树的构建

什么是二叉排序树?官方的定义如下:1)对于一棵树,若左子树不空,则左子树上所有结点的值均小于它的根结点的值;2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;3)左、右子树也分别为二叉排序树;4) 没有键值相等的结点。举个例子:如下图可以发现满足上述条件,所以可以称之一颗二叉排序树。如何用代码构建一颗二叉树呢? 往下看代码实现我们来通过其特点随机生成一颗二叉排序...

2020-03-10 16:39:50 4222

原创 克鲁斯卡尔算法生成最小生成树

举个最小生成树的例子:在一个地区有很多个小村庄,并且每个村之间都可以修路进行连通。实际上,每条路由于地形不一样,所需的经费不同,并且不可能每两个村庄都直接互通,可以间接互通,从而降低经费。如何实现呢?这时候最小生成树的作用就体现出来了。如下图:(每个点代表一个村庄,边上的值代表修路所需经费)生成最小生成树的方法最经典的有两种:普利姆算法和克鲁斯卡尔算法 。下面我们来说说克鲁斯卡尔算法算法...

2020-03-10 16:01:51 3723

原创 普利姆算法生成最小生成树

举个最小生成树的例子:在一个地区有很多个小村庄,并且每个村之间都可以修路进行连通。实际上,每条路由于地形不一样,所需的经费不同,并且不可能每两个村庄都直接互通,可以间接互通,从而降低经费。如何实现呢?这时候最小生成树的作用就体现出来了。如下图:(每个点代表一个村庄,边上的值代表修路所需经费)生成最小生成树的方法最经典的有两种:普利姆算法和克鲁斯卡尔算法 。下面我们来说说普利姆算法。通过...

2020-03-10 15:09:41 1319

原创 二叉树的广度优先搜索

二叉树的广度优先搜索无法匹配先中后序遍历任何一种方式,实际上就是按每一层结点进行搜索。我们可以借助于集合作为每一层的中间变量进行操作。eg:构建二叉树并进行广度优先搜索: public static boolean bfs(TreeNode root, int target){ ArrayList<TreeNode> roots = new ArrayL...

2020-03-08 13:54:27 2178

原创 二叉树的深度优先搜索

构建二叉树并进行深度优先搜索:深度优先搜索的原理其实就是利用先序遍历的原理eg:public static boolean dfs(TreeNode root, int target){ if(root == null) return false; if(root.val == target) return true; return dfs(root.l...

2020-03-08 13:32:26 1267

原创 根据后序和中序遍历结果还原二叉树

我们知道通过先序和中序遍历结果可以还原一颗二叉树,那么相应的知道后序和和中序遍历结果也是可以还原一课二叉树的,往下看…在知道后序和中序遍历的原理之后,我们也可以反推出一颗树。思路:1)后序遍历的最后一位即是二叉树的根节点。2)然后再中序遍历找到根结点,根节点左边的所有序列便是左子树的中序遍历结果,右边的所有序列便是右子树中序遍历结果。3)在后序遍历中找到对应的左子树,右子树。4)在...

2020-03-08 13:15:01 5224

原创 根据先序和中序遍历结果还原二叉树

在java中如何存储一颗二叉树树呢,显然不能直接画上去对吧(滑稽) ,一般情况我们可以将先,中序的遍历结果风别用两个数组存储,在使用的时候将二叉树还原出来。但是如何还原出来呢?往下看…在知道先序和中序遍历的原理之后,我们便可以反推出一颗树。思路:1)先序遍历的第一位即是二叉树的根节点。2)然后再中序遍历找到根结点,根节点左边的所有序列便是左子树的中序遍历结果,右边的所有序列便是右子树中...

2020-03-08 12:19:19 1992

原创 二叉树的遍历(先,中,后)

一,构建二叉树封装二叉树结点/*** 二叉树结点*/public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int val, TreeNode left, TreeNode right) { this...

2020-03-08 11:07:43 137

原创 邻接链表的遍历

我们都知道邻接链表内部结构其实就是数组+链表构成的。大致如下图:在知道数组的遍历和链表的遍历之后,邻接链表的遍历自然也会了。构建邻接链表结构并遍历/** * 链表所需节点 */public class Node { public int val; public Node next; public Node(int val){...

2020-03-08 10:51:36 359

原创 Java如何实现整型大数加法?看这里

引言:在java中有时候数太大了,而一般的int , long 无法存储其值。更加无法进行运算。但是我们可以用字符串方式进行操作。上代码!!public static String add(String a, String b){ int ai = 1;//数a的倒数第i位 int bi = 1;//数b的倒数第i位 int flag =...

2020-03-07 16:40:50 285

原创 单例模式:饿汉式与懒汉式

一,单例模式单例模式的作用:对于某个类型,有时候该对象只需要一个,并且不想被任意创建多个,此时单例模式就起作用了,他能保证当前类对象有且只存在一个。单例模式的原理:1)当前类对象作为私有属性,并且为静态的。2)为了使类对象不能随意在外部程序被创建,此时需要使其构造方法设为私有。3)提供一个共有的静态方法用于获取作为属性的当前对象。单例模式的最常见加载模式:1)饿汉加载模...

2020-03-06 20:30:45 194

原创 Java-Swing窗体实现模拟驾考小程序

一,需求分析所需技术:需要知道如何使用Swing组件创建窗体,熟悉java se的基础知识,熟悉I/O读写,简单的分层思想,和面向对象的思想。具体要点:1),使用到Java SE的SWING来设计的模拟驾考小程序的窗口。2),采用简单的MVC分层思想,该小程序有用到MVC分层中的M以及V,Model层中主要有Dao负责数据持久化,Service负责处理业务逻辑,domain为实体...

2020-03-06 18:38:25 1306 6

原创 利用双栈实现队列结构

一,封装一个栈的简单结构栈的最重要的特点相信大家都懂叭 ,如何不太清楚的话可以参考一下: 戳它!.话不多说,上代码!!!/** * 用数组封装的队列结构 */ public class MyStack { int[] data; int top = 0; public MyStack(int size){ this.data...

2020-03-06 14:27:46 215

原创 使用java简单封装栈和队列结构

一,封装栈结构栈的结构特点是先进后出,使用数组就可以简单模拟其特点。利用数组实现:/** * 用数组封装的队列结构 */ public class MyStack { int[] data; int top = 0; public MyStack(int size){ this.data = new int[size]; ...

2020-03-05 21:57:34 351

原创 Java实现链表的逆置

一, 使用java实现单向链表封装Node节点:/** * 封装的链表结构 */ public class Node { public int val; public Node next; public Node(int val){ this.val = val; } }...

2020-03-05 18:13:04 370

原创 Java实现链表的求和

一, 使用java实现单向链表首先我们得了解链表的结构和特点:链表和数组同样都是用于存储多个数据的一种结构。java中,数组中的每一个数据在空间上都是连续的,在有的时候存在内存足够但是无法创建数组,因为内存中的空间不连续导致的,如下图:而链表却可以轻松创建,由于链表是中的每一个数据存储中是可以不连续的,每个节点一部分存储数据,另外一部分用于存储下一个节点的地址或者引用。从而实现结点的...

2020-03-05 17:50:03 921

原创 Http- Post/Get请求参数值最大限制问题

Http- Post/Get请求参数值最大限制问题网络编程都离不开Http的get/post请求。get请求没有协议体,只有协议头,请求的参数是直接拼接在url的后面。post有协议体也有协议头,参数值被解析成碎片存储在协议体中,获取是再按照相应的字符集还原参数值。在传参的时候往往会遇到参数值的长度限制问题,下面详细来分享一下个人对最大限制问题的介绍及解决方案。Http-Get请求对于...

2019-11-02 20:01:05 9248 1

空空如也

空空如也

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

TA关注的人

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