- 博客(34)
- 收藏
- 关注
原创 SpringBoot原生异步调用方法(线程池方法)
SpringBoot原生异步调用步骤在启动类或者是线程池配置类上添加@EnableAsync注解,表示启用异步处理在Configuration配置类里将线程池添加到IOC容器里(一般使用@Bean和@Qualifier这两个注解)在需要使用线程池异步调用的方法上添加@Aysnc注解,value值给之前在配置类里面定义的该Bean的名字.案例:(1)首先创建一个空的SpringBoot项目(2)然后配置类如下/** * <p> * description * </p&
2020-08-27 16:35:22
431
原创 Docker基础学习总结
自从实习过后好久没有没有再写过博客,今天趁着下班之前就写一篇关于Docker的一篇博文,当然范围有限,这仅仅只是我在部署公司微服务环境中遇到的。首先以个人理解解释下什么是Docker吧。通常情况下我们可能将MYSQL的服务装在本机或者是Linux虚拟机(服务器中),但是你想过没,如果在你本机装好的MYSQL上已经配置了相关的配置(比如说将默认的Latin编码跟改为utf-8),当你需要在另一台主机上部署同样的服务,那么你还需要进行相同的配置。可能一个开发中本机运行环境OK,并高兴的将他写的代码讲给了测试人
2020-07-25 09:57:12
189
原创 SpringBoot学习(一)
快有两周没有在CSDN上正儿八经的写博客了,既然已经找到了工作,之后我会写一写关于工作时框架方面的学习知识。SpringBoot整合Servlet首先在Idea中通过Spring Initializr的方式快速创建一个关于SpringBoot的应用(这个方式默认是需要联网的)。在学习JavaWeb中我们可以知道,Servlet其实就是一种服务器端开辟一个工作线程开处理客户端发过来的请求的过程,当我们使用SpringBoot来处理方式一:通过继承HttpServlet重写doGet()的方式实现对请求
2020-07-11 22:53:36
206
原创 Lock锁基本的使用
最近有些许考试和一场面试的打扰,写博客的速度大不如前。而且最近眼疾泛滥,电脑看的时长也减少了许多。我这眼睛只要看久了电子屏幕就会连续几天干涩困乏,难道我真的不适合IT行业?但我也不想沦落成为楼盘销售人员。Lock锁切入正题,在JDK1.5后,Java提供了既synchronized和wait()、notify()之后第三种可以实现多线程同步的方法。Lock锁相较之前多线程同步控制方法而言,使用更加了灵活,当然,“灵活”一词也代表了你需要掌握的东西需要更多。首先我们需要看一下ReentrantLock(
2020-06-29 22:00:56
846
原创 Java基础知识面试高频(2)
最近阴雨连绵,自然没什么好心情。想到今年秋招,不自然又焦虑几分。(一)面向对象与面向过程有什么区别?答:面向对象是指将数据和对数据的操作放在一起,作为一个相互依存的整体。而面向过程是以时间为中心的开发方法,自顶向下顺序执行,按照功能划分成若干模块。区别在于:1.出发点不同。面向对象方法强调的是将问题的要领映射到对象以及对象之间的接口上。面向过程方法强调的是过程的抽象话和模块化,以过程为中心构造处理问题。2.层次逻辑不同。面向对象方法是用类的结构层次来体现类之间的继承和发展。面向过程方法是用模块的结构
2020-06-20 13:24:13
115
原创 Java基础知识面试高频(1)
(1)Java语言有哪些优点1.Java语言是纯正的面向对象的语言,Everything is object。2.平台无关性。Java语言可以实现一次编译,到处运行。无论是Windows还是Linux等其他平台,只要对应的JVM版本的支持,都可以运行编译好的字节码文件。3.Java内置了许多的类库,通过这些类库,可以大大简化开发人员的开发工作。(比如对多线程的支持,对网络通信的支持,垃圾回收机制)。4.提供了对WEB应用开发的支持,例如Applet、Servlet和JSP。5.具有高效的安全性和健
2020-06-17 13:51:42
122
原创 概述SSM整合步骤(二)Spring和MyBatis的整合
上一篇博客介绍了Spring和SpringMVC的整合,这一篇介绍的是Spring和MyBatis的整合。之前编写MyBatis框架的需要自己设置一个mybatis-config.xml中去配置链接的数据库以及mapper中的Dao层映射文件,而Spring中可以使用SpringJDBC来实现数据库的链接。原始MyBatis中我们都是首先创建一个SqlSessionFactory对象,然后再创建一个SqlSession对象,然后通过getMapper()获取到实际的Dao层类的对象。(1)在appli
2020-06-15 22:25:47
200
1
原创 概述SSM整合步骤(一)Spring和SpringMVC的整合
对于Spring、SpringMVC、MyBatista着三大框架的整合,都是使用Spring作为沟通的桥梁来整合另外的两个框架。(一)SpringMVC与Spring的整合 一般来说,Spring是对Service和Dao层的控制的框架,而SpringMVC是对Controller等表现层控制的框架,提一下命名规则,对于Spring框架的配置文件通常我喜欢使用ApplicationContext.xml来命名,二对于SpringMVC这个框架我通常使用springmvc.xml来命名。 在框架整合之
2020-06-15 16:28:03
438
原创 Java面试日常归纳(2)
以下试题均来自牛客网(1)概括的解释下线程的几种可用状态?1.新建态(new):新创建了一个线程对象。2.可运行(runnable):线程对象创建后 ,其他线程中(比如main线程)调用了对象的start方法。该状态的线程就将位于可运行线程池中,具有可运行权,等待CPU的调度。3.运行态(running):可运行状态的线程获得了CPU时间片。4.阻塞状态(block):阻塞状态是指线程因为某种原因放弃了CPU使用权,暂时停止运行。直到线程进入可运行状态,才有机会再次得到CPU的调度。阻塞.
2020-06-15 10:22:01
91
原创 如何求数组中两两相加等于20的数
方法一:蛮力法直接双重循环数组拍判断两个数是否相加等于20,但是这种方法的时间复杂度是O(n^2)。方法二:排序法首先将数组进行有小到大排序,将设从前到后遍历的下标为begin,而从后到前遍历的下标是end。如果arr[begin]+arr[end] > 20,那么说明end需要–。相反,如果arr[begin]+arr[end] < 20, 那么begin++。如果正好等于20,那么begin和end都进行改变(原数组中没有相同的值)。代码实现:首先排序算法选用性能较好稳定的快速排序
2020-06-12 15:57:47
768
原创 Java面试日常归纳(1)
声明一下:以下的题目均来自牛客网摘录(1)什么是Java虚拟机?为什么Java被称为是平台无关的编程无言?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件能够被编译成能够被Java虚拟机执行的字节码文件。Java语言有一次编译,到处运行的特点。因为我们在Java编程的时候并不会像C语言一样考虑程序运行的环境是什么,Oracle早已经根据运行时系统的不同为我们提供了不同的JVM,同样的字节码在JVM上运行的效果是相同的,所以说Java被认为是“平台无关的编程语言”。(2).
2020-06-11 21:27:28
78
原创 如何求最大子数组之和
问题概述:有一个长度为n的数组,这n个元素可以使正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可以有多个这样连续的子数组,求子数组各个元素和的最大值。方法一:蛮力法找出所有子数组元素,进行求和,然后找到和的最大值public static int findSecond(int[] arr){ int n = arr.length; int thisSum= 0; int maxSum = 0; fo
2020-06-11 16:47:58
1499
原创 找出数组中最大值和最小值的集中常见方法
问题分解法把问题看做成两个独立的问题,即求最大值和求出最小值。所以需要经过两次遍历,比较的次数为2N。取单元素法维持两个变量min和max,min记录着最小值,max记录着最大值,每次取出一个数,将该数和min和max进行两次比较,只需要遍历一次的情况下就可以得到数组中的最大值和最小值。取双元素法位置两个变量min和max,每次取出两个数,首先比较取出的两个数,较大者和max进行比较,而较小者就和min进行比较。代码实现:public static void findMaxAndM
2020-06-11 15:47:13
772
转载 概述正则表达式
昨天在牛客网刷试题的时候有一道关于较复杂的正则表达式,一脸懵逼,所以想着今天总结整理一下。然后在GItHub上看了看,这篇不错:Github上关于正则表达式的介绍概述正则表达式(1)正则表达式是什么正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.(2)基本匹配正则表达式其实就是在执行搜索时的格式, 它由一些字母和数字组合而成. 例如: 一个正则表达式 the, 它表示一个规则: 由字母t开始,接着是h,再接着是e.“the” => The
2020-06-11 10:30:02
150
原创 位运算(判断一个数是否是2的n次方;如何求二进制数中1的个数)
如何判断一个数是否是2的n次方最直观思想是用1做移位操作代码实现: public static boolean isPower(int n){ int i=1; if (n < 1) return false; while (i <= n){ if (i == n){ return true; } i <<= 1;
2020-06-11 09:18:49
1152
1
原创 Java笔试日常归纳(1)
(1)在异常处理中,以下描述不正确的有(A) try块不可以省略(B)可以使用多重catch块(C) finally块可以省略(D)catch块和finally块可以同时省略这一题说实话我还百度了,真惭愧。选D,当你在Idea写出了一个try{}编译器回报一个错误:catch’ or ‘finally’ expected.。(2)以下对继承的描述错误的是()(A) Java中的继承允许一个子类继承多个父类(B) 父类更具有通用性,子类更具体(C)Java中的继承存在着传递性(D)
2020-06-10 22:08:47
819
原创 各种排序算法有什么优劣
直接上图–各种排序算法的性能表由表中数据可以得出的结论(1):简单的说,所有相等的元素在经过某种排序后依然能够保持排序之前的相对次序,那么就称这种排序是稳定的。上述稳定的排序算法有:直接插入排序,冒泡排序,归并排序。其他的都是不稳定排序算法。(2):时间复杂度为O(n)的排序算法有:直接选择排序,直接插入排序,冒泡排序,其它的都为O(logn)的时间复杂度。(3):虽然直接选择排序和冒泡排序的时间复杂度较高,但是当待排序序列基本有序的时候,他们的效率还是蛮高的。当初始序列基本有序或者局部有序的时候
2020-06-10 15:25:09
336
原创 概述希尔排序和堆排序
希尔排序希尔排序又称为缩小增量排序,其原理如下:先将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对每个子序列分别进行直接插入排序,待整个序列基本有序后,再对所有元素进行一次快速排序。希尔排序的步骤:选择一个步长序列:t1,t2,t3,t4,…,tk,满足ti > tj(i<j),tk=1;对于步长序列为k,对待排序序列进行k趟排序。每趟排序,根据对应步长ti,将待排序序列分割成ti个子序列,分别对各个子序列进行直接插入排序。注意:当步长为1的时候,所有
2020-06-10 14:59:08
449
原创 概述快速排序
快速排序是一种非常高效的排序算法,它采用了“分而治之”的思想,把大的拆分为小的,小的拆分为更小的。原理:对于一个给定的记录,通过一趟排序后,将原序列拆分为两个部分,其中前面一部分的所有记录均比后一部分的所有记录小,然后在依次对前后两部分的记录进行快速排序,递归该过程,直到序列中所有的记录均为有序为止。整个演示的过程:初始化关键字【49,38,65,97, 76,13,27,49】第一趟排序【27,38,13】,49,【76,97,65,49】第二趟排序【13】,27,【38】,49,【49
2020-06-10 11:32:18
132
原创 概述归并排序
归并排序是利用递归和分治思想将数据序列划分为越来越小的半子表,再对半子表进行排序,最后利用递归的方法将排好序的半子表合并成为越来越大的有序序列。代码实现:public static void merge(int[] array, int p, int q, int r) { int i, j, k, n1, n2; n1 = q - p + 1; n2 = r - q; int[] L = new int[n1]; int[
2020-06-10 10:39:51
120
原创 基础排序-选择冒泡插入
前言排序问题一直是计算机技术研究的重要问题,排序算法的好坏直接影响到程序的执行速度和辅助存储空间。其中衡量一个排序算法的好坏是通过时间复杂度和空间复杂度判断的。同一说明:待排序的序列是{38,65,97,13,27,49}选择排序基本思想:对于给定的一组待排序记录,经过第一轮比较后得到最小的记录,然后该记录和第一个记录进行位置交换;接着对不包括第一个记录外的其他记录进行第二轮比较,得到最小值和第二个值进行交换,重复上述过程,直到进行比较的记录只有最后一个为止。(0):{38,65,9
2020-06-09 21:34:06
74
原创 如何使用两个队列实现栈
在我的上一篇博客中实现了两个栈实现队列的功能采用两个栈实现队列功能使用两个队列实现栈实现思路分析:1)假设使用队列q1和队列q2模拟栈S,q1为入队列,q2为出队列。2)认为q1提供入队列的操作,使用q2提供出队列的操作。3)当需要入队列的时候,直接将数据压入q1栈中即可。4)当需要从队列中取出数据的时候,就需要分情况考虑了。5)若队列q1中只有一个元素,则直接让q1中元素出栈并输出。6)若队列q1中不止一个元素,那么将q1中的元素弹出至q2直到q1中只剩下一个元素为止,然后弹出q1中的元
2020-06-09 17:03:59
236
原创 如何使用两个栈来模拟队列
栈或者队列代码需要实现的功能其实不论是栈还是队列,都必须实现:添加、删除、查看队尾(栈顶)元素、判断队列(栈)是否为空等基本的功能。实现思路:1)假设两个栈分别是栈A和栈B,栈A为插入栈,栈B为弹出栈,实现队列Q。2)对于向队列中添加值,只需要向栈A中添加即可3)要实现从队列中取出数据的操作,就需要根据栈B中是否存在元素来进行分条件操作。4)如果栈B中存在元素,直接弹出。5)如果栈B中不存在元素,依次从栈A中弹出元素放置在栈B中,再弹出栈B中元素。代码实现:public class
2020-06-09 16:44:22
188
原创 自己如何实现Java队列
同我之前写的博客–有关栈的实现一样,队列的实现也有两种方式。方式一:基于链表实现代码:public class LinkQueue<E> { private Node<E> head = null; private Node<E> tail = null; public boolean isEmpty() { return head == tail; } public void add(E data) {
2020-06-09 16:11:26
99
原创 利用O(1)时间复杂度求栈中最小元素
对于栈实现的两种方式,大家可以看我之前写的一篇博客数组或链表实现栈结构利用O(1)时间复杂度求栈中最小元素基本思想既然题目要求是O(1)的时间复杂度,那么肯定不能采取遍历Stack全部弹出比较的方法,那样的时间复杂度为o(n)在程序设计中,我们很多时候都是采用用空间换取时间实现的时候使用两个栈结构,一个栈用来存储数据,另一个栈使用栈顶存储栈的最小值。思路:如果当前入栈元素比原先栈顶元素小,就把当前元素入栈。在求栈中最小元素的时候,直接将这个栈的栈顶元素返回,这个就是最小元素。代码实现:
2020-06-09 10:30:29
258
原创 实现栈的两种方式--数组链表
方式一:数组实现代码:public class ArrayStack { private Object[] stack; private int size;//存储元素的个数 public ArrayStack() { stack = new Object[2]; } //判断栈是否为空 public boolean isEmpty(){ return size==0; } //栈顶查看数据 p
2020-06-09 09:57:15
105
原创 如何检测一个单链表有环并找出环入口点
解决方法:定义两个指针fast和slow,其中,fast是快指针,slow是慢指针,二者的初始值都指向链表头,slow指针每次前进一步,fast指针每次前进两步,两个指针同时向前移动,快指针移动一次都需要和慢指针进行比较,直到相同位置,就可以证明链表是带环的单链表。public boolean isLoop(Node head){ Node fast = head; Node slow = head; if (fast == null){
2020-06-08 22:19:53
262
原创 如何快速的找到单链表的中间节点
方法一最简单想到的就是首先遍历单链表获取到链表的长度,然后计算出长度的一半是多少,然后再从头遍历,找到中间节点缺点:需要遍历两次链表,繁琐。方法二如果是双链表,可以首位并行,相遇的节点就是中间节点。类似于双链表,单链表寻找中间节点可以使用两个指针都指向头部,一个指针每一次走一步,一个指针每一次走两步,移动快速的指针走到表尾的时候,那么慢指针刚好走到中间节点。代码:public Node searchMid(Node head){ Node p = head; Nod
2020-06-08 16:52:50
1763
4
原创 如何从尾到头逆序打印单链表
方法一首先将原链表反转逆序,然后在顺序打印缺点:需要额外的操作,复杂方法二首先顺序遍历单链表,把节点信息保存在Stack中,然后一个一个弹出缺点:需要额外的栈空间,实现起来麻烦方法三递归的本质就是栈结构,自然可以用递归的方式来实现反向输出单链表代码:public void printListReversely(Node head) { if (head != null) { printListReversely(head.next); S
2020-06-08 16:38:50
194
原创 如何找出单链表中倒数第K个元素
第一种方法为了找出单链表的倒数第K个元素,需要知道这个单链表的长度是多少,就是需要遍历一遍这个单链表,长度为n,倒数第k个,就是单链表的第(n-k)个元素public Node findLastK(Node head, int k){ Node pNode = head; int n=0; while (pNode.next != null){ n++; pNode = pNode.next;
2020-06-08 15:36:08
5248
原创 如何实现链表的反转
为了正确的反转一个链表,需要调整指针的指向(Java中并不存在指针的概念,而是使用与之相似的引用来表示,这里用指针来代替引用)举例查看具体的反转过程:例如,i,m, n是三个相邻的节点,假设经过若干步操作,已经把节点i之前的指针已经调整完毕,这些指针的next域都指向前面一个节点。现在遍历到节点m,当然需要调整它的next域使它指向i。但是这里需要值得注意的是,一旦调整了m指针所指的对象,那么这个链会断开,导致后面节点消失无法访问到,这是因为没有指针指向节点n。所以为了避免链的断裂,在调整m的ne
2020-06-08 15:00:08
375
原创 如何从链表中删除重复元素
如何从链表中删除重复元素,最简单的就是遍历链表,将各个节点的信息保存在Hashtable中,若当前访问的值在Hashtable中已经存在,则说明这个数据是重复的,因此就可以删除。具体实现的代码如下:public void deleteDuplecate(Node head){ Hashtable<Integer, Integer> table = new Hashtable<>(); Node tmp = head; Node pre
2020-06-08 11:49:56
821
原创 如何实现单链表的增删操作
如何实现单链表的增删操作单链表的概念链表存储特点Java语言中,如下的数据类来实现存储节点的信息单链表的插入操作单链表的删除操作下面链表操作实例给出了链表的具体操作运行结果单链表的概念当节点只包含其后继节点的信息的链表就被称为单链表。链表存储特点可以使用任意一组存储单元来存储单链表中的数据元素(存储单元可以是不连续的),而且除了存储每个数据元素的ai的值外,还必须存储只是其后继元素的信息。Java语言中,如下的数据类来实现存储节点的信息class Node { Node next = null
2020-06-07 22:13:02
244
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人